mastracode 0.31.0-alpha.9 → 0.31.1-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.
- package/CHANGELOG.md +118 -0
- package/dist/cli.cjs +9 -3
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/package.json +14 -14
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,123 @@
|
|
|
1
1
|
# mastracode
|
|
2
2
|
|
|
3
|
+
## 0.31.1-alpha.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Fixed Mastra Code repeatedly prompting users to install the version they already have. ([#19464](https://github.com/mastra-ai/mastra/pull/19464))
|
|
8
|
+
|
|
9
|
+
- Updated dependencies [[`8a0d145`](https://github.com/mastra-ai/mastra/commit/8a0d145aadbdf7278665aceaaec364b35dd9bd94), [`bd2f1d2`](https://github.com/mastra-ai/mastra/commit/bd2f1d274d05e60e2366f005ea0d94d5cea0d5ff), [`21a0eb8`](https://github.com/mastra-ai/mastra/commit/21a0eb86746ba0b703acea360d4f84c6a5a493f2), [`de86fd7`](https://github.com/mastra-ai/mastra/commit/de86fd7119f0438381d1a642e3d258143c0b9c29), [`2745031`](https://github.com/mastra-ai/mastra/commit/2745031d1d4a4978f037092da371428c32e2842a), [`db650ce`](https://github.com/mastra-ai/mastra/commit/db650ce490348914e85b93651d83acdf8f2a4c31), [`6354eeb`](https://github.com/mastra-ai/mastra/commit/6354eeb32efa9f5f68f51dda394e90e2ee76f1fb), [`13d2d44`](https://github.com/mastra-ai/mastra/commit/13d2d4476d78ce1aaede10dc83fb64108c9b9d82), [`21a0eb8`](https://github.com/mastra-ai/mastra/commit/21a0eb86746ba0b703acea360d4f84c6a5a493f2)]:
|
|
10
|
+
- @mastra/core@1.51.1-alpha.0
|
|
11
|
+
- @mastra/stagehand@0.3.1-alpha.0
|
|
12
|
+
- @mastra/memory@1.23.1-alpha.0
|
|
13
|
+
- @mastra/code-sdk@0.1.1-alpha.0
|
|
14
|
+
|
|
15
|
+
## 0.31.0
|
|
16
|
+
|
|
17
|
+
### Minor Changes
|
|
18
|
+
|
|
19
|
+
- Added storage retention and a new `/prune` command to keep the local database from growing without bound. ([#19059](https://github.com/mastra-ai/mastra/pull/19059))
|
|
20
|
+
|
|
21
|
+
**Default retention policies** are now applied to Mastra Code storage: chat messages and threads are kept for 90 days, observability spans and logs for 14 days, scores and workflow snapshots for 30 days. Rows older than these limits are only removed when you run `/prune` — nothing is deleted automatically.
|
|
22
|
+
|
|
23
|
+
**New `/prune` command:**
|
|
24
|
+
- `/prune` closes the TUI, hands the terminal over to a maintenance run that deletes rows older than the retention policies with live progress output, then exits (start `mastracode` again for a new session)
|
|
25
|
+
- `/prune vacuum` additionally compacts local libsql database files to return the freed space to your disk, and reports the reclaimed size. Compaction streams a `VACUUM INTO` copy and swaps it into place — bounded memory and no WAL growth even on multi-GB databases — and refuses to start without enough free disk space for the copy
|
|
26
|
+
- `/prune keep-memory` skips chat history (messages and threads) so conversations are preserved for later use (fine-tuning, evals) while telemetry and run records are still deleted. Flags combine in any order, e.g. `/prune vacuum keep-memory`
|
|
27
|
+
- Compaction proves it has exclusive access to each database file before swapping. If another Mastra Code session still has the file open, `/prune vacuum` refuses with a clear message instead of silently orphaning that session's writes
|
|
28
|
+
|
|
29
|
+
Maintenance runs outside the TUI so retention deletes and `VACUUM` never contend with a live session for the database.
|
|
30
|
+
|
|
31
|
+
Also, when local tracing is disabled, observability data is no longer written to the libsql database at all.
|
|
32
|
+
|
|
33
|
+
### Patch Changes
|
|
34
|
+
|
|
35
|
+
- Fixed TUI height corruption caused by unsanitized ANSI escape codes in tool output. pi-tui's extractAnsiCode() only handles CSI sequences ending with m/G/K/H/J; other terminators (cursor movement, mode switches) caused the scanner to swallow subsequent visible text, making visibleWidth() undercount and collapsing the TUI to a few rows. Added sanitizeAnsiForRendering() to strip non-SGR CSI sequences at all content entry points. Also improved terminal cleanup on exit to prevent Kitty keyboard protocol from leaking (5;99~ codes). ([#18735](https://github.com/mastra-ai/mastra/pull/18735))
|
|
36
|
+
|
|
37
|
+
- Improved Mastra Code responsiveness while tool inputs and command output stream. ([#19376](https://github.com/mastra-ai/mastra/pull/19376))
|
|
38
|
+
|
|
39
|
+
- Renamed the gateway setup confirmation messages to say "Gateway" instead of "Memory gateway" and added `/gateway` as an alias for the existing `/memory-gateway` setup command. ([#18691](https://github.com/mastra-ai/mastra/pull/18691))
|
|
40
|
+
|
|
41
|
+
- dependencies updates: ([#16699](https://github.com/mastra-ai/mastra/pull/16699))
|
|
42
|
+
- Updated dependency [`@ai-sdk/amazon-bedrock@^3.0.105` ↗︎](https://www.npmjs.com/package/@ai-sdk/amazon-bedrock/v/3.0.105) (from `^3.0.102`, in `dependencies`)
|
|
43
|
+
- Updated dependency [`@ai-sdk/anthropic@^3.0.92` ↗︎](https://www.npmjs.com/package/@ai-sdk/anthropic/v/3.0.92) (from `^3.0.82`, in `dependencies`)
|
|
44
|
+
- Updated dependency [`@ai-sdk/openai@^3.0.80` ↗︎](https://www.npmjs.com/package/@ai-sdk/openai/v/3.0.80) (from `^3.0.63`, in `dependencies`)
|
|
45
|
+
- Updated dependency [`@ai-sdk/openai-compatible@^2.0.56` ↗︎](https://www.npmjs.com/package/@ai-sdk/openai-compatible/v/2.0.56) (from `^2.0.47`, in `dependencies`)
|
|
46
|
+
- Updated dependency [`ai@^6.0.219` ↗︎](https://www.npmjs.com/package/ai/v/6.0.219) (from `^6.0.176`, in `dependencies`)
|
|
47
|
+
|
|
48
|
+
- dependencies updates: ([#19385](https://github.com/mastra-ai/mastra/pull/19385))
|
|
49
|
+
- Updated dependency [`@ai-sdk/anthropic@^3.0.96` ↗︎](https://www.npmjs.com/package/@ai-sdk/anthropic/v/3.0.96) (from `^3.0.92`, in `dependencies`)
|
|
50
|
+
- Updated dependency [`@ai-sdk/openai@^3.0.84` ↗︎](https://www.npmjs.com/package/@ai-sdk/openai/v/3.0.84) (from `^3.0.80`, in `dependencies`)
|
|
51
|
+
- Updated dependency [`@ai-sdk/openai-compatible@^2.0.59` ↗︎](https://www.npmjs.com/package/@ai-sdk/openai-compatible/v/2.0.59) (from `^2.0.56`, in `dependencies`)
|
|
52
|
+
- Updated dependency [`ai@^6.0.224` ↗︎](https://www.npmjs.com/package/ai/v/6.0.224) (from `^6.0.219`, in `dependencies`)
|
|
53
|
+
|
|
54
|
+
- Improved Observational Memory settings by adding the `/memory` command and clarifying what each token setting counts. ([#19293](https://github.com/mastra-ai/mastra/pull/19293))
|
|
55
|
+
|
|
56
|
+
- Fixed terminal output reflow and slash command input alignment when resizing. ([#19198](https://github.com/mastra-ai/mastra/pull/19198))
|
|
57
|
+
|
|
58
|
+
- Publish the Mastra Code agent core as `@mastra/code-sdk` (previously the internal `@internal/mastracode` package), so third parties can build their own UIs and surfaces on top of the Mastra Code coding agent. The `mastracode` CLI now consumes it as a regular runtime dependency instead of bundling it into its published output. ([#18986](https://github.com/mastra-ai/mastra/pull/18986))
|
|
59
|
+
|
|
60
|
+
- Fixed the /login command changing your active model and model pack. Logging in to a provider now keeps your current model selection; the provider default is only auto-selected during onboarding or when no model has been chosen yet. ([#19250](https://github.com/mastra-ai/mastra/pull/19250))
|
|
61
|
+
|
|
62
|
+
- Improved Mastra Code web interface state handling without changing behavior. ([#19107](https://github.com/mastra-ai/mastra/pull/19107))
|
|
63
|
+
|
|
64
|
+
- Simplified the observational memory context indicator in the TUI footer. ([#19260](https://github.com/mastra-ai/mastra/pull/19260))
|
|
65
|
+
|
|
66
|
+
- Updated dependencies [[`bd6d240`](https://github.com/mastra-ai/mastra/commit/bd6d2402db93dddaef0721667e7e8a030e7c6e16), [`96a3749`](https://github.com/mastra-ai/mastra/commit/96a37492235f5b8076b3e3177d83ed5a5e44a640), [`bd6d240`](https://github.com/mastra-ai/mastra/commit/bd6d2402db93dddaef0721667e7e8a030e7c6e16), [`0111486`](https://github.com/mastra-ai/mastra/commit/01114867612593eef5cfa2fda6a1194dfedda841), [`96a3749`](https://github.com/mastra-ai/mastra/commit/96a37492235f5b8076b3e3177d83ed5a5e44a640), [`fe1bda0`](https://github.com/mastra-ai/mastra/commit/fe1bda06f6af92a694a51712db747cda1e7185f0), [`25e7c12`](https://github.com/mastra-ai/mastra/commit/25e7c126a770069ae7fb7ecf1d2adb40e017b009), [`1ce5121`](https://github.com/mastra-ai/mastra/commit/1ce512155d122bb21f47d98383e82ffbf84b39e8), [`fb8aea3`](https://github.com/mastra-ai/mastra/commit/fb8aea384291e77311be3a64ee1717320d5c3c73), [`4adc391`](https://github.com/mastra-ai/mastra/commit/4adc3911075249c352bb4832d2471922826344de), [`a5c6337`](https://github.com/mastra-ai/mastra/commit/a5c6337d23c7686c81a32ce62f550f610543a240), [`031931a`](https://github.com/mastra-ai/mastra/commit/031931a715405fb90759b1903c9c25cbf05994af), [`3cfc47a`](https://github.com/mastra-ai/mastra/commit/3cfc47a6b89940aadd0f46fb01ae9624a73a865d), [`eb70da9`](https://github.com/mastra-ai/mastra/commit/eb70da98e1007b18e1463d75121bc07db55f8e09), [`2bb7817`](https://github.com/mastra-ai/mastra/commit/2bb78176112fde628483de2830528f7eee911e56), [`51d9870`](https://github.com/mastra-ai/mastra/commit/51d987032c689c2855374d0f244f5d654da809d1), [`5cab274`](https://github.com/mastra-ai/mastra/commit/5cab2744250e22d12fefa7b32637dce224233cee), [`7fa27d3`](https://github.com/mastra-ai/mastra/commit/7fa27d3b6f5ed68cd34e454a4d3ad9c482a0cfbc), [`8b97958`](https://github.com/mastra-ai/mastra/commit/8b979589f9aa59ba67cac565949475f2ffeb4ac3), [`8410541`](https://github.com/mastra-ai/mastra/commit/84105412c60ecd3bb33a9838146f59c4b588228f), [`ce16147`](https://github.com/mastra-ai/mastra/commit/ce16147c0dffb34d5df4602607e4b34349fbf547), [`a58dcbb`](https://github.com/mastra-ai/mastra/commit/a58dcbb546d7e1d65ebdc1f39e55f0908fcd9391), [`aa38805`](https://github.com/mastra-ai/mastra/commit/aa38805b878b827403be785eb90688d7172f5a40), [`153bd3b`](https://github.com/mastra-ai/mastra/commit/153bd3b396bdfed6b74cf43de12db8fd2d83c04a), [`45a8e65`](https://github.com/mastra-ai/mastra/commit/45a8e65e1556d1362cb3f25187023c36de26661d), [`e955965`](https://github.com/mastra-ai/mastra/commit/e955965dce575a903e37cf054d28ea99aa48785e), [`bc1121a`](https://github.com/mastra-ai/mastra/commit/bc1121a7bb98f7cd73e82e3a7913a667a9fa9911), [`2d22570`](https://github.com/mastra-ai/mastra/commit/2d22570c7dfdd02123d0ecc529efb05ccba2d9fc), [`07bb863`](https://github.com/mastra-ai/mastra/commit/07bb8631919c6f7cf377dccd45b096e0f17fbed0), [`171c3a2`](https://github.com/mastra-ai/mastra/commit/171c3a23f36199ad1354166fb515b22b57f310c2), [`c8ed116`](https://github.com/mastra-ai/mastra/commit/c8ed11699f62bcac70102ab4ec84d80d20541da6), [`ae510ef`](https://github.com/mastra-ai/mastra/commit/ae510ef404f760d1b34eb25e99d5e6a9e9fcbdba), [`01b338c`](https://github.com/mastra-ai/mastra/commit/01b338c56271f0219606710e3e8b26dee27ac6c2), [`0cf3826`](https://github.com/mastra-ai/mastra/commit/0cf38268cee1913d1292d7d917c76744ea2aee6c), [`bd4d720`](https://github.com/mastra-ai/mastra/commit/bd4d720458e42c49b6829c4662812332be32cfcf), [`aac3e5a`](https://github.com/mastra-ai/mastra/commit/aac3e5a098b08077c7d5020d782d6353b217797c), [`a99eae8`](https://github.com/mastra-ai/mastra/commit/a99eae8908e500c1b2d12f9d277be616b98617a5), [`860ef7e`](https://github.com/mastra-ai/mastra/commit/860ef7e77d92b63469cbe5857aa1e626197e43e9), [`17e818c`](https://github.com/mastra-ai/mastra/commit/17e818c51a958ba90641b1a959dc38faf8c034e9), [`edce8d2`](https://github.com/mastra-ai/mastra/commit/edce8d2769f19e27a05737c627af2d765472a4f8), [`4451dfe`](https://github.com/mastra-ai/mastra/commit/4451dfe857428e7abcc0261a507a2e186dae6d47), [`8a586ec`](https://github.com/mastra-ai/mastra/commit/8a586eca9a4914f31dff6140d0d45ac375b00669), [`4451dfe`](https://github.com/mastra-ai/mastra/commit/4451dfe857428e7abcc0261a507a2e186dae6d47), [`8b7361d`](https://github.com/mastra-ai/mastra/commit/8b7361d35de68b80d05d30a74e0c69e7218fd612), [`c3a6638`](https://github.com/mastra-ai/mastra/commit/c3a6638c791ab839c52a3250ba90420c6259ae56), [`1d39058`](https://github.com/mastra-ai/mastra/commit/1d39058e548efd691799985d5c8af2737f1c3bd2), [`3927473`](https://github.com/mastra-ai/mastra/commit/392747323ddb10c643d12be7b9ae913159dfaeed), [`fd13f8e`](https://github.com/mastra-ai/mastra/commit/fd13f8e21990f9904c3eedba3a626bb4a929cdb8), [`dce50dc`](https://github.com/mastra-ai/mastra/commit/dce50dc9a1c1fcd0f427bb5f6250ec74910cb04b), [`dce50dc`](https://github.com/mastra-ai/mastra/commit/dce50dc9a1c1fcd0f427bb5f6250ec74910cb04b), [`85fb642`](https://github.com/mastra-ai/mastra/commit/85fb642f4d112d0da9f39808617397f7e47fe622), [`6789ab4`](https://github.com/mastra-ai/mastra/commit/6789ab4191ddcd32a932898b360b191e80cee1a9), [`fd13f8e`](https://github.com/mastra-ai/mastra/commit/fd13f8e21990f9904c3eedba3a626bb4a929cdb8), [`634caff`](https://github.com/mastra-ai/mastra/commit/634caff29a9200ad058b67d53f96d9e5832fb8a2), [`e405085`](https://github.com/mastra-ai/mastra/commit/e405085fa8ee5ea07670b8d2b62b2376c0e0e414), [`f703f87`](https://github.com/mastra-ai/mastra/commit/f703f878de072d51fda557f9c50867d8252bef05), [`5ad8d04`](https://github.com/mastra-ai/mastra/commit/5ad8d045d2f0363690f9752180e0934beca9f33a), [`481c112`](https://github.com/mastra-ai/mastra/commit/481c1125b752489673ec671fcb7ca80f9c86ffb1), [`c43f3a9`](https://github.com/mastra-ai/mastra/commit/c43f3a9d1efde99b38789364ba4d0ba670f430e3), [`2eb656e`](https://github.com/mastra-ai/mastra/commit/2eb656ecb64671d4a95e3c94bf507ce6a0ef9e3b), [`3e26c87`](https://github.com/mastra-ai/mastra/commit/3e26c87de0c5bc2583b795ce6ca5889b6b161acb), [`8a586ec`](https://github.com/mastra-ai/mastra/commit/8a586eca9a4914f31dff6140d0d45ac375b00669), [`33f2b88`](https://github.com/mastra-ai/mastra/commit/33f2b88842c09a567f906fac4cb61cd5277ced59), [`0ad646f`](https://github.com/mastra-ai/mastra/commit/0ad646f71a530f2454664299e5e01bfd13fa12e5), [`177010f`](https://github.com/mastra-ai/mastra/commit/177010ff096d2e4b28d89803be5b1a4cad2a0d6b), [`0ad646f`](https://github.com/mastra-ai/mastra/commit/0ad646f71a530f2454664299e5e01bfd13fa12e5), [`b486abf`](https://github.com/mastra-ai/mastra/commit/b486abfa2a7528c6f527e4015c819ea9fa54aaad), [`54a51e0`](https://github.com/mastra-ai/mastra/commit/54a51e0a484fe1ebad3fb1f7ef5282a075709eb7), [`c43f3a9`](https://github.com/mastra-ai/mastra/commit/c43f3a9d1efde99b38789364ba4d0ba670f430e3), [`a5008f2`](https://github.com/mastra-ai/mastra/commit/a5008f22ae710ad9402ea9f2547d8c02f74d384b), [`e2d5f37`](https://github.com/mastra-ai/mastra/commit/e2d5f373bd289be534d5f8694d34465010533df6), [`1b6e676`](https://github.com/mastra-ai/mastra/commit/1b6e67613c2a019df5920d4273d79bed09555807), [`4ce0163`](https://github.com/mastra-ai/mastra/commit/4ce0163dc86e675a86809685c8ce6c49f1aeb87e), [`4378341`](https://github.com/mastra-ai/mastra/commit/43783412df5ea3dd35f5b1f6e4851e79c346fc89)]:
|
|
67
|
+
- @mastra/code-sdk@0.1.0
|
|
68
|
+
- @mastra/core@1.51.0
|
|
69
|
+
- @mastra/memory@1.23.0
|
|
70
|
+
- @mastra/mcp@1.14.0
|
|
71
|
+
- @mastra/schema-compat@1.3.4
|
|
72
|
+
- @mastra/observability@1.16.1
|
|
73
|
+
- @mastra/pg@1.16.0
|
|
74
|
+
- @mastra/libsql@1.16.0
|
|
75
|
+
|
|
76
|
+
## 0.31.0-alpha.14
|
|
77
|
+
|
|
78
|
+
### Patch Changes
|
|
79
|
+
|
|
80
|
+
- Updated dependencies [[`a99eae8`](https://github.com/mastra-ai/mastra/commit/a99eae8908e500c1b2d12f9d277be616b98617a5), [`fd13f8e`](https://github.com/mastra-ai/mastra/commit/fd13f8e21990f9904c3eedba3a626bb4a929cdb8), [`fd13f8e`](https://github.com/mastra-ai/mastra/commit/fd13f8e21990f9904c3eedba3a626bb4a929cdb8), [`f703f87`](https://github.com/mastra-ai/mastra/commit/f703f878de072d51fda557f9c50867d8252bef05), [`0ad646f`](https://github.com/mastra-ai/mastra/commit/0ad646f71a530f2454664299e5e01bfd13fa12e5), [`0ad646f`](https://github.com/mastra-ai/mastra/commit/0ad646f71a530f2454664299e5e01bfd13fa12e5)]:
|
|
81
|
+
- @mastra/core@1.51.0-alpha.13
|
|
82
|
+
- @mastra/pg@1.16.0-alpha.0
|
|
83
|
+
- @mastra/libsql@1.16.0-alpha.1
|
|
84
|
+
- @mastra/code-sdk@0.1.0-alpha.13
|
|
85
|
+
|
|
86
|
+
## 0.31.0-alpha.13
|
|
87
|
+
|
|
88
|
+
### Patch Changes
|
|
89
|
+
|
|
90
|
+
- Updated dependencies [[`ce16147`](https://github.com/mastra-ai/mastra/commit/ce16147c0dffb34d5df4602607e4b34349fbf547), [`aa38805`](https://github.com/mastra-ai/mastra/commit/aa38805b878b827403be785eb90688d7172f5a40), [`2d22570`](https://github.com/mastra-ai/mastra/commit/2d22570c7dfdd02123d0ecc529efb05ccba2d9fc), [`4378341`](https://github.com/mastra-ai/mastra/commit/43783412df5ea3dd35f5b1f6e4851e79c346fc89)]:
|
|
91
|
+
- @mastra/code-sdk@0.1.0-alpha.12
|
|
92
|
+
- @mastra/core@1.51.0-alpha.12
|
|
93
|
+
|
|
94
|
+
## 0.31.0-alpha.12
|
|
95
|
+
|
|
96
|
+
### Patch Changes
|
|
97
|
+
|
|
98
|
+
- Updated dependencies [[`45a8e65`](https://github.com/mastra-ai/mastra/commit/45a8e65e1556d1362cb3f25187023c36de26661d), [`c8ed116`](https://github.com/mastra-ai/mastra/commit/c8ed11699f62bcac70102ab4ec84d80d20541da6), [`33f2b88`](https://github.com/mastra-ai/mastra/commit/33f2b88842c09a567f906fac4cb61cd5277ced59)]:
|
|
99
|
+
- @mastra/core@1.51.0-alpha.11
|
|
100
|
+
- @mastra/code-sdk@0.1.0-alpha.11
|
|
101
|
+
|
|
102
|
+
## 0.31.0-alpha.11
|
|
103
|
+
|
|
104
|
+
### Patch Changes
|
|
105
|
+
|
|
106
|
+
- Updated dependencies [[`4adc391`](https://github.com/mastra-ai/mastra/commit/4adc3911075249c352bb4832d2471922826344de), [`171c3a2`](https://github.com/mastra-ai/mastra/commit/171c3a23f36199ad1354166fb515b22b57f310c2), [`b486abf`](https://github.com/mastra-ai/mastra/commit/b486abfa2a7528c6f527e4015c819ea9fa54aaad)]:
|
|
107
|
+
- @mastra/core@1.51.0-alpha.10
|
|
108
|
+
- @mastra/schema-compat@1.3.4-alpha.2
|
|
109
|
+
- @mastra/code-sdk@0.1.0-alpha.10
|
|
110
|
+
- @mastra/mcp@1.14.0-alpha.0
|
|
111
|
+
- @mastra/memory@1.23.0-alpha.4
|
|
112
|
+
|
|
113
|
+
## 0.31.0-alpha.10
|
|
114
|
+
|
|
115
|
+
### Patch Changes
|
|
116
|
+
|
|
117
|
+
- Updated dependencies [[`edce8d2`](https://github.com/mastra-ai/mastra/commit/edce8d2769f19e27a05737c627af2d765472a4f8)]:
|
|
118
|
+
- @mastra/core@1.51.0-alpha.9
|
|
119
|
+
- @mastra/code-sdk@0.1.0-alpha.9
|
|
120
|
+
|
|
3
121
|
## 0.31.0-alpha.9
|
|
4
122
|
|
|
5
123
|
### Patch Changes
|
package/dist/cli.cjs
CHANGED
|
@@ -12,12 +12,18 @@ var scaffold = require('@mastra/code-sdk/plugins/scaffold');
|
|
|
12
12
|
var debugLog = require('@mastra/code-sdk/utils/debug-log');
|
|
13
13
|
var stdinPipe = require('@mastra/code-sdk/utils/stdin-pipe');
|
|
14
14
|
var threadLock = require('@mastra/code-sdk/utils/thread-lock');
|
|
15
|
-
var updateCheck = require('@mastra/code-sdk/utils/update-check');
|
|
16
15
|
|
|
17
16
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
18
17
|
|
|
19
18
|
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
20
19
|
|
|
20
|
+
function getCurrentVersion() {
|
|
21
|
+
{
|
|
22
|
+
return "0.31.1-alpha.0";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// src/main.ts
|
|
21
27
|
var controller;
|
|
22
28
|
var mcpManager;
|
|
23
29
|
var hookManager;
|
|
@@ -88,7 +94,7 @@ async function tuiMain(pipedInput) {
|
|
|
88
94
|
}
|
|
89
95
|
chunkFWMMMQLI_cjs.applyThemeMode(themeMode, detectedBgHex);
|
|
90
96
|
const session = result.session;
|
|
91
|
-
analytics = analytics$1.createMastraCodeAnalytics({ version:
|
|
97
|
+
analytics = analytics$1.createMastraCodeAnalytics({ version: getCurrentVersion() });
|
|
92
98
|
analytics.capture("mastracode_session_started", {
|
|
93
99
|
mode: session.mode.get(),
|
|
94
100
|
resourceId: session.identity.getResourceId(),
|
|
@@ -106,7 +112,7 @@ async function tuiMain(pipedInput) {
|
|
|
106
112
|
pluginManager: result.pluginManager,
|
|
107
113
|
storageMaintenance: result.storageMaintenance,
|
|
108
114
|
appName: "Mastra Code",
|
|
109
|
-
version:
|
|
115
|
+
version: getCurrentVersion(),
|
|
110
116
|
inlineQuestions: true,
|
|
111
117
|
githubSignals: result.githubSignals,
|
|
112
118
|
...pipedInput ? { initialMessage: `The following was piped via stdin:
|
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/main.ts"],"names":["isStreamDestroyedError","settings","loadSettings","createBrowserFromSettings","createMastraCode","setupDebugLogging","detectTerminalTheme","applyThemeMode","createMastraCodeAnalytics","getCurrentVersion","MastraTUI","releaseAllThreadLocks","restoreTerminalForeground","scaffoldPlugin","formatScaffoldSuccess","msg","fs","hasHeadlessFlag","runMCCli","drainPipedStdin","reopenStdinFromTTY"],"mappings":"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","file":"cli.cjs","sourcesContent":["#!/usr/bin/env node\n/**\n * Main entry point for Mastra Code TUI.\n */\nimport fs from 'node:fs';\n\nimport { createMastraCode } from '@mastra/code-sdk';\nimport { createMastraCodeAnalytics } from '@mastra/code-sdk/analytics';\nimport { isStreamDestroyedError } from '@mastra/code-sdk/error-classification';\nimport { hasHeadlessFlag, runMCCli } from '@mastra/code-sdk/headless/index';\nimport { createBrowserFromSettings, loadSettings } from '@mastra/code-sdk/onboarding/settings';\nimport { formatScaffoldSuccess, scaffoldPlugin } from '@mastra/code-sdk/plugins/scaffold';\nimport { setupDebugLogging } from '@mastra/code-sdk/utils/debug-log';\nimport { drainPipedStdin, reopenStdinFromTTY } from '@mastra/code-sdk/utils/stdin-pipe';\nimport { releaseAllThreadLocks } from '@mastra/code-sdk/utils/thread-lock';\nimport { getCurrentVersion } from '@mastra/code-sdk/utils/update-check';\nimport { detectTerminalTheme } from './tui/detect-theme.js';\nimport { MastraTUI } from './tui/index.js';\nimport { applyThemeMode, restoreTerminalForeground } from './tui/theme.js';\n\nlet controller: Awaited<ReturnType<typeof createMastraCode>>['controller'];\nlet mcpManager: Awaited<ReturnType<typeof createMastraCode>>['mcpManager'];\nlet hookManager: Awaited<ReturnType<typeof createMastraCode>>['hookManager'];\nlet authStorage: Awaited<ReturnType<typeof createMastraCode>>['authStorage'];\nlet signalsPubSub: Awaited<ReturnType<typeof createMastraCode>>['signalsPubSub'];\nlet analytics: ReturnType<typeof createMastraCodeAnalytics> | undefined;\nlet tui: MastraTUI | undefined;\n\nfunction isTruthyEnv(name: string): boolean {\n return ['1', 'true', 'yes', 'on'].includes(process.env[name]?.trim().toLowerCase() ?? '');\n}\n\nfunction resolveInitialStateFromEnv() {\n const currentModelId = process.env.MASTRACODE_MODEL_ID?.trim();\n const initialState: Record<string, unknown> = {};\n if (currentModelId) initialState.currentModelId = currentModelId;\n if (isTruthyEnv('MASTRACODE_YOLO')) initialState.yolo = true;\n return Object.keys(initialState).length > 0 ? initialState : undefined;\n}\n\n// Global safety nets — catch any uncaught errors from storage init, etc.\nprocess.on('uncaughtException', error => {\n // ERR_STREAM_DESTROYED is non-fatal — happens routinely when streams close\n // during shutdown, cancelled LLM requests, or LSP/subprocess exits (#13548, #13549)\n if (isStreamDestroyedError(error)) return;\n handleFatalError(error);\n});\nprocess.on('unhandledRejection', reason => {\n if (isStreamDestroyedError(reason)) return;\n handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));\n});\n\nasync function tuiMain(pipedInput?: string | null) {\n const settings = loadSettings();\n let browserPromise: ReturnType<typeof createBrowserFromSettings> | undefined;\n const loadBrowser = () => {\n browserPromise ??= createBrowserFromSettings(settings.browser);\n return browserPromise;\n };\n\n const initialState = resolveInitialStateFromEnv();\n const result = await createMastraCode({\n unixSocketPubSub: !isTruthyEnv('MASTRACODE_DISABLE_UNIX_SOCKET_PUBSUB'),\n disableMcp: isTruthyEnv('MASTRACODE_DISABLE_MCP'),\n disableHooks: isTruthyEnv('MASTRACODE_DISABLE_HOOKS'),\n ...(isTruthyEnv('MASTRACODE_DISABLE_MEMORY') ? { memory: false as never } : {}),\n ...(initialState ? { initialState: initialState as never } : {}),\n });\n controller = result.controller;\n mcpManager = result.mcpManager;\n hookManager = result.hookManager;\n authStorage = result.authStorage;\n signalsPubSub = result.signalsPubSub;\n\n if (result.storageWarning) {\n console.info(`⚠ ${result.storageWarning}`);\n }\n if (result.observabilityWarning) {\n console.info(`⚠ ${result.observabilityWarning}`);\n }\n\n // MCP connection is deferred to TUI.init() (after ui.start()) so that\n // status messages use showInfo() instead of console.info(), which would\n // corrupt the terminal. Headless mode still inits from headless/cli.ts.\n\n setupDebugLogging();\n\n // Detect and apply terminal theme\n // MASTRA_THEME env var is the highest-priority override\n const envTheme = process.env.MASTRA_THEME?.toLowerCase();\n let themeMode: 'dark' | 'light';\n let detectedBgHex: string | undefined;\n if (envTheme === 'dark' || envTheme === 'light') {\n themeMode = envTheme;\n } else {\n const settings = loadSettings();\n const themePref = settings.preferences.theme;\n if (themePref === 'dark' || themePref === 'light') {\n themeMode = themePref;\n } else {\n const detection = await detectTerminalTheme();\n themeMode = detection.mode;\n detectedBgHex = detection.detectedBgHex;\n }\n }\n applyThemeMode(themeMode, detectedBgHex);\n\n // createMastraCode() brought up shared resources and minted the single\n // session that all work runs through. The AgentController owns no session of its own.\n const session = result.session;\n\n analytics = createMastraCodeAnalytics({ version: getCurrentVersion() });\n analytics.capture('mastracode_session_started', {\n mode: session.mode.get(),\n resourceId: session.identity.getResourceId(),\n hasAuthStorage: Boolean(authStorage),\n hasMcp: Boolean(mcpManager),\n theme: themeMode,\n });\n\n tui = new MastraTUI({\n controller: controller,\n session,\n hookManager,\n analytics,\n authStorage,\n mcpManager,\n pluginManager: result.pluginManager,\n storageMaintenance: result.storageMaintenance,\n appName: 'Mastra Code',\n version: getCurrentVersion(),\n inlineQuestions: true,\n githubSignals: result.githubSignals,\n ...(pipedInput ? { initialMessage: `The following was piped via stdin:\\n\\n${pipedInput}` } : {}),\n });\n tui.run().catch(error => {\n handleFatalError(error);\n });\n\n if (settings.browser.enabled) {\n void loadBrowser()\n .then(browser => {\n if (!browser) return;\n controller.setBrowser(browser);\n void session.state.set({ activeBrowserSettings: settings.browser } as any).catch(() => {});\n })\n .catch(() => {});\n }\n}\n\nconst asyncCleanup = async () => {\n releaseAllThreadLocks();\n const closeSignalsPubSub = (signalsPubSub as { close?: () => Promise<void> | void } | undefined)?.close;\n await Promise.allSettled([\n mcpManager?.disconnect(),\n controller?.getMastra()?.stopWorkers(),\n controller?.stopIntervals(),\n closeSignalsPubSub?.(),\n analytics?.shutdown(),\n ]);\n};\n\nprocess.on('beforeExit', () => {\n void asyncCleanup();\n});\nprocess.on('exit', () => {\n // Ensure terminal protocols (kitty keyboard, modifyOtherKeys, bracketed paste,\n // raw mode) are disabled on ANY exit path. Without this, killing the process\n // via SIGINT/SIGTERM leaves the terminal in a corrupted state where keypresses\n // produce escape sequences like \"5;99~\" instead of normal characters.\n try {\n tui?.stop();\n } catch {\n // Failsafe: even if MastraTUI.stop() throws, write raw terminal reset\n // sequences to disable Kitty keyboard protocol, bracketed paste, and\n // modifyOtherKeys. These are the exact sequences pi-tui's terminal.stop()\n // would write.\n }\n // Belt-and-suspenders: always write terminal reset sequences directly,\n // regardless of whether tui.stop() succeeded. Writing them twice is harmless\n // but missing them leaves the terminal in a corrupted state.\n try {\n process.stdout.write(\n '\\x1b[?2004l' + // disable bracketed paste\n '\\x1b[<u' + // pop kitty keyboard protocol\n '\\x1b[>4;0m' + // disable modifyOtherKeys\n '\\x1b[?25h', // show cursor\n );\n if (process.stdin.setRawMode) {\n process.stdin.setRawMode(false);\n }\n } catch {\n // stdout may already be closed during exit\n }\n restoreTerminalForeground();\n releaseAllThreadLocks();\n});\n\n// For all termination signals: stop the TUI FIRST (synchronous, disables keyboard\n// protocol immediately) before doing any async cleanup. This ensures the terminal\n// escape sequences are written even if asyncCleanup hangs or the process is killed\n// during cleanup.\nconst handleTermSignal = () => {\n try {\n tui?.stop();\n } catch {\n // ignored — exit handler has failsafe reset\n }\n void asyncCleanup().finally(() => process.exit(0));\n};\nprocess.on('SIGINT', handleTermSignal);\nprocess.on('SIGTERM', handleTermSignal);\nprocess.on('SIGHUP', handleTermSignal);\n\nfunction hasEconnrefused(err: unknown, depth = 0): boolean {\n if (!err || depth > 5) return false;\n const e = err as any;\n if (e.code === 'ECONNREFUSED') return true;\n if (e.cause) return hasEconnrefused(e.cause, depth + 1);\n // AggregateError has .errors array\n if (Array.isArray(e.errors)) return e.errors.some((inner: unknown) => hasEconnrefused(inner, depth + 1));\n return false;\n}\n\nfunction pluginMain(args: string[]): void {\n if (args[0] !== 'scaffold') {\n process.stderr.write('Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\\n');\n process.exit(1);\n }\n\n const dir = args[1];\n if (!dir) {\n process.stderr.write('Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\\n');\n process.exit(1);\n }\n\n const id = readFlag(args, '--id');\n const name = readFlag(args, '--name');\n const targetDir = scaffoldPlugin(dir, { ...(id ? { id } : {}), ...(name ? { name } : {}) });\n process.stdout.write(`${formatScaffoldSuccess(targetDir)}\\n`);\n}\n\nfunction readFlag(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index === -1) return undefined;\n const value = args[index + 1];\n if (!value || value.startsWith('--')) {\n throw new Error(`Missing value for ${flag}`);\n }\n return value;\n}\n\nfunction handleFatalError(error: unknown): never {\n // Always write to real stderr, even if console.error was overridden\n const write = (msg: string) => process.stderr.write(msg + '\\n');\n\n if (hasEconnrefused(error)) {\n const settings = loadSettings();\n const connStr = settings.storage?.pg?.connectionString;\n const target = connStr ?? 'localhost:5432';\n write(\n `\\nFailed to connect to PostgreSQL at ${target}.` +\n `\\nMake sure the database is running and accessible.` +\n `\\n\\nTo switch back to LibSQL:` +\n `\\n Set MASTRA_STORAGE_BACKEND=libsql or change the backend in /settings\\n`,\n );\n process.exit(1);\n }\n\n const msg = `Fatal error: ${error instanceof Error ? error.message : String(error)}`;\n write(msg);\n // Write crash log to file so it persists even if terminal closes\n try {\n const crashLog = `[${new Date().toISOString()}] ${msg}\\n${error instanceof Error && error.stack ? error.stack + '\\n' : ''}`;\n fs.appendFileSync('/tmp/mastra-crash.log', crashLog);\n } catch {}\n if (error instanceof Error && error.stack) {\n write(error.stack);\n }\n process.exit(1);\n}\n\nasync function main() {\n if (process.argv[2] === 'plugin') {\n return pluginMain(process.argv.slice(3));\n }\n\n if (hasHeadlessFlag(process.argv) || process.argv.includes('--help') || process.argv.includes('-h')) {\n return runMCCli();\n }\n\n if (process.argv.includes('--acp')) {\n const { acpMain } = await import('@mastra/code-sdk/acp/index');\n return acpMain({ dangerousAutoApprove: process.argv.includes('--dangerous-auto-approve') });\n }\n\n // When stdin is piped (e.g. `cat foo | mastracode`), drain the pipe fully\n // before starting the TUI. The drain blocks until the sender process exits\n // and closes its stdout, so we never see partial output.\n let pipedInput: string | null = null;\n if (!process.stdin.isTTY) {\n process.stderr.write('Reading piped input...\\n');\n pipedInput = await drainPipedStdin();\n\n // Always reopen a real TTY — even if the pipe was empty, the original\n // stdin is consumed/closed and the TUI needs a live TTY for keyboard input.\n const reopenedStdin = reopenStdinFromTTY();\n if (!reopenedStdin) {\n process.stderr.write('No TTY available — falling back to headless mode.\\n');\n return runMCCli(pipedInput);\n }\n }\n\n return tuiMain(pipedInput);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/main.ts"],"names":["isStreamDestroyedError","settings","loadSettings","createBrowserFromSettings","createMastraCode","setupDebugLogging","detectTerminalTheme","applyThemeMode","createMastraCodeAnalytics","MastraTUI","releaseAllThreadLocks","restoreTerminalForeground","scaffoldPlugin","formatScaffoldSuccess","msg","fs","hasHeadlessFlag","runMCCli","drainPipedStdin","reopenStdinFromTTY"],"mappings":"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","file":"cli.cjs","sourcesContent":["import { readFileSync } from 'node:fs';\n\ndeclare const MASTRACODE_VERSION: string | undefined;\n\nexport function getCurrentVersion(): string {\n if (typeof MASTRACODE_VERSION !== 'undefined') {\n return MASTRACODE_VERSION;\n }\n\n const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as { version: string };\n return pkg.version;\n}\n","#!/usr/bin/env node\n/**\n * Main entry point for Mastra Code TUI.\n */\nimport fs from 'node:fs';\n\nimport { createMastraCode } from '@mastra/code-sdk';\nimport { createMastraCodeAnalytics } from '@mastra/code-sdk/analytics';\nimport { isStreamDestroyedError } from '@mastra/code-sdk/error-classification';\nimport { hasHeadlessFlag, runMCCli } from '@mastra/code-sdk/headless/index';\nimport { createBrowserFromSettings, loadSettings } from '@mastra/code-sdk/onboarding/settings';\nimport { formatScaffoldSuccess, scaffoldPlugin } from '@mastra/code-sdk/plugins/scaffold';\nimport { setupDebugLogging } from '@mastra/code-sdk/utils/debug-log';\nimport { drainPipedStdin, reopenStdinFromTTY } from '@mastra/code-sdk/utils/stdin-pipe';\nimport { releaseAllThreadLocks } from '@mastra/code-sdk/utils/thread-lock';\nimport { detectTerminalTheme } from './tui/detect-theme.js';\nimport { MastraTUI } from './tui/index.js';\nimport { applyThemeMode, restoreTerminalForeground } from './tui/theme.js';\nimport { getCurrentVersion } from './version.js';\n\nlet controller: Awaited<ReturnType<typeof createMastraCode>>['controller'];\nlet mcpManager: Awaited<ReturnType<typeof createMastraCode>>['mcpManager'];\nlet hookManager: Awaited<ReturnType<typeof createMastraCode>>['hookManager'];\nlet authStorage: Awaited<ReturnType<typeof createMastraCode>>['authStorage'];\nlet signalsPubSub: Awaited<ReturnType<typeof createMastraCode>>['signalsPubSub'];\nlet analytics: ReturnType<typeof createMastraCodeAnalytics> | undefined;\nlet tui: MastraTUI | undefined;\n\nfunction isTruthyEnv(name: string): boolean {\n return ['1', 'true', 'yes', 'on'].includes(process.env[name]?.trim().toLowerCase() ?? '');\n}\n\nfunction resolveInitialStateFromEnv() {\n const currentModelId = process.env.MASTRACODE_MODEL_ID?.trim();\n const initialState: Record<string, unknown> = {};\n if (currentModelId) initialState.currentModelId = currentModelId;\n if (isTruthyEnv('MASTRACODE_YOLO')) initialState.yolo = true;\n return Object.keys(initialState).length > 0 ? initialState : undefined;\n}\n\n// Global safety nets — catch any uncaught errors from storage init, etc.\nprocess.on('uncaughtException', error => {\n // ERR_STREAM_DESTROYED is non-fatal — happens routinely when streams close\n // during shutdown, cancelled LLM requests, or LSP/subprocess exits (#13548, #13549)\n if (isStreamDestroyedError(error)) return;\n handleFatalError(error);\n});\nprocess.on('unhandledRejection', reason => {\n if (isStreamDestroyedError(reason)) return;\n handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));\n});\n\nasync function tuiMain(pipedInput?: string | null) {\n const settings = loadSettings();\n let browserPromise: ReturnType<typeof createBrowserFromSettings> | undefined;\n const loadBrowser = () => {\n browserPromise ??= createBrowserFromSettings(settings.browser);\n return browserPromise;\n };\n\n const initialState = resolveInitialStateFromEnv();\n const result = await createMastraCode({\n unixSocketPubSub: !isTruthyEnv('MASTRACODE_DISABLE_UNIX_SOCKET_PUBSUB'),\n disableMcp: isTruthyEnv('MASTRACODE_DISABLE_MCP'),\n disableHooks: isTruthyEnv('MASTRACODE_DISABLE_HOOKS'),\n ...(isTruthyEnv('MASTRACODE_DISABLE_MEMORY') ? { memory: false as never } : {}),\n ...(initialState ? { initialState: initialState as never } : {}),\n });\n controller = result.controller;\n mcpManager = result.mcpManager;\n hookManager = result.hookManager;\n authStorage = result.authStorage;\n signalsPubSub = result.signalsPubSub;\n\n if (result.storageWarning) {\n console.info(`⚠ ${result.storageWarning}`);\n }\n if (result.observabilityWarning) {\n console.info(`⚠ ${result.observabilityWarning}`);\n }\n\n // MCP connection is deferred to TUI.init() (after ui.start()) so that\n // status messages use showInfo() instead of console.info(), which would\n // corrupt the terminal. Headless mode still inits from headless/cli.ts.\n\n setupDebugLogging();\n\n // Detect and apply terminal theme\n // MASTRA_THEME env var is the highest-priority override\n const envTheme = process.env.MASTRA_THEME?.toLowerCase();\n let themeMode: 'dark' | 'light';\n let detectedBgHex: string | undefined;\n if (envTheme === 'dark' || envTheme === 'light') {\n themeMode = envTheme;\n } else {\n const settings = loadSettings();\n const themePref = settings.preferences.theme;\n if (themePref === 'dark' || themePref === 'light') {\n themeMode = themePref;\n } else {\n const detection = await detectTerminalTheme();\n themeMode = detection.mode;\n detectedBgHex = detection.detectedBgHex;\n }\n }\n applyThemeMode(themeMode, detectedBgHex);\n\n // createMastraCode() brought up shared resources and minted the single\n // session that all work runs through. The AgentController owns no session of its own.\n const session = result.session;\n\n analytics = createMastraCodeAnalytics({ version: getCurrentVersion() });\n analytics.capture('mastracode_session_started', {\n mode: session.mode.get(),\n resourceId: session.identity.getResourceId(),\n hasAuthStorage: Boolean(authStorage),\n hasMcp: Boolean(mcpManager),\n theme: themeMode,\n });\n\n tui = new MastraTUI({\n controller: controller,\n session,\n hookManager,\n analytics,\n authStorage,\n mcpManager,\n pluginManager: result.pluginManager,\n storageMaintenance: result.storageMaintenance,\n appName: 'Mastra Code',\n version: getCurrentVersion(),\n inlineQuestions: true,\n githubSignals: result.githubSignals,\n ...(pipedInput ? { initialMessage: `The following was piped via stdin:\\n\\n${pipedInput}` } : {}),\n });\n tui.run().catch(error => {\n handleFatalError(error);\n });\n\n if (settings.browser.enabled) {\n void loadBrowser()\n .then(browser => {\n if (!browser) return;\n controller.setBrowser(browser);\n void session.state.set({ activeBrowserSettings: settings.browser } as any).catch(() => {});\n })\n .catch(() => {});\n }\n}\n\nconst asyncCleanup = async () => {\n releaseAllThreadLocks();\n const closeSignalsPubSub = (signalsPubSub as { close?: () => Promise<void> | void } | undefined)?.close;\n await Promise.allSettled([\n mcpManager?.disconnect(),\n controller?.getMastra()?.stopWorkers(),\n controller?.stopIntervals(),\n closeSignalsPubSub?.(),\n analytics?.shutdown(),\n ]);\n};\n\nprocess.on('beforeExit', () => {\n void asyncCleanup();\n});\nprocess.on('exit', () => {\n // Ensure terminal protocols (kitty keyboard, modifyOtherKeys, bracketed paste,\n // raw mode) are disabled on ANY exit path. Without this, killing the process\n // via SIGINT/SIGTERM leaves the terminal in a corrupted state where keypresses\n // produce escape sequences like \"5;99~\" instead of normal characters.\n try {\n tui?.stop();\n } catch {\n // Failsafe: even if MastraTUI.stop() throws, write raw terminal reset\n // sequences to disable Kitty keyboard protocol, bracketed paste, and\n // modifyOtherKeys. These are the exact sequences pi-tui's terminal.stop()\n // would write.\n }\n // Belt-and-suspenders: always write terminal reset sequences directly,\n // regardless of whether tui.stop() succeeded. Writing them twice is harmless\n // but missing them leaves the terminal in a corrupted state.\n try {\n process.stdout.write(\n '\\x1b[?2004l' + // disable bracketed paste\n '\\x1b[<u' + // pop kitty keyboard protocol\n '\\x1b[>4;0m' + // disable modifyOtherKeys\n '\\x1b[?25h', // show cursor\n );\n if (process.stdin.setRawMode) {\n process.stdin.setRawMode(false);\n }\n } catch {\n // stdout may already be closed during exit\n }\n restoreTerminalForeground();\n releaseAllThreadLocks();\n});\n\n// For all termination signals: stop the TUI FIRST (synchronous, disables keyboard\n// protocol immediately) before doing any async cleanup. This ensures the terminal\n// escape sequences are written even if asyncCleanup hangs or the process is killed\n// during cleanup.\nconst handleTermSignal = () => {\n try {\n tui?.stop();\n } catch {\n // ignored — exit handler has failsafe reset\n }\n void asyncCleanup().finally(() => process.exit(0));\n};\nprocess.on('SIGINT', handleTermSignal);\nprocess.on('SIGTERM', handleTermSignal);\nprocess.on('SIGHUP', handleTermSignal);\n\nfunction hasEconnrefused(err: unknown, depth = 0): boolean {\n if (!err || depth > 5) return false;\n const e = err as any;\n if (e.code === 'ECONNREFUSED') return true;\n if (e.cause) return hasEconnrefused(e.cause, depth + 1);\n // AggregateError has .errors array\n if (Array.isArray(e.errors)) return e.errors.some((inner: unknown) => hasEconnrefused(inner, depth + 1));\n return false;\n}\n\nfunction pluginMain(args: string[]): void {\n if (args[0] !== 'scaffold') {\n process.stderr.write('Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\\n');\n process.exit(1);\n }\n\n const dir = args[1];\n if (!dir) {\n process.stderr.write('Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\\n');\n process.exit(1);\n }\n\n const id = readFlag(args, '--id');\n const name = readFlag(args, '--name');\n const targetDir = scaffoldPlugin(dir, { ...(id ? { id } : {}), ...(name ? { name } : {}) });\n process.stdout.write(`${formatScaffoldSuccess(targetDir)}\\n`);\n}\n\nfunction readFlag(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index === -1) return undefined;\n const value = args[index + 1];\n if (!value || value.startsWith('--')) {\n throw new Error(`Missing value for ${flag}`);\n }\n return value;\n}\n\nfunction handleFatalError(error: unknown): never {\n // Always write to real stderr, even if console.error was overridden\n const write = (msg: string) => process.stderr.write(msg + '\\n');\n\n if (hasEconnrefused(error)) {\n const settings = loadSettings();\n const connStr = settings.storage?.pg?.connectionString;\n const target = connStr ?? 'localhost:5432';\n write(\n `\\nFailed to connect to PostgreSQL at ${target}.` +\n `\\nMake sure the database is running and accessible.` +\n `\\n\\nTo switch back to LibSQL:` +\n `\\n Set MASTRA_STORAGE_BACKEND=libsql or change the backend in /settings\\n`,\n );\n process.exit(1);\n }\n\n const msg = `Fatal error: ${error instanceof Error ? error.message : String(error)}`;\n write(msg);\n // Write crash log to file so it persists even if terminal closes\n try {\n const crashLog = `[${new Date().toISOString()}] ${msg}\\n${error instanceof Error && error.stack ? error.stack + '\\n' : ''}`;\n fs.appendFileSync('/tmp/mastra-crash.log', crashLog);\n } catch {}\n if (error instanceof Error && error.stack) {\n write(error.stack);\n }\n process.exit(1);\n}\n\nasync function main() {\n if (process.argv[2] === 'plugin') {\n return pluginMain(process.argv.slice(3));\n }\n\n if (hasHeadlessFlag(process.argv) || process.argv.includes('--help') || process.argv.includes('-h')) {\n return runMCCli();\n }\n\n if (process.argv.includes('--acp')) {\n const { acpMain } = await import('@mastra/code-sdk/acp/index');\n return acpMain({ dangerousAutoApprove: process.argv.includes('--dangerous-auto-approve') });\n }\n\n // When stdin is piped (e.g. `cat foo | mastracode`), drain the pipe fully\n // before starting the TUI. The drain blocks until the sender process exits\n // and closes its stdout, so we never see partial output.\n let pipedInput: string | null = null;\n if (!process.stdin.isTTY) {\n process.stderr.write('Reading piped input...\\n');\n pipedInput = await drainPipedStdin();\n\n // Always reopen a real TTY — even if the pipe was empty, the original\n // stdin is consumed/closed and the TUI needs a live TTY for keyboard input.\n const reopenedStdin = reopenStdinFromTTY();\n if (!reopenedStdin) {\n process.stderr.write('No TTY available — falling back to headless mode.\\n');\n return runMCCli(pipedInput);\n }\n }\n\n return tuiMain(pipedInput);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"]}
|
package/dist/cli.js
CHANGED
|
@@ -10,8 +10,14 @@ import { scaffoldPlugin, formatScaffoldSuccess } from '@mastra/code-sdk/plugins/
|
|
|
10
10
|
import { setupDebugLogging } from '@mastra/code-sdk/utils/debug-log';
|
|
11
11
|
import { drainPipedStdin, reopenStdinFromTTY } from '@mastra/code-sdk/utils/stdin-pipe';
|
|
12
12
|
import { releaseAllThreadLocks } from '@mastra/code-sdk/utils/thread-lock';
|
|
13
|
-
import { getCurrentVersion } from '@mastra/code-sdk/utils/update-check';
|
|
14
13
|
|
|
14
|
+
function getCurrentVersion() {
|
|
15
|
+
{
|
|
16
|
+
return "0.31.1-alpha.0";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// src/main.ts
|
|
15
21
|
var controller;
|
|
16
22
|
var mcpManager;
|
|
17
23
|
var hookManager;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/main.ts"],"names":["settings","msg"],"mappings":"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","file":"cli.js","sourcesContent":["#!/usr/bin/env node\n/**\n * Main entry point for Mastra Code TUI.\n */\nimport fs from 'node:fs';\n\nimport { createMastraCode } from '@mastra/code-sdk';\nimport { createMastraCodeAnalytics } from '@mastra/code-sdk/analytics';\nimport { isStreamDestroyedError } from '@mastra/code-sdk/error-classification';\nimport { hasHeadlessFlag, runMCCli } from '@mastra/code-sdk/headless/index';\nimport { createBrowserFromSettings, loadSettings } from '@mastra/code-sdk/onboarding/settings';\nimport { formatScaffoldSuccess, scaffoldPlugin } from '@mastra/code-sdk/plugins/scaffold';\nimport { setupDebugLogging } from '@mastra/code-sdk/utils/debug-log';\nimport { drainPipedStdin, reopenStdinFromTTY } from '@mastra/code-sdk/utils/stdin-pipe';\nimport { releaseAllThreadLocks } from '@mastra/code-sdk/utils/thread-lock';\nimport { getCurrentVersion } from '@mastra/code-sdk/utils/update-check';\nimport { detectTerminalTheme } from './tui/detect-theme.js';\nimport { MastraTUI } from './tui/index.js';\nimport { applyThemeMode, restoreTerminalForeground } from './tui/theme.js';\n\nlet controller: Awaited<ReturnType<typeof createMastraCode>>['controller'];\nlet mcpManager: Awaited<ReturnType<typeof createMastraCode>>['mcpManager'];\nlet hookManager: Awaited<ReturnType<typeof createMastraCode>>['hookManager'];\nlet authStorage: Awaited<ReturnType<typeof createMastraCode>>['authStorage'];\nlet signalsPubSub: Awaited<ReturnType<typeof createMastraCode>>['signalsPubSub'];\nlet analytics: ReturnType<typeof createMastraCodeAnalytics> | undefined;\nlet tui: MastraTUI | undefined;\n\nfunction isTruthyEnv(name: string): boolean {\n return ['1', 'true', 'yes', 'on'].includes(process.env[name]?.trim().toLowerCase() ?? '');\n}\n\nfunction resolveInitialStateFromEnv() {\n const currentModelId = process.env.MASTRACODE_MODEL_ID?.trim();\n const initialState: Record<string, unknown> = {};\n if (currentModelId) initialState.currentModelId = currentModelId;\n if (isTruthyEnv('MASTRACODE_YOLO')) initialState.yolo = true;\n return Object.keys(initialState).length > 0 ? initialState : undefined;\n}\n\n// Global safety nets — catch any uncaught errors from storage init, etc.\nprocess.on('uncaughtException', error => {\n // ERR_STREAM_DESTROYED is non-fatal — happens routinely when streams close\n // during shutdown, cancelled LLM requests, or LSP/subprocess exits (#13548, #13549)\n if (isStreamDestroyedError(error)) return;\n handleFatalError(error);\n});\nprocess.on('unhandledRejection', reason => {\n if (isStreamDestroyedError(reason)) return;\n handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));\n});\n\nasync function tuiMain(pipedInput?: string | null) {\n const settings = loadSettings();\n let browserPromise: ReturnType<typeof createBrowserFromSettings> | undefined;\n const loadBrowser = () => {\n browserPromise ??= createBrowserFromSettings(settings.browser);\n return browserPromise;\n };\n\n const initialState = resolveInitialStateFromEnv();\n const result = await createMastraCode({\n unixSocketPubSub: !isTruthyEnv('MASTRACODE_DISABLE_UNIX_SOCKET_PUBSUB'),\n disableMcp: isTruthyEnv('MASTRACODE_DISABLE_MCP'),\n disableHooks: isTruthyEnv('MASTRACODE_DISABLE_HOOKS'),\n ...(isTruthyEnv('MASTRACODE_DISABLE_MEMORY') ? { memory: false as never } : {}),\n ...(initialState ? { initialState: initialState as never } : {}),\n });\n controller = result.controller;\n mcpManager = result.mcpManager;\n hookManager = result.hookManager;\n authStorage = result.authStorage;\n signalsPubSub = result.signalsPubSub;\n\n if (result.storageWarning) {\n console.info(`⚠ ${result.storageWarning}`);\n }\n if (result.observabilityWarning) {\n console.info(`⚠ ${result.observabilityWarning}`);\n }\n\n // MCP connection is deferred to TUI.init() (after ui.start()) so that\n // status messages use showInfo() instead of console.info(), which would\n // corrupt the terminal. Headless mode still inits from headless/cli.ts.\n\n setupDebugLogging();\n\n // Detect and apply terminal theme\n // MASTRA_THEME env var is the highest-priority override\n const envTheme = process.env.MASTRA_THEME?.toLowerCase();\n let themeMode: 'dark' | 'light';\n let detectedBgHex: string | undefined;\n if (envTheme === 'dark' || envTheme === 'light') {\n themeMode = envTheme;\n } else {\n const settings = loadSettings();\n const themePref = settings.preferences.theme;\n if (themePref === 'dark' || themePref === 'light') {\n themeMode = themePref;\n } else {\n const detection = await detectTerminalTheme();\n themeMode = detection.mode;\n detectedBgHex = detection.detectedBgHex;\n }\n }\n applyThemeMode(themeMode, detectedBgHex);\n\n // createMastraCode() brought up shared resources and minted the single\n // session that all work runs through. The AgentController owns no session of its own.\n const session = result.session;\n\n analytics = createMastraCodeAnalytics({ version: getCurrentVersion() });\n analytics.capture('mastracode_session_started', {\n mode: session.mode.get(),\n resourceId: session.identity.getResourceId(),\n hasAuthStorage: Boolean(authStorage),\n hasMcp: Boolean(mcpManager),\n theme: themeMode,\n });\n\n tui = new MastraTUI({\n controller: controller,\n session,\n hookManager,\n analytics,\n authStorage,\n mcpManager,\n pluginManager: result.pluginManager,\n storageMaintenance: result.storageMaintenance,\n appName: 'Mastra Code',\n version: getCurrentVersion(),\n inlineQuestions: true,\n githubSignals: result.githubSignals,\n ...(pipedInput ? { initialMessage: `The following was piped via stdin:\\n\\n${pipedInput}` } : {}),\n });\n tui.run().catch(error => {\n handleFatalError(error);\n });\n\n if (settings.browser.enabled) {\n void loadBrowser()\n .then(browser => {\n if (!browser) return;\n controller.setBrowser(browser);\n void session.state.set({ activeBrowserSettings: settings.browser } as any).catch(() => {});\n })\n .catch(() => {});\n }\n}\n\nconst asyncCleanup = async () => {\n releaseAllThreadLocks();\n const closeSignalsPubSub = (signalsPubSub as { close?: () => Promise<void> | void } | undefined)?.close;\n await Promise.allSettled([\n mcpManager?.disconnect(),\n controller?.getMastra()?.stopWorkers(),\n controller?.stopIntervals(),\n closeSignalsPubSub?.(),\n analytics?.shutdown(),\n ]);\n};\n\nprocess.on('beforeExit', () => {\n void asyncCleanup();\n});\nprocess.on('exit', () => {\n // Ensure terminal protocols (kitty keyboard, modifyOtherKeys, bracketed paste,\n // raw mode) are disabled on ANY exit path. Without this, killing the process\n // via SIGINT/SIGTERM leaves the terminal in a corrupted state where keypresses\n // produce escape sequences like \"5;99~\" instead of normal characters.\n try {\n tui?.stop();\n } catch {\n // Failsafe: even if MastraTUI.stop() throws, write raw terminal reset\n // sequences to disable Kitty keyboard protocol, bracketed paste, and\n // modifyOtherKeys. These are the exact sequences pi-tui's terminal.stop()\n // would write.\n }\n // Belt-and-suspenders: always write terminal reset sequences directly,\n // regardless of whether tui.stop() succeeded. Writing them twice is harmless\n // but missing them leaves the terminal in a corrupted state.\n try {\n process.stdout.write(\n '\\x1b[?2004l' + // disable bracketed paste\n '\\x1b[<u' + // pop kitty keyboard protocol\n '\\x1b[>4;0m' + // disable modifyOtherKeys\n '\\x1b[?25h', // show cursor\n );\n if (process.stdin.setRawMode) {\n process.stdin.setRawMode(false);\n }\n } catch {\n // stdout may already be closed during exit\n }\n restoreTerminalForeground();\n releaseAllThreadLocks();\n});\n\n// For all termination signals: stop the TUI FIRST (synchronous, disables keyboard\n// protocol immediately) before doing any async cleanup. This ensures the terminal\n// escape sequences are written even if asyncCleanup hangs or the process is killed\n// during cleanup.\nconst handleTermSignal = () => {\n try {\n tui?.stop();\n } catch {\n // ignored — exit handler has failsafe reset\n }\n void asyncCleanup().finally(() => process.exit(0));\n};\nprocess.on('SIGINT', handleTermSignal);\nprocess.on('SIGTERM', handleTermSignal);\nprocess.on('SIGHUP', handleTermSignal);\n\nfunction hasEconnrefused(err: unknown, depth = 0): boolean {\n if (!err || depth > 5) return false;\n const e = err as any;\n if (e.code === 'ECONNREFUSED') return true;\n if (e.cause) return hasEconnrefused(e.cause, depth + 1);\n // AggregateError has .errors array\n if (Array.isArray(e.errors)) return e.errors.some((inner: unknown) => hasEconnrefused(inner, depth + 1));\n return false;\n}\n\nfunction pluginMain(args: string[]): void {\n if (args[0] !== 'scaffold') {\n process.stderr.write('Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\\n');\n process.exit(1);\n }\n\n const dir = args[1];\n if (!dir) {\n process.stderr.write('Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\\n');\n process.exit(1);\n }\n\n const id = readFlag(args, '--id');\n const name = readFlag(args, '--name');\n const targetDir = scaffoldPlugin(dir, { ...(id ? { id } : {}), ...(name ? { name } : {}) });\n process.stdout.write(`${formatScaffoldSuccess(targetDir)}\\n`);\n}\n\nfunction readFlag(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index === -1) return undefined;\n const value = args[index + 1];\n if (!value || value.startsWith('--')) {\n throw new Error(`Missing value for ${flag}`);\n }\n return value;\n}\n\nfunction handleFatalError(error: unknown): never {\n // Always write to real stderr, even if console.error was overridden\n const write = (msg: string) => process.stderr.write(msg + '\\n');\n\n if (hasEconnrefused(error)) {\n const settings = loadSettings();\n const connStr = settings.storage?.pg?.connectionString;\n const target = connStr ?? 'localhost:5432';\n write(\n `\\nFailed to connect to PostgreSQL at ${target}.` +\n `\\nMake sure the database is running and accessible.` +\n `\\n\\nTo switch back to LibSQL:` +\n `\\n Set MASTRA_STORAGE_BACKEND=libsql or change the backend in /settings\\n`,\n );\n process.exit(1);\n }\n\n const msg = `Fatal error: ${error instanceof Error ? error.message : String(error)}`;\n write(msg);\n // Write crash log to file so it persists even if terminal closes\n try {\n const crashLog = `[${new Date().toISOString()}] ${msg}\\n${error instanceof Error && error.stack ? error.stack + '\\n' : ''}`;\n fs.appendFileSync('/tmp/mastra-crash.log', crashLog);\n } catch {}\n if (error instanceof Error && error.stack) {\n write(error.stack);\n }\n process.exit(1);\n}\n\nasync function main() {\n if (process.argv[2] === 'plugin') {\n return pluginMain(process.argv.slice(3));\n }\n\n if (hasHeadlessFlag(process.argv) || process.argv.includes('--help') || process.argv.includes('-h')) {\n return runMCCli();\n }\n\n if (process.argv.includes('--acp')) {\n const { acpMain } = await import('@mastra/code-sdk/acp/index');\n return acpMain({ dangerousAutoApprove: process.argv.includes('--dangerous-auto-approve') });\n }\n\n // When stdin is piped (e.g. `cat foo | mastracode`), drain the pipe fully\n // before starting the TUI. The drain blocks until the sender process exits\n // and closes its stdout, so we never see partial output.\n let pipedInput: string | null = null;\n if (!process.stdin.isTTY) {\n process.stderr.write('Reading piped input...\\n');\n pipedInput = await drainPipedStdin();\n\n // Always reopen a real TTY — even if the pipe was empty, the original\n // stdin is consumed/closed and the TUI needs a live TTY for keyboard input.\n const reopenedStdin = reopenStdinFromTTY();\n if (!reopenedStdin) {\n process.stderr.write('No TTY available — falling back to headless mode.\\n');\n return runMCCli(pipedInput);\n }\n }\n\n return tuiMain(pipedInput);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/main.ts"],"names":["settings","msg"],"mappings":"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","file":"cli.js","sourcesContent":["import { readFileSync } from 'node:fs';\n\ndeclare const MASTRACODE_VERSION: string | undefined;\n\nexport function getCurrentVersion(): string {\n if (typeof MASTRACODE_VERSION !== 'undefined') {\n return MASTRACODE_VERSION;\n }\n\n const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as { version: string };\n return pkg.version;\n}\n","#!/usr/bin/env node\n/**\n * Main entry point for Mastra Code TUI.\n */\nimport fs from 'node:fs';\n\nimport { createMastraCode } from '@mastra/code-sdk';\nimport { createMastraCodeAnalytics } from '@mastra/code-sdk/analytics';\nimport { isStreamDestroyedError } from '@mastra/code-sdk/error-classification';\nimport { hasHeadlessFlag, runMCCli } from '@mastra/code-sdk/headless/index';\nimport { createBrowserFromSettings, loadSettings } from '@mastra/code-sdk/onboarding/settings';\nimport { formatScaffoldSuccess, scaffoldPlugin } from '@mastra/code-sdk/plugins/scaffold';\nimport { setupDebugLogging } from '@mastra/code-sdk/utils/debug-log';\nimport { drainPipedStdin, reopenStdinFromTTY } from '@mastra/code-sdk/utils/stdin-pipe';\nimport { releaseAllThreadLocks } from '@mastra/code-sdk/utils/thread-lock';\nimport { detectTerminalTheme } from './tui/detect-theme.js';\nimport { MastraTUI } from './tui/index.js';\nimport { applyThemeMode, restoreTerminalForeground } from './tui/theme.js';\nimport { getCurrentVersion } from './version.js';\n\nlet controller: Awaited<ReturnType<typeof createMastraCode>>['controller'];\nlet mcpManager: Awaited<ReturnType<typeof createMastraCode>>['mcpManager'];\nlet hookManager: Awaited<ReturnType<typeof createMastraCode>>['hookManager'];\nlet authStorage: Awaited<ReturnType<typeof createMastraCode>>['authStorage'];\nlet signalsPubSub: Awaited<ReturnType<typeof createMastraCode>>['signalsPubSub'];\nlet analytics: ReturnType<typeof createMastraCodeAnalytics> | undefined;\nlet tui: MastraTUI | undefined;\n\nfunction isTruthyEnv(name: string): boolean {\n return ['1', 'true', 'yes', 'on'].includes(process.env[name]?.trim().toLowerCase() ?? '');\n}\n\nfunction resolveInitialStateFromEnv() {\n const currentModelId = process.env.MASTRACODE_MODEL_ID?.trim();\n const initialState: Record<string, unknown> = {};\n if (currentModelId) initialState.currentModelId = currentModelId;\n if (isTruthyEnv('MASTRACODE_YOLO')) initialState.yolo = true;\n return Object.keys(initialState).length > 0 ? initialState : undefined;\n}\n\n// Global safety nets — catch any uncaught errors from storage init, etc.\nprocess.on('uncaughtException', error => {\n // ERR_STREAM_DESTROYED is non-fatal — happens routinely when streams close\n // during shutdown, cancelled LLM requests, or LSP/subprocess exits (#13548, #13549)\n if (isStreamDestroyedError(error)) return;\n handleFatalError(error);\n});\nprocess.on('unhandledRejection', reason => {\n if (isStreamDestroyedError(reason)) return;\n handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));\n});\n\nasync function tuiMain(pipedInput?: string | null) {\n const settings = loadSettings();\n let browserPromise: ReturnType<typeof createBrowserFromSettings> | undefined;\n const loadBrowser = () => {\n browserPromise ??= createBrowserFromSettings(settings.browser);\n return browserPromise;\n };\n\n const initialState = resolveInitialStateFromEnv();\n const result = await createMastraCode({\n unixSocketPubSub: !isTruthyEnv('MASTRACODE_DISABLE_UNIX_SOCKET_PUBSUB'),\n disableMcp: isTruthyEnv('MASTRACODE_DISABLE_MCP'),\n disableHooks: isTruthyEnv('MASTRACODE_DISABLE_HOOKS'),\n ...(isTruthyEnv('MASTRACODE_DISABLE_MEMORY') ? { memory: false as never } : {}),\n ...(initialState ? { initialState: initialState as never } : {}),\n });\n controller = result.controller;\n mcpManager = result.mcpManager;\n hookManager = result.hookManager;\n authStorage = result.authStorage;\n signalsPubSub = result.signalsPubSub;\n\n if (result.storageWarning) {\n console.info(`⚠ ${result.storageWarning}`);\n }\n if (result.observabilityWarning) {\n console.info(`⚠ ${result.observabilityWarning}`);\n }\n\n // MCP connection is deferred to TUI.init() (after ui.start()) so that\n // status messages use showInfo() instead of console.info(), which would\n // corrupt the terminal. Headless mode still inits from headless/cli.ts.\n\n setupDebugLogging();\n\n // Detect and apply terminal theme\n // MASTRA_THEME env var is the highest-priority override\n const envTheme = process.env.MASTRA_THEME?.toLowerCase();\n let themeMode: 'dark' | 'light';\n let detectedBgHex: string | undefined;\n if (envTheme === 'dark' || envTheme === 'light') {\n themeMode = envTheme;\n } else {\n const settings = loadSettings();\n const themePref = settings.preferences.theme;\n if (themePref === 'dark' || themePref === 'light') {\n themeMode = themePref;\n } else {\n const detection = await detectTerminalTheme();\n themeMode = detection.mode;\n detectedBgHex = detection.detectedBgHex;\n }\n }\n applyThemeMode(themeMode, detectedBgHex);\n\n // createMastraCode() brought up shared resources and minted the single\n // session that all work runs through. The AgentController owns no session of its own.\n const session = result.session;\n\n analytics = createMastraCodeAnalytics({ version: getCurrentVersion() });\n analytics.capture('mastracode_session_started', {\n mode: session.mode.get(),\n resourceId: session.identity.getResourceId(),\n hasAuthStorage: Boolean(authStorage),\n hasMcp: Boolean(mcpManager),\n theme: themeMode,\n });\n\n tui = new MastraTUI({\n controller: controller,\n session,\n hookManager,\n analytics,\n authStorage,\n mcpManager,\n pluginManager: result.pluginManager,\n storageMaintenance: result.storageMaintenance,\n appName: 'Mastra Code',\n version: getCurrentVersion(),\n inlineQuestions: true,\n githubSignals: result.githubSignals,\n ...(pipedInput ? { initialMessage: `The following was piped via stdin:\\n\\n${pipedInput}` } : {}),\n });\n tui.run().catch(error => {\n handleFatalError(error);\n });\n\n if (settings.browser.enabled) {\n void loadBrowser()\n .then(browser => {\n if (!browser) return;\n controller.setBrowser(browser);\n void session.state.set({ activeBrowserSettings: settings.browser } as any).catch(() => {});\n })\n .catch(() => {});\n }\n}\n\nconst asyncCleanup = async () => {\n releaseAllThreadLocks();\n const closeSignalsPubSub = (signalsPubSub as { close?: () => Promise<void> | void } | undefined)?.close;\n await Promise.allSettled([\n mcpManager?.disconnect(),\n controller?.getMastra()?.stopWorkers(),\n controller?.stopIntervals(),\n closeSignalsPubSub?.(),\n analytics?.shutdown(),\n ]);\n};\n\nprocess.on('beforeExit', () => {\n void asyncCleanup();\n});\nprocess.on('exit', () => {\n // Ensure terminal protocols (kitty keyboard, modifyOtherKeys, bracketed paste,\n // raw mode) are disabled on ANY exit path. Without this, killing the process\n // via SIGINT/SIGTERM leaves the terminal in a corrupted state where keypresses\n // produce escape sequences like \"5;99~\" instead of normal characters.\n try {\n tui?.stop();\n } catch {\n // Failsafe: even if MastraTUI.stop() throws, write raw terminal reset\n // sequences to disable Kitty keyboard protocol, bracketed paste, and\n // modifyOtherKeys. These are the exact sequences pi-tui's terminal.stop()\n // would write.\n }\n // Belt-and-suspenders: always write terminal reset sequences directly,\n // regardless of whether tui.stop() succeeded. Writing them twice is harmless\n // but missing them leaves the terminal in a corrupted state.\n try {\n process.stdout.write(\n '\\x1b[?2004l' + // disable bracketed paste\n '\\x1b[<u' + // pop kitty keyboard protocol\n '\\x1b[>4;0m' + // disable modifyOtherKeys\n '\\x1b[?25h', // show cursor\n );\n if (process.stdin.setRawMode) {\n process.stdin.setRawMode(false);\n }\n } catch {\n // stdout may already be closed during exit\n }\n restoreTerminalForeground();\n releaseAllThreadLocks();\n});\n\n// For all termination signals: stop the TUI FIRST (synchronous, disables keyboard\n// protocol immediately) before doing any async cleanup. This ensures the terminal\n// escape sequences are written even if asyncCleanup hangs or the process is killed\n// during cleanup.\nconst handleTermSignal = () => {\n try {\n tui?.stop();\n } catch {\n // ignored — exit handler has failsafe reset\n }\n void asyncCleanup().finally(() => process.exit(0));\n};\nprocess.on('SIGINT', handleTermSignal);\nprocess.on('SIGTERM', handleTermSignal);\nprocess.on('SIGHUP', handleTermSignal);\n\nfunction hasEconnrefused(err: unknown, depth = 0): boolean {\n if (!err || depth > 5) return false;\n const e = err as any;\n if (e.code === 'ECONNREFUSED') return true;\n if (e.cause) return hasEconnrefused(e.cause, depth + 1);\n // AggregateError has .errors array\n if (Array.isArray(e.errors)) return e.errors.some((inner: unknown) => hasEconnrefused(inner, depth + 1));\n return false;\n}\n\nfunction pluginMain(args: string[]): void {\n if (args[0] !== 'scaffold') {\n process.stderr.write('Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\\n');\n process.exit(1);\n }\n\n const dir = args[1];\n if (!dir) {\n process.stderr.write('Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\\n');\n process.exit(1);\n }\n\n const id = readFlag(args, '--id');\n const name = readFlag(args, '--name');\n const targetDir = scaffoldPlugin(dir, { ...(id ? { id } : {}), ...(name ? { name } : {}) });\n process.stdout.write(`${formatScaffoldSuccess(targetDir)}\\n`);\n}\n\nfunction readFlag(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index === -1) return undefined;\n const value = args[index + 1];\n if (!value || value.startsWith('--')) {\n throw new Error(`Missing value for ${flag}`);\n }\n return value;\n}\n\nfunction handleFatalError(error: unknown): never {\n // Always write to real stderr, even if console.error was overridden\n const write = (msg: string) => process.stderr.write(msg + '\\n');\n\n if (hasEconnrefused(error)) {\n const settings = loadSettings();\n const connStr = settings.storage?.pg?.connectionString;\n const target = connStr ?? 'localhost:5432';\n write(\n `\\nFailed to connect to PostgreSQL at ${target}.` +\n `\\nMake sure the database is running and accessible.` +\n `\\n\\nTo switch back to LibSQL:` +\n `\\n Set MASTRA_STORAGE_BACKEND=libsql or change the backend in /settings\\n`,\n );\n process.exit(1);\n }\n\n const msg = `Fatal error: ${error instanceof Error ? error.message : String(error)}`;\n write(msg);\n // Write crash log to file so it persists even if terminal closes\n try {\n const crashLog = `[${new Date().toISOString()}] ${msg}\\n${error instanceof Error && error.stack ? error.stack + '\\n' : ''}`;\n fs.appendFileSync('/tmp/mastra-crash.log', crashLog);\n } catch {}\n if (error instanceof Error && error.stack) {\n write(error.stack);\n }\n process.exit(1);\n}\n\nasync function main() {\n if (process.argv[2] === 'plugin') {\n return pluginMain(process.argv.slice(3));\n }\n\n if (hasHeadlessFlag(process.argv) || process.argv.includes('--help') || process.argv.includes('-h')) {\n return runMCCli();\n }\n\n if (process.argv.includes('--acp')) {\n const { acpMain } = await import('@mastra/code-sdk/acp/index');\n return acpMain({ dangerousAutoApprove: process.argv.includes('--dangerous-auto-approve') });\n }\n\n // When stdin is piped (e.g. `cat foo | mastracode`), drain the pipe fully\n // before starting the TUI. The drain blocks until the sender process exits\n // and closes its stdout, so we never see partial output.\n let pipedInput: string | null = null;\n if (!process.stdin.isTTY) {\n process.stderr.write('Reading piped input...\\n');\n pipedInput = await drainPipedStdin();\n\n // Always reopen a real TTY — even if the pipe was empty, the original\n // stdin is consumed/closed and the TUI needs a live TTY for keyboard input.\n const reopenedStdin = reopenStdinFromTTY();\n if (!reopenedStdin) {\n process.stderr.write('No TTY available — falling back to headless mode.\\n');\n return runMCCli(pipedInput);\n }\n }\n\n return tuiMain(pipedInput);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAIA,wBAAgB,iBAAiB,IAAI,MAAM,CAO1C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mastracode",
|
|
3
|
-
"version": "0.31.
|
|
3
|
+
"version": "0.31.1-alpha.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -100,25 +100,25 @@
|
|
|
100
100
|
"yaml": "^2.7.1",
|
|
101
101
|
"zod": "^4.3.6",
|
|
102
102
|
"@mastra/agent-browser": "0.4.1",
|
|
103
|
-
"@mastra/
|
|
104
|
-
"@mastra/
|
|
105
|
-
"@mastra/duckdb": "1.5.1",
|
|
103
|
+
"@mastra/core": "1.51.1-alpha.0",
|
|
104
|
+
"@mastra/code-sdk": "^0.1.1-alpha.0",
|
|
106
105
|
"@mastra/github-signals": "0.2.2",
|
|
106
|
+
"@mastra/duckdb": "1.5.1",
|
|
107
107
|
"@mastra/fastembed": "1.2.0",
|
|
108
|
-
"@mastra/libsql": "1.16.0
|
|
109
|
-
"@mastra/
|
|
110
|
-
"@mastra/
|
|
111
|
-
"@mastra/pg": "1.
|
|
112
|
-
"@mastra/
|
|
113
|
-
"@mastra/schema-compat": "1.3.4
|
|
114
|
-
"@mastra/
|
|
108
|
+
"@mastra/libsql": "1.16.0",
|
|
109
|
+
"@mastra/memory": "1.23.1-alpha.0",
|
|
110
|
+
"@mastra/observability": "1.16.1",
|
|
111
|
+
"@mastra/pg": "1.16.0",
|
|
112
|
+
"@mastra/stagehand": "0.3.1-alpha.0",
|
|
113
|
+
"@mastra/schema-compat": "1.3.4",
|
|
114
|
+
"@mastra/mcp": "1.14.0",
|
|
115
115
|
"@mastra/tavily": "1.1.0",
|
|
116
116
|
"@mastra/voice-deepgram": "0.13.0",
|
|
117
117
|
"@mastra/voice-openai": "0.13.0"
|
|
118
118
|
},
|
|
119
119
|
"devDependencies": {
|
|
120
120
|
"@copilotkit/aimock": "^1.29.0",
|
|
121
|
-
"@types/node": "22.
|
|
121
|
+
"@types/node": "22.20.1",
|
|
122
122
|
"@vitest/coverage-v8": "4.1.10",
|
|
123
123
|
"@vitest/ui": "4.1.10",
|
|
124
124
|
"@xterm/headless": "6.0.0",
|
|
@@ -128,8 +128,8 @@
|
|
|
128
128
|
"typescript": "^6.0.3",
|
|
129
129
|
"typescript-eslint": "^8.57.0",
|
|
130
130
|
"vitest": "4.1.10",
|
|
131
|
-
"@internal/lint": "0.0.
|
|
132
|
-
"@internal/types-builder": "0.0.
|
|
131
|
+
"@internal/lint": "0.0.114",
|
|
132
|
+
"@internal/types-builder": "0.0.89"
|
|
133
133
|
},
|
|
134
134
|
"engines": {
|
|
135
135
|
"node": ">=22.19.0"
|