mstro-app 0.1.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +177 -0
  3. package/bin/commands/config.js +145 -0
  4. package/bin/commands/login.js +313 -0
  5. package/bin/commands/logout.js +75 -0
  6. package/bin/commands/status.js +197 -0
  7. package/bin/commands/whoami.js +161 -0
  8. package/bin/configure-claude.js +298 -0
  9. package/bin/mstro.js +581 -0
  10. package/bin/postinstall.js +45 -0
  11. package/bin/release.sh +110 -0
  12. package/dist/server/cli/headless/claude-invoker.d.ts +17 -0
  13. package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -0
  14. package/dist/server/cli/headless/claude-invoker.js +311 -0
  15. package/dist/server/cli/headless/claude-invoker.js.map +1 -0
  16. package/dist/server/cli/headless/index.d.ts +13 -0
  17. package/dist/server/cli/headless/index.d.ts.map +1 -0
  18. package/dist/server/cli/headless/index.js +10 -0
  19. package/dist/server/cli/headless/index.js.map +1 -0
  20. package/dist/server/cli/headless/mcp-config.d.ts +11 -0
  21. package/dist/server/cli/headless/mcp-config.d.ts.map +1 -0
  22. package/dist/server/cli/headless/mcp-config.js +76 -0
  23. package/dist/server/cli/headless/mcp-config.js.map +1 -0
  24. package/dist/server/cli/headless/output-utils.d.ts +33 -0
  25. package/dist/server/cli/headless/output-utils.d.ts.map +1 -0
  26. package/dist/server/cli/headless/output-utils.js +101 -0
  27. package/dist/server/cli/headless/output-utils.js.map +1 -0
  28. package/dist/server/cli/headless/prompt-utils.d.ts +21 -0
  29. package/dist/server/cli/headless/prompt-utils.d.ts.map +1 -0
  30. package/dist/server/cli/headless/prompt-utils.js +84 -0
  31. package/dist/server/cli/headless/prompt-utils.js.map +1 -0
  32. package/dist/server/cli/headless/runner.d.ts +24 -0
  33. package/dist/server/cli/headless/runner.d.ts.map +1 -0
  34. package/dist/server/cli/headless/runner.js +99 -0
  35. package/dist/server/cli/headless/runner.js.map +1 -0
  36. package/dist/server/cli/headless/types.d.ts +106 -0
  37. package/dist/server/cli/headless/types.d.ts.map +1 -0
  38. package/dist/server/cli/headless/types.js +4 -0
  39. package/dist/server/cli/headless/types.js.map +1 -0
  40. package/dist/server/cli/improvisation-session-manager.d.ts +155 -0
  41. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -0
  42. package/dist/server/cli/improvisation-session-manager.js +415 -0
  43. package/dist/server/cli/improvisation-session-manager.js.map +1 -0
  44. package/dist/server/index.d.ts +2 -0
  45. package/dist/server/index.d.ts.map +1 -0
  46. package/dist/server/index.js +386 -0
  47. package/dist/server/index.js.map +1 -0
  48. package/dist/server/mcp/bouncer-cli.d.ts +3 -0
  49. package/dist/server/mcp/bouncer-cli.d.ts.map +1 -0
  50. package/dist/server/mcp/bouncer-cli.js +99 -0
  51. package/dist/server/mcp/bouncer-cli.js.map +1 -0
  52. package/dist/server/mcp/bouncer-integration.d.ts +36 -0
  53. package/dist/server/mcp/bouncer-integration.d.ts.map +1 -0
  54. package/dist/server/mcp/bouncer-integration.js +301 -0
  55. package/dist/server/mcp/bouncer-integration.js.map +1 -0
  56. package/dist/server/mcp/security-audit.d.ts +52 -0
  57. package/dist/server/mcp/security-audit.d.ts.map +1 -0
  58. package/dist/server/mcp/security-audit.js +118 -0
  59. package/dist/server/mcp/security-audit.js.map +1 -0
  60. package/dist/server/mcp/security-patterns.d.ts +73 -0
  61. package/dist/server/mcp/security-patterns.d.ts.map +1 -0
  62. package/dist/server/mcp/security-patterns.js +247 -0
  63. package/dist/server/mcp/security-patterns.js.map +1 -0
  64. package/dist/server/mcp/server.d.ts +3 -0
  65. package/dist/server/mcp/server.d.ts.map +1 -0
  66. package/dist/server/mcp/server.js +146 -0
  67. package/dist/server/mcp/server.js.map +1 -0
  68. package/dist/server/routes/files.d.ts +9 -0
  69. package/dist/server/routes/files.d.ts.map +1 -0
  70. package/dist/server/routes/files.js +24 -0
  71. package/dist/server/routes/files.js.map +1 -0
  72. package/dist/server/routes/improvise.d.ts +3 -0
  73. package/dist/server/routes/improvise.d.ts.map +1 -0
  74. package/dist/server/routes/improvise.js +72 -0
  75. package/dist/server/routes/improvise.js.map +1 -0
  76. package/dist/server/routes/index.d.ts +10 -0
  77. package/dist/server/routes/index.d.ts.map +1 -0
  78. package/dist/server/routes/index.js +12 -0
  79. package/dist/server/routes/index.js.map +1 -0
  80. package/dist/server/routes/instances.d.ts +10 -0
  81. package/dist/server/routes/instances.d.ts.map +1 -0
  82. package/dist/server/routes/instances.js +47 -0
  83. package/dist/server/routes/instances.js.map +1 -0
  84. package/dist/server/routes/notifications.d.ts +3 -0
  85. package/dist/server/routes/notifications.d.ts.map +1 -0
  86. package/dist/server/routes/notifications.js +136 -0
  87. package/dist/server/routes/notifications.js.map +1 -0
  88. package/dist/server/services/analytics.d.ts +56 -0
  89. package/dist/server/services/analytics.d.ts.map +1 -0
  90. package/dist/server/services/analytics.js +240 -0
  91. package/dist/server/services/analytics.js.map +1 -0
  92. package/dist/server/services/auth.d.ts +26 -0
  93. package/dist/server/services/auth.d.ts.map +1 -0
  94. package/dist/server/services/auth.js +71 -0
  95. package/dist/server/services/auth.js.map +1 -0
  96. package/dist/server/services/client-id.d.ts +10 -0
  97. package/dist/server/services/client-id.d.ts.map +1 -0
  98. package/dist/server/services/client-id.js +61 -0
  99. package/dist/server/services/client-id.js.map +1 -0
  100. package/dist/server/services/credentials.d.ts +39 -0
  101. package/dist/server/services/credentials.d.ts.map +1 -0
  102. package/dist/server/services/credentials.js +110 -0
  103. package/dist/server/services/credentials.js.map +1 -0
  104. package/dist/server/services/files.d.ts +119 -0
  105. package/dist/server/services/files.d.ts.map +1 -0
  106. package/dist/server/services/files.js +560 -0
  107. package/dist/server/services/files.js.map +1 -0
  108. package/dist/server/services/instances.d.ts +52 -0
  109. package/dist/server/services/instances.d.ts.map +1 -0
  110. package/dist/server/services/instances.js +241 -0
  111. package/dist/server/services/instances.js.map +1 -0
  112. package/dist/server/services/pathUtils.d.ts +47 -0
  113. package/dist/server/services/pathUtils.d.ts.map +1 -0
  114. package/dist/server/services/pathUtils.js +124 -0
  115. package/dist/server/services/pathUtils.js.map +1 -0
  116. package/dist/server/services/platform.d.ts +72 -0
  117. package/dist/server/services/platform.d.ts.map +1 -0
  118. package/dist/server/services/platform.js +368 -0
  119. package/dist/server/services/platform.js.map +1 -0
  120. package/dist/server/services/sentry.d.ts +5 -0
  121. package/dist/server/services/sentry.d.ts.map +1 -0
  122. package/dist/server/services/sentry.js +71 -0
  123. package/dist/server/services/sentry.js.map +1 -0
  124. package/dist/server/services/terminal/pty-manager.d.ts +149 -0
  125. package/dist/server/services/terminal/pty-manager.d.ts.map +1 -0
  126. package/dist/server/services/terminal/pty-manager.js +377 -0
  127. package/dist/server/services/terminal/pty-manager.js.map +1 -0
  128. package/dist/server/services/terminal/tmux-manager.d.ts +82 -0
  129. package/dist/server/services/terminal/tmux-manager.d.ts.map +1 -0
  130. package/dist/server/services/terminal/tmux-manager.js +352 -0
  131. package/dist/server/services/terminal/tmux-manager.js.map +1 -0
  132. package/dist/server/services/websocket/autocomplete.d.ts +50 -0
  133. package/dist/server/services/websocket/autocomplete.d.ts.map +1 -0
  134. package/dist/server/services/websocket/autocomplete.js +361 -0
  135. package/dist/server/services/websocket/autocomplete.js.map +1 -0
  136. package/dist/server/services/websocket/file-utils.d.ts +44 -0
  137. package/dist/server/services/websocket/file-utils.d.ts.map +1 -0
  138. package/dist/server/services/websocket/file-utils.js +272 -0
  139. package/dist/server/services/websocket/file-utils.js.map +1 -0
  140. package/dist/server/services/websocket/handler.d.ts +246 -0
  141. package/dist/server/services/websocket/handler.d.ts.map +1 -0
  142. package/dist/server/services/websocket/handler.js +1771 -0
  143. package/dist/server/services/websocket/handler.js.map +1 -0
  144. package/dist/server/services/websocket/index.d.ts +11 -0
  145. package/dist/server/services/websocket/index.d.ts.map +1 -0
  146. package/dist/server/services/websocket/index.js +14 -0
  147. package/dist/server/services/websocket/index.js.map +1 -0
  148. package/dist/server/services/websocket/types.d.ts +214 -0
  149. package/dist/server/services/websocket/types.d.ts.map +1 -0
  150. package/dist/server/services/websocket/types.js +4 -0
  151. package/dist/server/services/websocket/types.js.map +1 -0
  152. package/dist/server/utils/agent-manager.d.ts +69 -0
  153. package/dist/server/utils/agent-manager.d.ts.map +1 -0
  154. package/dist/server/utils/agent-manager.js +269 -0
  155. package/dist/server/utils/agent-manager.js.map +1 -0
  156. package/dist/server/utils/paths.d.ts +25 -0
  157. package/dist/server/utils/paths.d.ts.map +1 -0
  158. package/dist/server/utils/paths.js +38 -0
  159. package/dist/server/utils/paths.js.map +1 -0
  160. package/dist/server/utils/port-manager.d.ts +10 -0
  161. package/dist/server/utils/port-manager.d.ts.map +1 -0
  162. package/dist/server/utils/port-manager.js +60 -0
  163. package/dist/server/utils/port-manager.js.map +1 -0
  164. package/dist/server/utils/port.d.ts +26 -0
  165. package/dist/server/utils/port.d.ts.map +1 -0
  166. package/dist/server/utils/port.js +83 -0
  167. package/dist/server/utils/port.js.map +1 -0
  168. package/hooks/bouncer.sh +138 -0
  169. package/package.json +74 -0
  170. package/server/README.md +191 -0
  171. package/server/cli/headless/claude-invoker.ts +415 -0
  172. package/server/cli/headless/index.ts +39 -0
  173. package/server/cli/headless/mcp-config.ts +87 -0
  174. package/server/cli/headless/output-utils.ts +109 -0
  175. package/server/cli/headless/prompt-utils.ts +108 -0
  176. package/server/cli/headless/runner.ts +133 -0
  177. package/server/cli/headless/types.ts +118 -0
  178. package/server/cli/improvisation-session-manager.ts +531 -0
  179. package/server/index.ts +456 -0
  180. package/server/mcp/README.md +122 -0
  181. package/server/mcp/bouncer-cli.ts +127 -0
  182. package/server/mcp/bouncer-integration.ts +430 -0
  183. package/server/mcp/security-audit.ts +180 -0
  184. package/server/mcp/security-patterns.ts +290 -0
  185. package/server/mcp/server.ts +174 -0
  186. package/server/routes/files.ts +29 -0
  187. package/server/routes/improvise.ts +82 -0
  188. package/server/routes/index.ts +13 -0
  189. package/server/routes/instances.ts +54 -0
  190. package/server/routes/notifications.ts +158 -0
  191. package/server/services/analytics.ts +277 -0
  192. package/server/services/auth.ts +80 -0
  193. package/server/services/client-id.ts +68 -0
  194. package/server/services/credentials.ts +134 -0
  195. package/server/services/files.ts +710 -0
  196. package/server/services/instances.ts +275 -0
  197. package/server/services/pathUtils.ts +158 -0
  198. package/server/services/platform.test.ts +1314 -0
  199. package/server/services/platform.ts +435 -0
  200. package/server/services/sentry.ts +81 -0
  201. package/server/services/terminal/pty-manager.ts +464 -0
  202. package/server/services/terminal/tmux-manager.ts +426 -0
  203. package/server/services/websocket/autocomplete.ts +438 -0
  204. package/server/services/websocket/file-utils.ts +305 -0
  205. package/server/services/websocket/handler.test.ts +20 -0
  206. package/server/services/websocket/handler.ts +2047 -0
  207. package/server/services/websocket/index.ts +40 -0
  208. package/server/services/websocket/types.ts +339 -0
  209. package/server/tsconfig.json +19 -0
  210. package/server/utils/agent-manager.ts +323 -0
  211. package/server/utils/paths.ts +45 -0
  212. package/server/utils/port-manager.ts +70 -0
  213. package/server/utils/port.ts +102 -0
package/bin/release.sh ADDED
@@ -0,0 +1,110 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # Release script for mstro
5
+ # Usage: ./bin/release.sh [major|minor|patch]
6
+ #
7
+ # This script:
8
+ # 1. Bumps the version in package.json
9
+ # 2. Updates CHANGELOG.md with git commits since last tag
10
+ # 3. Commits the changes
11
+ # 4. Creates a git tag
12
+ # 5. Pushes to GitHub (branch + tag)
13
+ #
14
+ # After push, run `npm publish` to publish to npmjs.
15
+
16
+ BUMP_TYPE="${1:-patch}"
17
+
18
+ if [[ "$BUMP_TYPE" != "major" && "$BUMP_TYPE" != "minor" && "$BUMP_TYPE" != "patch" ]]; then
19
+ echo "Usage: $0 [major|minor|patch]"
20
+ exit 1
21
+ fi
22
+
23
+ # Ensure we're in the cli directory
24
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
25
+ CLI_DIR="$(dirname "$SCRIPT_DIR")"
26
+ cd "$CLI_DIR"
27
+
28
+ # Ensure working directory is clean
29
+ if [[ -n "$(git status --porcelain)" ]]; then
30
+ echo "Error: Working directory is not clean. Commit or stash changes first."
31
+ exit 1
32
+ fi
33
+
34
+ # Get current version
35
+ CURRENT_VERSION=$(node -e "console.log(require('./package.json').version)")
36
+ echo "Current version: $CURRENT_VERSION"
37
+
38
+ # Calculate new version
39
+ IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION"
40
+ case "$BUMP_TYPE" in
41
+ major) MAJOR=$((MAJOR + 1)); MINOR=0; PATCH=0 ;;
42
+ minor) MINOR=$((MINOR + 1)); PATCH=0 ;;
43
+ patch) PATCH=$((PATCH + 1)) ;;
44
+ esac
45
+ NEW_VERSION="$MAJOR.$MINOR.$PATCH"
46
+ echo "New version: $NEW_VERSION"
47
+
48
+ # Get the last tag (or first commit if no tags)
49
+ LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || git rev-list --max-parents=0 HEAD)
50
+
51
+ # Generate changelog entry from git commits
52
+ CHANGELOG_ENTRY="## $NEW_VERSION ($(date +%Y-%m-%d))\n\n"
53
+ COMMITS=$(git log "$LAST_TAG"..HEAD --pretty=format:"- %s" --no-merges 2>/dev/null || git log --pretty=format:"- %s" --no-merges)
54
+
55
+ if [[ -z "$COMMITS" ]]; then
56
+ CHANGELOG_ENTRY+="- Release $NEW_VERSION\n"
57
+ else
58
+ CHANGELOG_ENTRY+="$COMMITS\n"
59
+ fi
60
+
61
+ # Update CHANGELOG.md
62
+ if [[ -f CHANGELOG.md ]]; then
63
+ # Insert new entry after the header
64
+ EXISTING=$(cat CHANGELOG.md)
65
+ {
66
+ echo "# Changelog"
67
+ echo ""
68
+ echo -e "$CHANGELOG_ENTRY"
69
+ # Strip the first line (# Changelog) and any leading blank lines from existing
70
+ echo "$EXISTING" | tail -n +2
71
+ } > CHANGELOG.md
72
+ else
73
+ {
74
+ echo "# Changelog"
75
+ echo ""
76
+ echo -e "$CHANGELOG_ENTRY"
77
+ } > CHANGELOG.md
78
+ fi
79
+
80
+ # Bump version in package.json (without npm creating a git tag)
81
+ npm version "$NEW_VERSION" --no-git-tag-version
82
+
83
+ echo ""
84
+ echo "Updated:"
85
+ echo " - package.json: $CURRENT_VERSION -> $NEW_VERSION"
86
+ echo " - CHANGELOG.md: added $NEW_VERSION entry"
87
+
88
+ # Commit and tag
89
+ git add package.json package-lock.json CHANGELOG.md
90
+ git commit -m "release: v$NEW_VERSION"
91
+ git tag -a "v$NEW_VERSION" -m "v$NEW_VERSION"
92
+
93
+ echo ""
94
+ echo "Created commit and tag v$NEW_VERSION"
95
+
96
+ # Push
97
+ echo ""
98
+ read -rp "Push to origin? (y/N) " CONFIRM
99
+ if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then
100
+ git push origin HEAD
101
+ git push origin "v$NEW_VERSION"
102
+ echo ""
103
+ echo "Pushed to GitHub. Now run 'npm publish' to publish to npmjs."
104
+ else
105
+ echo ""
106
+ echo "Skipped push. Run manually:"
107
+ echo " git push origin HEAD"
108
+ echo " git push origin v$NEW_VERSION"
109
+ echo " npm publish"
110
+ fi
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Claude Invoker
3
+ *
4
+ * Handles spawning and managing Claude CLI processes.
5
+ */
6
+ import { type ChildProcess } from 'node:child_process';
7
+ import type { ExecutionResult, ResolvedHeadlessConfig } from './types.js';
8
+ export interface ClaudeInvokerOptions {
9
+ config: ResolvedHeadlessConfig;
10
+ runningProcesses: Map<number, ChildProcess>;
11
+ }
12
+ /**
13
+ * Execute a Claude CLI command for a single movement
14
+ * Supports multimodal prompts via --input-format stream-json when image attachments are present
15
+ */
16
+ export declare function executeClaudeCommand(prompt: string, _movementId: string, _sessionNumber: number, options: ClaudeInvokerOptions): Promise<ExecutionResult>;
17
+ //# sourceMappingURL=claude-invoker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-invoker.d.ts","sourceRoot":"","sources":["../../../../server/cli/headless/claude-invoker.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,oBAAoB,CAAC;AAI9D,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EAEvB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC7C;AAqRD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC,CA0G1B"}
@@ -0,0 +1,311 @@
1
+ // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file for details.
3
+ /**
4
+ * Claude Invoker
5
+ *
6
+ * Handles spawning and managing Claude CLI processes.
7
+ */
8
+ import { spawn } from 'node:child_process';
9
+ import { generateMcpConfig } from './mcp-config.js';
10
+ import { detectErrorInStderr, } from './output-utils.js';
11
+ import { buildMultimodalMessage } from './prompt-utils.js';
12
+ function handleSessionCapture(parsed, captured) {
13
+ if (parsed.type === 'system' && parsed.subtype === 'init' && parsed.session_id) {
14
+ captured.claudeSessionId = parsed.session_id;
15
+ }
16
+ if (parsed.type === 'result' && parsed.session_id && !captured.claudeSessionId) {
17
+ captured.claudeSessionId = parsed.session_id;
18
+ }
19
+ }
20
+ function handleThinkingDelta(event, ctx) {
21
+ if (event.type !== 'content_block_delta' ||
22
+ event.delta?.type !== 'thinking_delta' ||
23
+ !event.delta?.thinking) {
24
+ return ctx.accumulatedThinking;
25
+ }
26
+ const thinking = event.delta.thinking;
27
+ const updated = ctx.accumulatedThinking + thinking;
28
+ if (ctx.config.thinkingCallback) {
29
+ ctx.config.thinkingCallback(thinking);
30
+ }
31
+ else if (ctx.config.outputCallback) {
32
+ ctx.config.outputCallback(thinking);
33
+ }
34
+ else {
35
+ process.stdout.write(thinking);
36
+ }
37
+ return updated;
38
+ }
39
+ function handleTextDelta(event, ctx) {
40
+ if (event.type !== 'content_block_delta' ||
41
+ event.delta?.type !== 'text_delta' ||
42
+ !event.delta?.text) {
43
+ return ctx.accumulatedAssistantResponse;
44
+ }
45
+ const text = event.delta.text;
46
+ const updated = ctx.accumulatedAssistantResponse + text;
47
+ if (ctx.config.outputCallback) {
48
+ ctx.config.outputCallback(text);
49
+ }
50
+ return updated;
51
+ }
52
+ function handleToolStart(event, ctx) {
53
+ if (event.type !== 'content_block_start' ||
54
+ event.content_block?.type !== 'tool_use') {
55
+ return;
56
+ }
57
+ const toolName = event.content_block.name;
58
+ const toolId = event.content_block.id;
59
+ const index = event.index;
60
+ ctx.toolInputBuffers.set(index, {
61
+ name: toolName,
62
+ id: toolId,
63
+ inputJson: '',
64
+ startTime: Date.now()
65
+ });
66
+ if (ctx.config.toolUseCallback) {
67
+ ctx.config.toolUseCallback({ type: 'tool_start', toolName, toolId, index });
68
+ }
69
+ }
70
+ function handleToolInputDelta(event, ctx) {
71
+ if (event.type !== 'content_block_delta' ||
72
+ event.delta?.type !== 'input_json_delta') {
73
+ return;
74
+ }
75
+ const index = event.index;
76
+ const partialJson = event.delta.partial_json;
77
+ const toolBuffer = ctx.toolInputBuffers.get(index);
78
+ if (toolBuffer) {
79
+ toolBuffer.inputJson += partialJson;
80
+ }
81
+ if (ctx.config.toolUseCallback) {
82
+ ctx.config.toolUseCallback({ type: 'tool_input_delta', partialJson, index });
83
+ }
84
+ }
85
+ function handleToolComplete(event, ctx) {
86
+ if (event.type !== 'content_block_stop') {
87
+ return;
88
+ }
89
+ const index = event.index;
90
+ const toolBuffer = ctx.toolInputBuffers.get(index);
91
+ if (!toolBuffer) {
92
+ return;
93
+ }
94
+ let completeInput = {};
95
+ try {
96
+ completeInput = JSON.parse(toolBuffer.inputJson);
97
+ }
98
+ catch (_e) {
99
+ // Input might not be valid JSON yet
100
+ }
101
+ ctx.accumulatedToolUse.push({
102
+ toolName: toolBuffer.name,
103
+ toolId: toolBuffer.id,
104
+ toolInput: completeInput,
105
+ startTime: toolBuffer.startTime
106
+ });
107
+ if (ctx.config.toolUseCallback) {
108
+ ctx.config.toolUseCallback({
109
+ type: 'tool_complete',
110
+ toolName: toolBuffer.name,
111
+ toolId: toolBuffer.id,
112
+ index,
113
+ completeInput
114
+ });
115
+ }
116
+ }
117
+ function handleToolResult(parsed, ctx) {
118
+ if (parsed.type !== 'user' || !parsed.message?.content) {
119
+ return;
120
+ }
121
+ for (const content of parsed.message.content) {
122
+ if (content.type !== 'tool_result') {
123
+ continue;
124
+ }
125
+ const toolId = content.tool_use_id;
126
+ const result = content.content;
127
+ const isError = content.is_error || false;
128
+ const resultStr = typeof result === 'string' ? result : JSON.stringify(result);
129
+ const toolEntry = ctx.accumulatedToolUse.find(t => t.toolId === toolId);
130
+ if (toolEntry) {
131
+ toolEntry.result = resultStr;
132
+ toolEntry.isError = isError;
133
+ toolEntry.duration = Date.now() - toolEntry.startTime;
134
+ }
135
+ if (ctx.config.toolUseCallback) {
136
+ ctx.config.toolUseCallback({ type: 'tool_result', toolId, result: resultStr, isError });
137
+ }
138
+ }
139
+ }
140
+ function processStreamLines(buffer, sessionCapture, ctx) {
141
+ const lines = buffer.split('\n');
142
+ const remainder = lines.pop() || '';
143
+ for (const line of lines) {
144
+ if (!line.trim())
145
+ continue;
146
+ try {
147
+ const parsed = JSON.parse(line);
148
+ handleSessionCapture(parsed, sessionCapture);
149
+ processStreamEvent(parsed, ctx);
150
+ }
151
+ catch (_e) {
152
+ // Ignore parse errors
153
+ }
154
+ }
155
+ return remainder;
156
+ }
157
+ function processStreamEvent(parsed, ctx) {
158
+ if (parsed.type === 'stream_event' && parsed.event) {
159
+ const event = parsed.event;
160
+ ctx.accumulatedThinking = handleThinkingDelta(event, ctx);
161
+ ctx.accumulatedAssistantResponse = handleTextDelta(event, ctx);
162
+ handleToolStart(event, ctx);
163
+ handleToolInputDelta(event, ctx);
164
+ handleToolComplete(event, ctx);
165
+ }
166
+ handleToolResult(parsed, ctx);
167
+ }
168
+ // ========== Error Handling ==========
169
+ const SPAWN_ERROR_MAP = {
170
+ ENOENT: {
171
+ code: 'CLAUDE_NOT_INSTALLED',
172
+ message: 'Claude Code is not installed or not in PATH. Please install Claude Code: npm install -g @anthropic-ai/claude-code'
173
+ },
174
+ EACCES: {
175
+ code: 'PERMISSION_DENIED',
176
+ message: 'Permission denied when running Claude Code. Please check file permissions.'
177
+ }
178
+ };
179
+ function handleSpawnError(error, config, reject) {
180
+ const mapped = error.code ? SPAWN_ERROR_MAP[error.code] : undefined;
181
+ if (!mapped) {
182
+ reject(error);
183
+ return;
184
+ }
185
+ const formatted = `[[MSTRO_ERROR:${mapped.code}]] ${mapped.message}`;
186
+ if (config.outputCallback) {
187
+ config.outputCallback(`\n${formatted}\n`);
188
+ }
189
+ reject(new Error(formatted));
190
+ }
191
+ // ========== Argument Building ==========
192
+ function buildClaudeArgs(config, prompt, hasImageAttachments, useStreamJson, mcpConfigPath) {
193
+ const args = ['--print'];
194
+ if (useStreamJson) {
195
+ args.push('--output-format', 'stream-json', '--include-partial-messages', '--verbose');
196
+ }
197
+ if (hasImageAttachments) {
198
+ args.push('--input-format', 'stream-json');
199
+ }
200
+ if (config.claudeSessionId) {
201
+ args.push('--resume', config.claudeSessionId);
202
+ }
203
+ else if (config.continueSession) {
204
+ args.push('--continue');
205
+ }
206
+ if (mcpConfigPath) {
207
+ args.push('--mcp-config', mcpConfigPath);
208
+ args.push('--permission-prompt-tool', 'mcp__mstro-bouncer__approval_prompt');
209
+ }
210
+ if (!hasImageAttachments) {
211
+ args.push(prompt);
212
+ }
213
+ return args;
214
+ }
215
+ /**
216
+ * Execute a Claude CLI command for a single movement
217
+ * Supports multimodal prompts via --input-format stream-json when image attachments are present
218
+ */
219
+ export async function executeClaudeCommand(prompt, _movementId, _sessionNumber, options) {
220
+ const { config, runningProcesses } = options;
221
+ const perfStart = Date.now();
222
+ if (config.verbose) {
223
+ console.log(`[PERF] executeMovement started`);
224
+ }
225
+ const hasImageAttachments = config.imageAttachments && config.imageAttachments.length > 0;
226
+ const useStreamJson = hasImageAttachments || config.thinkingCallback || config.outputCallback || config.toolUseCallback;
227
+ const mcpConfigPath = generateMcpConfig(config.workingDir, config.verbose);
228
+ const args = buildClaudeArgs(config, prompt, !!hasImageAttachments, !!useStreamJson, mcpConfigPath);
229
+ if (config.verbose) {
230
+ console.log(`[PERF] About to spawn: ${Date.now() - perfStart}ms`);
231
+ console.log(`[PERF] Command: ${config.claudeCommand} ${args.join(' ')}`);
232
+ }
233
+ const claudeProcess = spawn(config.claudeCommand, args, {
234
+ cwd: config.workingDir,
235
+ env: { ...process.env },
236
+ stdio: [hasImageAttachments ? 'pipe' : 'ignore', 'pipe', 'pipe']
237
+ });
238
+ if (hasImageAttachments && claudeProcess.stdin) {
239
+ const multimodalMessage = buildMultimodalMessage(prompt, config.imageAttachments);
240
+ claudeProcess.stdin.write(multimodalMessage);
241
+ claudeProcess.stdin.end();
242
+ }
243
+ if (claudeProcess.pid) {
244
+ runningProcesses.set(claudeProcess.pid, claudeProcess);
245
+ }
246
+ if (config.verbose) {
247
+ console.log(`[PERF] Spawned: ${Date.now() - perfStart}ms`);
248
+ }
249
+ let stdout = '';
250
+ let stderr = '';
251
+ let thinkingBuffer = '';
252
+ let firstStdoutReceived = false;
253
+ let errorAlreadySurfaced = false;
254
+ const sessionCapture = {};
255
+ const ctx = {
256
+ config,
257
+ accumulatedAssistantResponse: '',
258
+ accumulatedThinking: '',
259
+ accumulatedToolUse: [],
260
+ toolInputBuffers: new Map(),
261
+ };
262
+ claudeProcess.stdout.on('data', (data) => {
263
+ if (!firstStdoutReceived) {
264
+ firstStdoutReceived = true;
265
+ if (config.verbose) {
266
+ console.log(`[PERF] First stdout data: ${Date.now() - perfStart}ms`);
267
+ }
268
+ }
269
+ const chunk = data.toString();
270
+ stdout += chunk;
271
+ if (useStreamJson) {
272
+ thinkingBuffer = processStreamLines(thinkingBuffer + chunk, sessionCapture, ctx);
273
+ }
274
+ });
275
+ claudeProcess.stderr.on('data', async (data) => {
276
+ const chunk = data.toString();
277
+ stderr += chunk;
278
+ if (errorAlreadySurfaced)
279
+ return;
280
+ const error = detectErrorInStderr(stderr);
281
+ if (error) {
282
+ errorAlreadySurfaced = true;
283
+ if (config.outputCallback) {
284
+ config.outputCallback(`\n[[MSTRO_ERROR:${error.errorCode}]] ${error.message}\n`);
285
+ }
286
+ }
287
+ });
288
+ return new Promise((resolve, reject) => {
289
+ claudeProcess.on('close', (code) => {
290
+ if (claudeProcess.pid) {
291
+ runningProcesses.delete(claudeProcess.pid);
292
+ }
293
+ resolve({
294
+ output: stdout,
295
+ error: stderr || undefined,
296
+ exitCode: code || 0,
297
+ assistantResponse: ctx.accumulatedAssistantResponse || undefined,
298
+ thinkingOutput: ctx.accumulatedThinking || undefined,
299
+ toolUseHistory: ctx.accumulatedToolUse.length > 0 ? ctx.accumulatedToolUse : undefined,
300
+ claudeSessionId: sessionCapture.claudeSessionId
301
+ });
302
+ });
303
+ claudeProcess.on('error', (error) => {
304
+ if (claudeProcess.pid) {
305
+ runningProcesses.delete(claudeProcess.pid);
306
+ }
307
+ handleSpawnError(error, config, reject);
308
+ });
309
+ });
310
+ }
311
+ //# sourceMappingURL=claude-invoker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-invoker.js","sourceRoot":"","sources":["../../../../server/cli/headless/claude-invoker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Headless Runner Module
3
+ *
4
+ * Re-exports all headless runner components for backward compatibility.
5
+ */
6
+ export type { ClaudeInvokerOptions } from './claude-invoker.js';
7
+ export { executeClaudeCommand } from './claude-invoker.js';
8
+ export { generateMcpConfig } from './mcp-config.js';
9
+ export { detectErrorInStderr, ERROR_PATTERNS, estimateTokensFromOutput, extractCleanOutput, extractModifiedFiles } from './output-utils.js';
10
+ export { buildMultimodalMessage, enrichPromptWithContext, isApprovalPrompt } from './prompt-utils.js';
11
+ export { HeadlessRunner } from './runner.js';
12
+ export type { ExecutionResult, HeadlessConfig, ImageAttachment, ResolvedHeadlessConfig, SessionResult, SessionState, ToolUseAccumulator, ToolUseEvent } from './types.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/cli/headless/index.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,YAAY,EACV,eAAe,EACf,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACb,MAAM,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file for details.
3
+ export { executeClaudeCommand } from './claude-invoker.js';
4
+ // Utilities (for advanced usage)
5
+ export { generateMcpConfig } from './mcp-config.js';
6
+ export { detectErrorInStderr, ERROR_PATTERNS, estimateTokensFromOutput, extractCleanOutput, extractModifiedFiles } from './output-utils.js';
7
+ export { buildMultimodalMessage, enrichPromptWithContext, isApprovalPrompt } from './prompt-utils.js';
8
+ // Main runner class
9
+ export { HeadlessRunner } from './runner.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/cli/headless/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,gEAAgE;AAShE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,iCAAiC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAC3B,oBAAoB;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * MCP Configuration Generator
3
+ *
4
+ * Generates MCP config with bouncer + user's MCP servers from ~/.claude.json.
5
+ */
6
+ /**
7
+ * Generate MCP config with bouncer + user's MCP servers from ~/.claude.json.
8
+ * Writes to ~/.mstro/mcp-config.json for use with --mcp-config flag.
9
+ */
10
+ export declare function generateMcpConfig(workingDir: string, verbose?: boolean): string | null;
11
+ //# sourceMappingURL=mcp-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../../../server/cli/headless/mcp-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4CH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,OAAe,GAAG,MAAM,GAAG,IAAI,CAkC7F"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * MCP Configuration Generator
3
+ *
4
+ * Generates MCP config with bouncer + user's MCP servers from ~/.claude.json.
5
+ */
6
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
7
+ import { homedir } from 'node:os';
8
+ import { join } from 'node:path';
9
+ import { MCP_SERVER_PATH, MSTRO_ROOT } from '../../utils/paths.js';
10
+ /**
11
+ * Load user's MCP servers from ~/.claude.json (global + project-level)
12
+ */
13
+ function loadUserMcpServers(workingDir, verbose) {
14
+ const servers = {};
15
+ const claudeConfigPath = join(homedir(), '.claude.json');
16
+ if (!existsSync(claudeConfigPath)) {
17
+ return servers;
18
+ }
19
+ try {
20
+ const claudeConfig = JSON.parse(readFileSync(claudeConfigPath, 'utf-8'));
21
+ if (claudeConfig.mcpServers && typeof claudeConfig.mcpServers === 'object') {
22
+ Object.assign(servers, claudeConfig.mcpServers);
23
+ }
24
+ if (claudeConfig.projects && typeof claudeConfig.projects === 'object') {
25
+ for (const [projectPath, projectConfig] of Object.entries(claudeConfig.projects)) {
26
+ const projectServers = projectConfig?.mcpServers;
27
+ if (workingDir.startsWith(projectPath) && typeof projectServers === 'object') {
28
+ Object.assign(servers, projectServers);
29
+ }
30
+ }
31
+ }
32
+ if (verbose) {
33
+ console.log(`[${new Date().toISOString()}] Loaded ${Object.keys(servers).length} user MCP servers from ~/.claude.json`);
34
+ }
35
+ }
36
+ catch (parseError) {
37
+ console.error(`[${new Date().toISOString()}] Failed to parse ~/.claude.json: ${parseError.message}`);
38
+ }
39
+ return servers;
40
+ }
41
+ /**
42
+ * Generate MCP config with bouncer + user's MCP servers from ~/.claude.json.
43
+ * Writes to ~/.mstro/mcp-config.json for use with --mcp-config flag.
44
+ */
45
+ export function generateMcpConfig(workingDir, verbose = false) {
46
+ try {
47
+ if (!existsSync(MCP_SERVER_PATH)) {
48
+ console.error(`[${new Date().toISOString()}] MCP server not found at ${MCP_SERVER_PATH}`);
49
+ return null;
50
+ }
51
+ const mcpServers = {
52
+ 'mstro-bouncer': {
53
+ command: 'npx',
54
+ args: ['tsx', MCP_SERVER_PATH],
55
+ description: 'Mstro security bouncer for approving/denying Claude Code tool use',
56
+ env: { BOUNCER_USE_AI: 'true', MSTRO_ROOT: MSTRO_ROOT }
57
+ },
58
+ ...loadUserMcpServers(workingDir, verbose)
59
+ };
60
+ const configDir = join(homedir(), '.mstro');
61
+ if (!existsSync(configDir)) {
62
+ mkdirSync(configDir, { recursive: true });
63
+ }
64
+ const configPath = join(configDir, 'mcp-config.json');
65
+ writeFileSync(configPath, JSON.stringify({ mcpServers }, null, 2));
66
+ if (verbose) {
67
+ console.log(`[${new Date().toISOString()}] Generated MCP config at ${configPath} (${Object.keys(mcpServers).length} servers)`);
68
+ }
69
+ return configPath;
70
+ }
71
+ catch (error) {
72
+ console.error(`[${new Date().toISOString()}] Failed to generate MCP config: ${error.message}`);
73
+ return null;
74
+ }
75
+ }
76
+ //# sourceMappingURL=mcp-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../../server/cli/headless/mcp-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Output Utilities
3
+ *
4
+ * Utilities for processing and parsing Claude CLI output.
5
+ */
6
+ /**
7
+ * Extract clean output from Claude response
8
+ */
9
+ export declare function extractCleanOutput(rawOutput: string): string;
10
+ /**
11
+ * Estimate tokens from output
12
+ */
13
+ export declare function estimateTokensFromOutput(output: string): number;
14
+ /**
15
+ * Extract modified files from output (simplified)
16
+ */
17
+ export declare function extractModifiedFiles(output: string): string[];
18
+ /**
19
+ * Error patterns for detecting Claude Code errors in stderr
20
+ */
21
+ export declare const ERROR_PATTERNS: {
22
+ pattern: RegExp;
23
+ message: string;
24
+ errorCode: string;
25
+ }[];
26
+ /**
27
+ * Check stderr for known error patterns and return the first match
28
+ */
29
+ export declare function detectErrorInStderr(stderrBuffer: string): {
30
+ message: string;
31
+ errorCode: string;
32
+ } | null;
33
+ //# sourceMappingURL=output-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-utils.d.ts","sourceRoot":"","sources":["../../../../server/cli/headless/output-utils.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAiB5D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAW7D;AAED;;GAEG;AACH,eAAO,MAAM,cAAc;;;;GAuC1B,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOvG"}