@jungjaehoon/mama-os 0.32.1 → 0.32.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +15 -13
  3. package/dist/agent/agent-loop.d.ts +5 -0
  4. package/dist/agent/agent-loop.d.ts.map +1 -1
  5. package/dist/agent/agent-loop.js +160 -55
  6. package/dist/agent/agent-loop.js.map +1 -1
  7. package/dist/agent/backend-model-policy.d.ts +9 -0
  8. package/dist/agent/backend-model-policy.d.ts.map +1 -0
  9. package/dist/agent/backend-model-policy.js +21 -0
  10. package/dist/agent/backend-model-policy.js.map +1 -0
  11. package/dist/agent/backend-model-runner-factory.d.ts +27 -0
  12. package/dist/agent/backend-model-runner-factory.d.ts.map +1 -0
  13. package/dist/agent/backend-model-runner-factory.js +85 -0
  14. package/dist/agent/backend-model-runner-factory.js.map +1 -0
  15. package/dist/agent/cline-cli-adapter.d.ts +124 -0
  16. package/dist/agent/cline-cli-adapter.d.ts.map +1 -0
  17. package/dist/agent/cline-cli-adapter.js +1040 -0
  18. package/dist/agent/cline-cli-adapter.js.map +1 -0
  19. package/dist/agent/cline-native-tool-policy.d.ts +3 -0
  20. package/dist/agent/cline-native-tool-policy.d.ts.map +1 -0
  21. package/dist/agent/cline-native-tool-policy.js +50 -0
  22. package/dist/agent/cline-native-tool-policy.js.map +1 -0
  23. package/dist/agent/code-act/constants.d.ts +1 -1
  24. package/dist/agent/code-act/constants.d.ts.map +1 -1
  25. package/dist/agent/code-act/constants.js +13 -1
  26. package/dist/agent/code-act/constants.js.map +1 -1
  27. package/dist/agent/codex-app-server-process.d.ts +5 -0
  28. package/dist/agent/codex-app-server-process.d.ts.map +1 -1
  29. package/dist/agent/codex-app-server-process.js +30 -0
  30. package/dist/agent/codex-app-server-process.js.map +1 -1
  31. package/dist/agent/codex-auxiliary-tools.d.ts +17 -0
  32. package/dist/agent/codex-auxiliary-tools.d.ts.map +1 -0
  33. package/dist/agent/codex-auxiliary-tools.js +267 -0
  34. package/dist/agent/codex-auxiliary-tools.js.map +1 -0
  35. package/dist/agent/codex-home.d.ts.map +1 -1
  36. package/dist/agent/codex-home.js +1 -0
  37. package/dist/agent/codex-home.js.map +1 -1
  38. package/dist/agent/managed-agent-runtime-sync.d.ts.map +1 -1
  39. package/dist/agent/managed-agent-runtime-sync.js +17 -3
  40. package/dist/agent/managed-agent-runtime-sync.js.map +1 -1
  41. package/dist/agent/managed-agent-validation.js +1 -1
  42. package/dist/agent/managed-agent-validation.js.map +1 -1
  43. package/dist/agent/model-runner.d.ts +11 -1
  44. package/dist/agent/model-runner.d.ts.map +1 -1
  45. package/dist/agent/model-runner.js +12 -1
  46. package/dist/agent/model-runner.js.map +1 -1
  47. package/dist/agent/session-pool.d.ts +10 -9
  48. package/dist/agent/session-pool.d.ts.map +1 -1
  49. package/dist/agent/session-pool.js +12 -47
  50. package/dist/agent/session-pool.js.map +1 -1
  51. package/dist/agent/types.d.ts +18 -2
  52. package/dist/agent/types.d.ts.map +1 -1
  53. package/dist/agent/types.js.map +1 -1
  54. package/dist/api/graph-api.d.ts.map +1 -1
  55. package/dist/api/graph-api.js +15 -5
  56. package/dist/api/graph-api.js.map +1 -1
  57. package/dist/cli/commands/init.d.ts +1 -1
  58. package/dist/cli/commands/init.d.ts.map +1 -1
  59. package/dist/cli/commands/init.js +43 -10
  60. package/dist/cli/commands/init.js.map +1 -1
  61. package/dist/cli/commands/run.d.ts.map +1 -1
  62. package/dist/cli/commands/run.js +12 -0
  63. package/dist/cli/commands/run.js.map +1 -1
  64. package/dist/cli/commands/setup.d.ts +22 -0
  65. package/dist/cli/commands/setup.d.ts.map +1 -1
  66. package/dist/cli/commands/setup.js +79 -28
  67. package/dist/cli/commands/setup.js.map +1 -1
  68. package/dist/cli/commands/start.d.ts +2 -1
  69. package/dist/cli/commands/start.d.ts.map +1 -1
  70. package/dist/cli/commands/start.js +35 -9
  71. package/dist/cli/commands/start.js.map +1 -1
  72. package/dist/cli/commands/status.d.ts.map +1 -1
  73. package/dist/cli/commands/status.js +4 -0
  74. package/dist/cli/commands/status.js.map +1 -1
  75. package/dist/cli/config/config-manager.d.ts.map +1 -1
  76. package/dist/cli/config/config-manager.js +63 -14
  77. package/dist/cli/config/config-manager.js.map +1 -1
  78. package/dist/cli/config/types.d.ts +12 -5
  79. package/dist/cli/config/types.d.ts.map +1 -1
  80. package/dist/cli/config/types.js +3 -0
  81. package/dist/cli/config/types.js.map +1 -1
  82. package/dist/cli/index.js +6 -4
  83. package/dist/cli/index.js.map +1 -1
  84. package/dist/cli/runtime/agent-loop-init.d.ts +1 -1
  85. package/dist/cli/runtime/agent-loop-init.d.ts.map +1 -1
  86. package/dist/cli/runtime/agent-loop-init.js +8 -3
  87. package/dist/cli/runtime/agent-loop-init.js.map +1 -1
  88. package/dist/cli/runtime/gateway-init.d.ts +1 -1
  89. package/dist/cli/runtime/gateway-init.d.ts.map +1 -1
  90. package/dist/cli/runtime/gateway-init.js.map +1 -1
  91. package/dist/cli/runtime/mama-core-init.d.ts +10 -2
  92. package/dist/cli/runtime/mama-core-init.d.ts.map +1 -1
  93. package/dist/cli/runtime/mama-core-init.js +52 -68
  94. package/dist/cli/runtime/mama-core-init.js.map +1 -1
  95. package/dist/cli/runtime/memory-agent-init.d.ts.map +1 -1
  96. package/dist/cli/runtime/memory-agent-init.js +18 -5
  97. package/dist/cli/runtime/memory-agent-init.js.map +1 -1
  98. package/dist/cli/runtime/scheduler-init.d.ts +4 -0
  99. package/dist/cli/runtime/scheduler-init.d.ts.map +1 -1
  100. package/dist/cli/runtime/scheduler-init.js +24 -3
  101. package/dist/cli/runtime/scheduler-init.js.map +1 -1
  102. package/dist/cli/runtime/shutdown.d.ts +4 -0
  103. package/dist/cli/runtime/shutdown.d.ts.map +1 -1
  104. package/dist/cli/runtime/shutdown.js +30 -6
  105. package/dist/cli/runtime/shutdown.js.map +1 -1
  106. package/dist/cli/runtime/utilities.d.ts +2 -0
  107. package/dist/cli/runtime/utilities.d.ts.map +1 -1
  108. package/dist/cli/runtime/utilities.js +33 -0
  109. package/dist/cli/runtime/utilities.js.map +1 -1
  110. package/dist/gateways/discord.d.ts.map +1 -1
  111. package/dist/gateways/discord.js +11 -6
  112. package/dist/gateways/discord.js.map +1 -1
  113. package/dist/gateways/image-analyzer.d.ts +5 -0
  114. package/dist/gateways/image-analyzer.d.ts.map +1 -1
  115. package/dist/gateways/image-analyzer.js +8 -0
  116. package/dist/gateways/image-analyzer.js.map +1 -1
  117. package/dist/gateways/message-router.d.ts.map +1 -1
  118. package/dist/gateways/message-router.js +29 -15
  119. package/dist/gateways/message-router.js.map +1 -1
  120. package/dist/gateways/slack.d.ts.map +1 -1
  121. package/dist/gateways/slack.js +6 -2
  122. package/dist/gateways/slack.js.map +1 -1
  123. package/dist/gateways/types.d.ts +1 -1
  124. package/dist/gateways/types.d.ts.map +1 -1
  125. package/dist/index.d.ts +1 -1
  126. package/dist/index.js +1 -1
  127. package/dist/multi-agent/agent-process-manager.d.ts +6 -4
  128. package/dist/multi-agent/agent-process-manager.d.ts.map +1 -1
  129. package/dist/multi-agent/agent-process-manager.js +103 -34
  130. package/dist/multi-agent/agent-process-manager.js.map +1 -1
  131. package/dist/multi-agent/runtime-process.d.ts +3 -0
  132. package/dist/multi-agent/runtime-process.d.ts.map +1 -1
  133. package/dist/multi-agent/runtime-process.js +10 -2
  134. package/dist/multi-agent/runtime-process.js.map +1 -1
  135. package/dist/multi-agent/types.d.ts +12 -2
  136. package/dist/multi-agent/types.d.ts.map +1 -1
  137. package/dist/multi-agent/types.js.map +1 -1
  138. package/dist/multi-agent/workflow-types.d.ts +1 -1
  139. package/dist/multi-agent/workflow-types.d.ts.map +1 -1
  140. package/dist/onboarding/complete-autonomous-prompt.d.ts +1 -1
  141. package/dist/onboarding/complete-autonomous-prompt.d.ts.map +1 -1
  142. package/dist/onboarding/complete-autonomous-prompt.js +9 -9
  143. package/dist/operator/situation-report.d.ts.map +1 -1
  144. package/dist/operator/situation-report.js +38 -23
  145. package/dist/operator/situation-report.js.map +1 -1
  146. package/dist/operator/temporal-runtime.d.ts.map +1 -1
  147. package/dist/operator/temporal-runtime.js +3 -1
  148. package/dist/operator/temporal-runtime.js.map +1 -1
  149. package/dist/operator/trigger-author.d.ts +13 -1
  150. package/dist/operator/trigger-author.d.ts.map +1 -1
  151. package/dist/operator/trigger-author.js +35 -0
  152. package/dist/operator/trigger-author.js.map +1 -1
  153. package/dist/operator/worker-run.d.ts.map +1 -1
  154. package/dist/operator/worker-run.js +10 -4
  155. package/dist/operator/worker-run.js.map +1 -1
  156. package/dist/scheduler/cron-worker.d.ts +8 -4
  157. package/dist/scheduler/cron-worker.d.ts.map +1 -1
  158. package/dist/scheduler/cron-worker.js +56 -39
  159. package/dist/scheduler/cron-worker.js.map +1 -1
  160. package/dist/setup/setup-actions.d.ts +26 -0
  161. package/dist/setup/setup-actions.d.ts.map +1 -0
  162. package/dist/setup/setup-actions.js +371 -0
  163. package/dist/setup/setup-actions.js.map +1 -0
  164. package/dist/setup/setup-prompt.d.ts +1 -1
  165. package/dist/setup/setup-prompt.d.ts.map +1 -1
  166. package/dist/setup/setup-prompt.js +28 -33
  167. package/dist/setup/setup-prompt.js.map +1 -1
  168. package/dist/setup/setup-server.d.ts +6 -1
  169. package/dist/setup/setup-server.d.ts.map +1 -1
  170. package/dist/setup/setup-server.js +55 -9
  171. package/dist/setup/setup-server.js.map +1 -1
  172. package/dist/setup/setup-websocket.d.ts +14 -2
  173. package/dist/setup/setup-websocket.d.ts.map +1 -1
  174. package/dist/setup/setup-websocket.js +121 -37
  175. package/dist/setup/setup-websocket.js.map +1 -1
  176. package/package.json +1 -1
  177. package/public/setup.html +9 -6
  178. package/public/viewer/js/modules/agents.js +5 -4
  179. package/public/viewer/js/modules/settings.js +34 -10
  180. package/public/viewer/src/modules/agents.ts +5 -4
  181. package/public/viewer/src/modules/settings.ts +49 -11
  182. package/public/viewer/src/utils/api.ts +3 -2
@@ -0,0 +1,371 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SETUP_ACTION_PROTOCOL = void 0;
4
+ exports.parseSetupActions = parseSetupActions;
5
+ exports.createSetupActionExecutor = createSetupActionExecutor;
6
+ const node_fs_1 = require("node:fs");
7
+ const node_crypto_1 = require("node:crypto");
8
+ const node_path_1 = require("node:path");
9
+ const config_manager_js_1 = require("../cli/config/config-manager.js");
10
+ const ACTION_PATTERN_SOURCE = '<mama_setup_action>([\\s\\S]*?)</mama_setup_action>';
11
+ const LEGACY_ACTION_PATTERN = /\b(?:save_integration_token|update_config|validate_discord_token|mark_setup_complete)\s*\(|\[(?:validate token|save channel|mark_setup_complete)\]/i;
12
+ const MAX_ACTIONS_PER_RESPONSE = 8;
13
+ const MAX_ACTION_BYTES = 100_000;
14
+ const CONFIG_KEYS = new Set([
15
+ 'discord.token',
16
+ 'discord.enabled',
17
+ 'discord.default_channel_id',
18
+ 'slack.bot_token',
19
+ 'slack.app_token',
20
+ 'slack.enabled',
21
+ 'telegram.token',
22
+ 'telegram.allowed_chats',
23
+ 'telegram.enabled',
24
+ 'multi_agent.dangerouslySkipPermissions',
25
+ 'multi_agent.enabled',
26
+ ]);
27
+ const GENERIC_UPDATE_CONFIG_KEYS = new Set([...CONFIG_KEYS].filter((key) => !['discord.token', 'slack.bot_token', 'slack.app_token', 'telegram.token'].includes(key)));
28
+ exports.SETUP_ACTION_PROTOCOL = `## MAMA Setup Host Actions
29
+
30
+ You do not have native setup/file tools. To perform a setup mutation, emit exactly one or more
31
+ JSON actions wrapped in <mama_setup_action> tags. The host validates and executes them, then sends
32
+ trusted results back in the same session. Never claim success before receiving a successful result.
33
+
34
+ Examples:
35
+ <mama_setup_action>{"type":"update_config","key":"discord.enabled","value":true}</mama_setup_action>
36
+ <mama_setup_action>{"type":"validate_discord_token","token":"..."}</mama_setup_action>
37
+ <mama_setup_action>{"type":"write_file","name":"USER.md","content":"# USER.md..."}</mama_setup_action>
38
+ <mama_setup_action>{"type":"mark_setup_complete"}</mama_setup_action>
39
+
40
+ Supported action schemas:
41
+ - update_config: {"type":"update_config","key":<allowed key>,"value":<value>}
42
+ - validate_discord_token: {"type":"validate_discord_token","token":"..."}
43
+ - write_file: {"type":"write_file","name":"IDENTITY.md|USER.md|SOUL.md|personas/<name>.md","content":"..."}
44
+ - save_integration_token:
45
+ - Discord: {"type":"save_integration_token","platform":"discord","token":"..."}
46
+ - Slack: {"type":"save_integration_token","platform":"slack","bot_token":"xoxb-...","app_token":"xapp-..."}
47
+ - Telegram: {"type":"save_integration_token","platform":"telegram","token":"...","allowed_chats":["123"]}
48
+ - Agent team: {"type":"save_integration_token","platform":"multi_agent","enabled":true}
49
+ - present_discovery_summary, present_security_warning, demonstrate_capability: {"type":"<name>", ...}
50
+ - complete_onboarding: {"type":"complete_onboarding","confirmed":true}
51
+ - mark_setup_complete: {"type":"mark_setup_complete"}
52
+
53
+ Allowed update_config keys: discord.enabled, discord.default_channel_id,
54
+ slack.enabled, telegram.allowed_chats,
55
+ telegram.enabled, multi_agent.dangerouslySkipPermissions,
56
+ multi_agent.enabled. Emit related updates in one response; the host saves the batch atomically.
57
+
58
+ write_file accepts IDENTITY.md, USER.md, SOUL.md, or personas/<name>.md. Every path is resolved by
59
+ the host under ~/.mama; never use the process working directory. Tokens inside action tags are
60
+ removed from browser-visible output.`;
61
+ function requiredString(action, key) {
62
+ const value = action[key];
63
+ if (typeof value !== 'string' || value.length === 0) {
64
+ throw new Error(`${key} must be a non-empty string`);
65
+ }
66
+ return value;
67
+ }
68
+ function setConfigValue(config, key, value) {
69
+ if (!CONFIG_KEYS.has(key))
70
+ throw new Error(`Unsupported setup config key: ${key}`);
71
+ const [section, field] = key.split('.');
72
+ const root = config;
73
+ const current = root[section];
74
+ const target = typeof current === 'object' && current !== null
75
+ ? current
76
+ : {};
77
+ target[field] = value;
78
+ root[section] = target;
79
+ }
80
+ function replaceConfigContents(target, source) {
81
+ const targetRecord = target;
82
+ for (const key of Object.keys(targetRecord))
83
+ delete targetRecord[key];
84
+ Object.assign(targetRecord, structuredClone(source));
85
+ }
86
+ function validateConfigValue(key, value) {
87
+ if (key.endsWith('.enabled') || key === 'multi_agent.dangerouslySkipPermissions') {
88
+ if (typeof value !== 'boolean')
89
+ throw new Error(`${key} must be boolean`);
90
+ return;
91
+ }
92
+ if (key === 'telegram.allowed_chats') {
93
+ if (!Array.isArray(value) || value.some((item) => typeof item !== 'string')) {
94
+ throw new Error(`${key} must be a string array`);
95
+ }
96
+ return;
97
+ }
98
+ if (typeof value !== 'string' || value.length === 0) {
99
+ throw new Error(`${key} must be a non-empty string`);
100
+ }
101
+ }
102
+ function resolveSetupFile(mamaHome, name) {
103
+ const normalized = name.replaceAll('\\', '/');
104
+ const allowedRootFile = ['IDENTITY.md', 'USER.md', 'SOUL.md'].includes(normalized);
105
+ const allowedPersona = /^personas\/[A-Za-z0-9_.-]+\.md$/.test(normalized);
106
+ if (!allowedRootFile && !allowedPersona)
107
+ throw new Error('Unsupported setup file name');
108
+ const target = (0, node_path_1.resolve)(mamaHome, normalized);
109
+ const rel = (0, node_path_1.relative)(mamaHome, target);
110
+ if (rel.startsWith('..'))
111
+ throw new Error('Setup file escaped ~/.mama');
112
+ return target;
113
+ }
114
+ function writeSetupFile(mamaHome, name, content) {
115
+ if (Buffer.byteLength(content) > MAX_ACTION_BYTES)
116
+ throw new Error('Setup file exceeds size limit');
117
+ const target = resolveSetupFile(mamaHome, name);
118
+ writeAtomicSetupFile(mamaHome, target, content);
119
+ return target;
120
+ }
121
+ function writeAtomicSetupFile(mamaHome, target, content) {
122
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(target), { recursive: true });
123
+ const canonicalParent = (0, node_fs_1.realpathSync)((0, node_path_1.dirname)(target));
124
+ if ((0, node_path_1.relative)(mamaHome, canonicalParent).startsWith('..')) {
125
+ throw new Error('Setup file parent escaped ~/.mama');
126
+ }
127
+ if ((0, node_fs_1.existsSync)(target) && (0, node_fs_1.lstatSync)(target).isSymbolicLink()) {
128
+ throw new Error('Setup file target cannot be a symlink');
129
+ }
130
+ const temporary = (0, node_path_1.join)(canonicalParent, `.${(0, node_path_1.basename)(target)}.${(0, node_crypto_1.randomUUID)()}.tmp`);
131
+ try {
132
+ (0, node_fs_1.writeFileSync)(temporary, content, { encoding: 'utf8', mode: 0o600, flag: 'wx' });
133
+ (0, node_fs_1.renameSync)(temporary, target);
134
+ }
135
+ catch (error) {
136
+ if ((0, node_fs_1.existsSync)(temporary))
137
+ (0, node_fs_1.unlinkSync)(temporary);
138
+ throw error;
139
+ }
140
+ }
141
+ function assertCompletedPersonaFile(mamaHome, file) {
142
+ const path = (0, node_path_1.join)(mamaHome, file);
143
+ if (!(0, node_fs_1.existsSync)(path) || (0, node_fs_1.lstatSync)(path).isSymbolicLink() || !(0, node_fs_1.lstatSync)(path).isFile()) {
144
+ throw new Error(`Cannot complete onboarding before ${file} is written safely`);
145
+ }
146
+ if ((0, node_path_1.relative)(mamaHome, (0, node_fs_1.realpathSync)(path)).startsWith('..')) {
147
+ throw new Error(`Cannot complete onboarding with ${file} outside ~/.mama`);
148
+ }
149
+ }
150
+ function parseSetupActions(text) {
151
+ const actionPattern = new RegExp(ACTION_PATTERN_SOURCE, 'g');
152
+ const actions = [];
153
+ let match;
154
+ while ((match = actionPattern.exec(text)) !== null) {
155
+ if (actions.length >= MAX_ACTIONS_PER_RESPONSE) {
156
+ throw new Error('Setup response exceeded its action limit');
157
+ }
158
+ if (Buffer.byteLength(match[1]) > MAX_ACTION_BYTES) {
159
+ throw new Error('Setup action exceeded its size limit');
160
+ }
161
+ let parsed;
162
+ try {
163
+ parsed = JSON.parse(match[1]);
164
+ }
165
+ catch {
166
+ throw new Error('Setup action must contain valid JSON');
167
+ }
168
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
169
+ throw new Error('Setup action must be a JSON object');
170
+ }
171
+ actions.push(parsed);
172
+ }
173
+ const visibleText = text.replace(new RegExp(ACTION_PATTERN_SOURCE, 'g'), '').trim();
174
+ if (LEGACY_ACTION_PATTERN.test(visibleText)) {
175
+ throw new Error('Setup response used unsupported legacy action syntax');
176
+ }
177
+ return {
178
+ visibleText,
179
+ actions,
180
+ };
181
+ }
182
+ function createSetupActionExecutor(options = {}) {
183
+ const loadConfig = options.loadConfig ?? config_manager_js_1.getConfig;
184
+ const persistConfig = options.persistConfig ?? config_manager_js_1.saveConfig;
185
+ const mamaHome = (0, node_path_1.resolve)(options.mamaHome ?? (0, config_manager_js_1.expandPath)('~/.mama'));
186
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
187
+ const now = options.now ?? (() => new Date());
188
+ (0, node_fs_1.mkdirSync)(mamaHome, { recursive: true });
189
+ const canonicalMamaHome = (0, node_fs_1.realpathSync)(mamaHome);
190
+ const validateDiscordToken = async (token) => {
191
+ const response = await fetchImpl('https://discord.com/api/v10/users/@me', {
192
+ headers: { Authorization: `Bot ${token}` },
193
+ signal: AbortSignal.timeout(10_000),
194
+ });
195
+ if (!response.ok)
196
+ return { valid: false };
197
+ const body = (await response.json());
198
+ return { valid: true, clientId: typeof body.id === 'string' ? body.id : undefined };
199
+ };
200
+ const validateSlackTokens = async (botToken, appToken) => {
201
+ const botResponse = await fetchImpl('https://slack.com/api/auth.test', {
202
+ method: 'POST',
203
+ headers: { Authorization: `Bearer ${botToken}` },
204
+ signal: AbortSignal.timeout(10_000),
205
+ });
206
+ if (!botResponse.ok || (await botResponse.json()).ok !== true) {
207
+ return false;
208
+ }
209
+ const appResponse = await fetchImpl('https://slack.com/api/apps.connections.open', {
210
+ method: 'POST',
211
+ headers: { Authorization: `Bearer ${appToken}` },
212
+ signal: AbortSignal.timeout(10_000),
213
+ });
214
+ return appResponse.ok && (await appResponse.json()).ok === true;
215
+ };
216
+ const validateTelegramToken = async (token) => {
217
+ const response = await fetchImpl(`https://api.telegram.org/bot${token}/getMe`, {
218
+ signal: AbortSignal.timeout(10_000),
219
+ });
220
+ return response.ok && (await response.json()).ok === true;
221
+ };
222
+ const executeOne = async (action, workingConfig, markConfigDirty) => {
223
+ let type = 'unknown';
224
+ try {
225
+ type = requiredString(action, 'type');
226
+ if (type === 'update_config') {
227
+ const key = requiredString(action, 'key');
228
+ if (!GENERIC_UPDATE_CONFIG_KEYS.has(key)) {
229
+ throw new Error(`Unsupported setup config key: ${key}`);
230
+ }
231
+ validateConfigValue(key, action.value);
232
+ setConfigValue(workingConfig, key, action.value);
233
+ markConfigDirty();
234
+ return { type, ok: true, data: { key } };
235
+ }
236
+ if (type === 'validate_discord_token') {
237
+ const token = requiredString(action, 'token');
238
+ const validation = await validateDiscordToken(token);
239
+ return {
240
+ type,
241
+ ok: true,
242
+ data: { valid: validation.valid, client_id: validation.clientId },
243
+ };
244
+ }
245
+ if (type === 'write_file') {
246
+ const name = requiredString(action, 'name');
247
+ const content = requiredString(action, 'content');
248
+ const path = writeSetupFile(canonicalMamaHome, name, content);
249
+ return { type, ok: true, data: { file: (0, node_path_1.basename)(path) } };
250
+ }
251
+ if (type === 'save_integration_token') {
252
+ const platform = requiredString(action, 'platform');
253
+ if (platform === 'discord') {
254
+ const token = requiredString(action, 'token');
255
+ const validation = await validateDiscordToken(token);
256
+ if (!validation.valid)
257
+ throw new Error('Discord token validation failed');
258
+ setConfigValue(workingConfig, 'discord.token', token);
259
+ setConfigValue(workingConfig, 'discord.enabled', true);
260
+ }
261
+ else if (platform === 'slack') {
262
+ const botToken = requiredString(action, 'bot_token');
263
+ const appToken = requiredString(action, 'app_token');
264
+ if (!(await validateSlackTokens(botToken, appToken))) {
265
+ throw new Error('Slack token validation failed');
266
+ }
267
+ setConfigValue(workingConfig, 'slack.bot_token', botToken);
268
+ setConfigValue(workingConfig, 'slack.app_token', appToken);
269
+ setConfigValue(workingConfig, 'slack.enabled', true);
270
+ }
271
+ else if (platform === 'telegram') {
272
+ const token = requiredString(action, 'token');
273
+ if (!(await validateTelegramToken(token))) {
274
+ throw new Error('Telegram token validation failed');
275
+ }
276
+ setConfigValue(workingConfig, 'telegram.token', token);
277
+ const allowedChats = action.allowed_chats;
278
+ if (allowedChats !== undefined &&
279
+ (!Array.isArray(allowedChats) || allowedChats.some((item) => typeof item !== 'string'))) {
280
+ throw new Error('allowed_chats must be a string array');
281
+ }
282
+ if (allowedChats)
283
+ setConfigValue(workingConfig, 'telegram.allowed_chats', allowedChats);
284
+ setConfigValue(workingConfig, 'telegram.enabled', true);
285
+ }
286
+ else if (platform === 'multi_agent') {
287
+ if (typeof action.enabled !== 'boolean')
288
+ throw new Error('enabled must be boolean');
289
+ setConfigValue(workingConfig, 'multi_agent.enabled', action.enabled);
290
+ }
291
+ else {
292
+ throw new Error(`Unsupported integration platform: ${platform}`);
293
+ }
294
+ markConfigDirty();
295
+ return { type, ok: true, data: { platform } };
296
+ }
297
+ if (type === 'present_discovery_summary' ||
298
+ type === 'present_security_warning' ||
299
+ type === 'demonstrate_capability') {
300
+ return { type, ok: true };
301
+ }
302
+ if (type === 'complete_onboarding') {
303
+ if (action.confirmed !== true)
304
+ throw new Error('Onboarding must be confirmed');
305
+ for (const file of ['IDENTITY.md', 'USER.md', 'SOUL.md']) {
306
+ assertCompletedPersonaFile(canonicalMamaHome, file);
307
+ }
308
+ }
309
+ else if (type !== 'mark_setup_complete') {
310
+ throw new Error(`Unsupported setup action: ${type}`);
311
+ }
312
+ writeAtomicSetupFile(canonicalMamaHome, (0, node_path_1.join)(canonicalMamaHome, 'setup-complete.json'), `${JSON.stringify({ completed_at: now().toISOString() })}\n`);
313
+ return { type, ok: true, data: { completed: true } };
314
+ }
315
+ catch (error) {
316
+ return {
317
+ type,
318
+ ok: false,
319
+ error: error instanceof Error ? error.message : String(error),
320
+ };
321
+ }
322
+ };
323
+ const executor = {
324
+ async execute(action) {
325
+ return (await executor.executeBatch([action]))[0];
326
+ },
327
+ async executeBatch(actions) {
328
+ const sharedConfig = loadConfig();
329
+ const workingConfig = structuredClone(sharedConfig);
330
+ let configDirty = false;
331
+ const results = [];
332
+ for (const action of actions) {
333
+ const result = await executeOne(action, workingConfig, () => {
334
+ configDirty = true;
335
+ });
336
+ results.push(result);
337
+ if (!result.ok) {
338
+ return results.map((prior) => configDirty &&
339
+ prior.ok &&
340
+ (prior.type === 'update_config' || prior.type === 'save_integration_token')
341
+ ? {
342
+ ...prior,
343
+ ok: false,
344
+ data: { ...prior.data, rolled_back: true },
345
+ error: 'Config batch was rolled back because a later action failed',
346
+ }
347
+ : prior);
348
+ }
349
+ }
350
+ if (configDirty) {
351
+ try {
352
+ await persistConfig(workingConfig);
353
+ replaceConfigContents(sharedConfig, workingConfig);
354
+ }
355
+ catch (error) {
356
+ return results.map((result) => result.ok &&
357
+ (result.type === 'update_config' || result.type === 'save_integration_token')
358
+ ? {
359
+ ...result,
360
+ ok: false,
361
+ error: error instanceof Error ? error.message : String(error),
362
+ }
363
+ : result);
364
+ }
365
+ }
366
+ return results;
367
+ },
368
+ };
369
+ return executor;
370
+ }
371
+ //# sourceMappingURL=setup-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-actions.js","sourceRoot":"","sources":["../../src/setup/setup-actions.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare const SETUP_SYSTEM_PROMPT = "You are MAMA Setup Assistant. Help users configure MAMA Standalone step by step.\n\n## Your Role\n\nGuide users through setting up MAMA Standalone by:\n1. Understanding what platform they want to use (Discord, Slack, etc.)\n2. Walking them through creating bots on those platforms\n3. Collecting tokens/credentials\n4. Validating and saving configuration\n5. Confirming setup is complete\n\n## Available Tools\n\nYou have these tools to configure MAMA:\n\n**update_config**: Update config.yaml settings\n- Use this when you have validated a token or credential\n- Parameters: key (string), value (any)\n\n**validate_discord_token**: Check if a Discord bot token is valid\n- Use this before saving a Discord token\n- Parameters: token (string)\n- Returns: { valid: boolean, client_id?: string }\n\n**mark_setup_complete**: Signal that setup is finished\n- Use this only when all required configuration is done\n- No parameters\n\n## Setup Flow\n\n### Discord Setup\n\n1. Ask if they want to set up Discord bot\n2. Guide them:\n - Go to https://discord.com/developers/applications\n - Click \"New Application\"\n - Give it a name (e.g., \"MAMA Bot\")\n - Go to \"Bot\" tab\n - Click \"Reset Token\" and copy it\n3. Ask them to paste the token\n4. Validate the token using validate_discord_token\n5. If valid, save it:\n ```\n update_config(\"discord.token\", \"MTQ2NDg4...\")\n update_config(\"discord.enabled\", true)\n ```\n6. Generate invite link: https://discord.com/oauth2/authorize?client_id=CLIENT_ID&permissions=8&scope=bot\n7. Ask them to invite the bot to their server\n8. Ask for the channel ID where they want MAMA to respond\n9. Save channel ID:\n ```\n update_config(\"discord.default_channel\", \"CHANNEL_ID_HERE\")\n ```\n\n### Slack Setup\n\n1. Ask if they want to set up Slack bot\n2. Guide them:\n - Go to https://api.slack.com/apps\n - Click \"Create New App\" \u2192 \"From scratch\"\n - Give it a name and select workspace\n - Go to \"OAuth & Permissions\"\n - Add scopes: chat:write, channels:history, groups:history\n - Install to workspace\n - Copy Bot User OAuth Token\n - Copy App-Level Token\n3. Save tokens:\n ```\n update_config(\"slack.bot_token\", \"xoxb-...\")\n update_config(\"slack.app_token\", \"xapp-...\")\n update_config(\"slack.enabled\", true)\n ```\n\n### Agent Backend Setup\n\nAsk users which AI backend they want to use:\n\n**Options:**\n- **claude** (default): Uses Claude CLI. Requires Claude Code subscription.\n- **codex**: Uses OpenAI Codex app-server. Requires a Codex subscription and codex login.\n\nTo configure:\n```\nupdate_config(\"agent.backend\", \"claude\") // or \"codex\"\nupdate_config(\"agent.model\", \"claude-sonnet-4-6\") // for claude\nupdate_config(\"agent.model\", \"gpt-5.4\") // for codex\n```\n\n**Important:**\n- If using `codex`, authenticate first with `codex login`; MAMA manages its isolated runtime home.\n\n### Security & Permission Settings\n\nAsk users about agent permission settings:\n\n**Agent Autonomy (dangerouslySkipPermissions)**\n\nThis controls whether agents can execute tools (file writes, bash commands, git operations) without asking for permission.\n\n**Options:**\n- **true** (default): Agents run autonomously without approval prompts. Required for headless/daemon operation.\n- **false**: Agents ask for permission before executing each tool.\n\n\u26A0\uFE0F **Warning**: Setting this to `true` gives agents full system access. Only enable in trusted environments.\n\nTo configure:\n```\nupdate_config(\"multi_agent.dangerouslySkipPermissions\", true)\n```\n\n**IMPORTANT**: This setting also requires `MAMA_TRUSTED_ENV=true` environment variable.\n- For systemd service: Add `Environment=MAMA_TRUSTED_ENV=true` to the service file\n- For manual start: Run with `MAMA_TRUSTED_ENV=true mama start`\n\nIf they want autonomous agents, save the config and remind them about the environment variable.\n\n### Completion\n\nAfter setup is done:\n1. Summarize what was configured\n2. Tell them to run: mama start\n3. Explain how to use MAMA (mention bot in Discord/Slack)\n4. Call mark_setup_complete\n\n## Important Rules\n\n- Be friendly and encouraging\n- Provide clickable links\n- Ask for one thing at a time\n- Validate inputs before saving\n- Explain each step clearly\n- If they make a mistake, help them fix it\n- If token is invalid, ask them to double-check and try again\n- Never save invalid credentials\n\n## Example Interaction\n\nUser: \"I want to set up Discord\"\n\nYou: \"Great! Let's set up a Discord bot for MAMA. \n\nFirst, you'll need to create a Discord application:\n1. Go to https://discord.com/developers/applications\n2. Click 'New Application'\n3. Give it a name like 'MAMA Bot'\n4. Go to the 'Bot' tab\n5. Click 'Reset Token' and copy the token\n\nOnce you have the token, paste it here.\"\n\nUser: \"MTIzNDU2Nzg5MDEyMzQ1Njc4OQ...\"\n\nYou: [validate token] \"\u2713 Token is valid! I've saved it to your configuration.\n\nNow let's invite the bot to your server:\nhttps://discord.com/oauth2/authorize?client_id=YOUR_BOT_CLIENT_ID&permissions=8&scope=bot\n\nClick that link and select your server. After that, tell me the channel ID where you want MAMA to respond.\"\n\nUser: \"1234567890123456789\"\n\nYou: [save channel] \"Perfect! Your Discord bot is now configured.\n\nTo start MAMA, run:\n`mama start`\n\nThen go to Discord and mention @MAMA to start chatting!\n\n[mark_setup_complete]\"\n\n## Tone\n\n- Friendly but professional\n- Match the user's language (will be specified in system prompt)\n- Use emojis sparingly (\u2713, \uD83C\uDF89 for success moments)\n- Keep responses concise but complete\n";
1
+ export declare const SETUP_SYSTEM_PROMPT = "You are MAMA Setup Assistant. Help users configure MAMA Standalone step by step.\n\n## Your Role\n\nGuide users through setting up MAMA Standalone by:\n1. Understanding what platform they want to use (Discord, Slack, etc.)\n2. Walking them through creating bots on those platforms\n3. Collecting tokens/credentials\n4. Validating and saving configuration\n5. Confirming setup is complete\n\n## Available Tools\n\nYou have these tools to configure MAMA:\n\n**update_config**: Update config.yaml settings through the MAMA setup host-action protocol\n- Use this when you have validated a token or credential\n- Parameters: key (string), value (any)\n\n**validate_discord_token**: Check if a Discord bot token is valid through the host-action protocol\n- Use this before saving a Discord token\n- Parameters: token (string)\n- Returns: { valid: boolean, client_id?: string }\n\n**mark_setup_complete**: Signal that setup is finished through the host-action protocol\n- Use this only when all required configuration is done\n- No parameters\n\n## Setup Flow\n\n### Discord Setup\n\n1. Ask if they want to set up Discord bot\n2. Guide them:\n - Go to https://discord.com/developers/applications\n - Click \"New Application\"\n - Give it a name (e.g., \"MAMA Bot\")\n - Go to \"Bot\" tab\n - Click \"Reset Token\" and copy it\n3. Ask them to paste the token\n4. Validate the token using a tagged `validate_discord_token` host action and wait for its trusted result\n5. If valid, save it:\n ```\n <mama_setup_action>{\"type\":\"save_integration_token\",\"platform\":\"discord\",\"token\":\"DISCORD_BOT_TOKEN\"}</mama_setup_action>\n ```\n6. Generate invite link: https://discord.com/oauth2/authorize?client_id=CLIENT_ID&permissions=8&scope=bot\n7. Ask them to invite the bot to their server\n8. Ask for the channel ID where they want MAMA to respond\n9. Save channel ID:\n ```\n <mama_setup_action>{\"type\":\"update_config\",\"key\":\"discord.default_channel_id\",\"value\":\"CHANNEL_ID_HERE\"}</mama_setup_action>\n ```\n\n### Slack Setup\n\n1. Ask if they want to set up Slack bot\n2. Guide them:\n - Go to https://api.slack.com/apps\n - Click \"Create New App\" \u2192 \"From scratch\"\n - Give it a name and select workspace\n - Go to \"OAuth & Permissions\"\n - Add scopes: chat:write, channels:history, groups:history\n - Install to workspace\n - Copy Bot User OAuth Token\n - Copy App-Level Token\n3. Save tokens:\n ```\n <mama_setup_action>{\"type\":\"save_integration_token\",\"platform\":\"slack\",\"bot_token\":\"xoxb-...\",\"app_token\":\"xapp-...\"}</mama_setup_action>\n ```\n\n### Agent Backend Setup\n\nThe wizard runs on the backend that was already authenticated and selected before it started.\nDo not mutate `agent.backend` or `agent.model` here. To change providers, tell the user to finish\nthis setup, authenticate the target CLI, and run `mama init --force --backend claude|codex|cline`.\n\n### Security & Permission Settings\n\nAsk users about agent permission settings:\n\n**Agent Autonomy (dangerouslySkipPermissions)**\n\nThis controls whether agents can execute tools (file writes, bash commands, git operations) without asking for permission.\n\n**Options:**\n- **true** (default): Agents run autonomously without approval prompts. Required for headless/daemon operation.\n- **false**: Agents ask for permission before executing each tool.\n\n\u26A0\uFE0F **Warning**: Setting this to `true` gives agents full system access. Only enable in trusted environments.\n\nTo configure:\n```\n<mama_setup_action>{\"type\":\"update_config\",\"key\":\"multi_agent.dangerouslySkipPermissions\",\"value\":true}</mama_setup_action>\n```\n\n**IMPORTANT**: This setting also requires `MAMA_TRUSTED_ENV=true` environment variable.\n- For systemd service: Add `Environment=MAMA_TRUSTED_ENV=true` to the service file\n- For manual start: Run with `MAMA_TRUSTED_ENV=true mama start`\n\nIf they want autonomous agents, save the config and remind them about the environment variable.\n\n### Completion\n\nAfter setup is done:\n1. Summarize what was configured\n2. Tell them to run: mama start\n3. Explain how to use MAMA (mention bot in Discord/Slack)\n4. Emit `<mama_setup_action>{\"type\":\"mark_setup_complete\"}</mama_setup_action>` and wait for its trusted result\n\n## Important Rules\n\n- Be friendly and encouraging\n- Provide clickable links\n- Ask for one thing at a time\n- Validate inputs before saving\n- Explain each step clearly\n- If they make a mistake, help them fix it\n- If token is invalid, ask them to double-check and try again\n- Never save invalid credentials\n\n## Example Interaction\n\nUser: \"I want to set up Discord\"\n\nYou: \"Great! Let's set up a Discord bot for MAMA. \n\nFirst, you'll need to create a Discord application:\n1. Go to https://discord.com/developers/applications\n2. Click 'New Application'\n3. Give it a name like 'MAMA Bot'\n4. Go to the 'Bot' tab\n5. Click 'Reset Token' and copy the token\n\nOnce you have the token, paste it here.\"\n\nUser: \"DISCORD_BOT_TOKEN\"\n\nYou: <mama_setup_action>{\"type\":\"save_integration_token\",\"platform\":\"discord\",\"token\":\"DISCORD_BOT_TOKEN\"}</mama_setup_action>\n\nHost: Trusted MAMA setup host action results: [{\"type\":\"save_integration_token\",\"ok\":true,\"data\":{\"platform\":\"discord\"}}]\n\nYou: \"\u2713 Token is valid and the host saved it to your configuration.\n\nNow let's invite the bot to your server:\nhttps://discord.com/oauth2/authorize?client_id=YOUR_BOT_CLIENT_ID&permissions=8&scope=bot\n\nClick that link and select your server. After that, tell me the channel ID where you want MAMA to respond.\"\n\nUser: \"1234567890123456789\"\n\nYou: <mama_setup_action>{\"type\":\"update_config\",\"key\":\"discord.default_channel_id\",\"value\":\"1234567890123456789\"}</mama_setup_action>\n\nHost: Trusted MAMA setup host action results: [{\"type\":\"update_config\",\"ok\":true,\"data\":{\"key\":\"discord.default_channel_id\"}}]\n\nYou: <mama_setup_action>{\"type\":\"mark_setup_complete\"}</mama_setup_action>\n\nHost: Trusted MAMA setup host action results: [{\"type\":\"mark_setup_complete\",\"ok\":true,\"data\":{\"completed\":true}}]\n\nYou: \"Perfect! Your Discord bot is now configured.\n\nTo start MAMA, run:\n`mama start`\n\nThen go to Discord and mention @MAMA to start chatting!\"\n\n## Tone\n\n- Friendly but professional\n- Match the user's language (will be specified in system prompt)\n- Use emojis sparingly (\u2713, \uD83C\uDF89 for success moments)\n- Keep responses concise but complete\n";
2
2
  //# sourceMappingURL=setup-prompt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup-prompt.d.ts","sourceRoot":"","sources":["../../src/setup/setup-prompt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,mkLAgL/B,CAAC"}
1
+ {"version":3,"file":"setup-prompt.d.ts","sourceRoot":"","sources":["../../src/setup/setup-prompt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,+6MA2K/B,CAAC"}
@@ -16,16 +16,16 @@ Guide users through setting up MAMA Standalone by:
16
16
 
17
17
  You have these tools to configure MAMA:
18
18
 
19
- **update_config**: Update config.yaml settings
19
+ **update_config**: Update config.yaml settings through the MAMA setup host-action protocol
20
20
  - Use this when you have validated a token or credential
21
21
  - Parameters: key (string), value (any)
22
22
 
23
- **validate_discord_token**: Check if a Discord bot token is valid
23
+ **validate_discord_token**: Check if a Discord bot token is valid through the host-action protocol
24
24
  - Use this before saving a Discord token
25
25
  - Parameters: token (string)
26
26
  - Returns: { valid: boolean, client_id?: string }
27
27
 
28
- **mark_setup_complete**: Signal that setup is finished
28
+ **mark_setup_complete**: Signal that setup is finished through the host-action protocol
29
29
  - Use this only when all required configuration is done
30
30
  - No parameters
31
31
 
@@ -41,18 +41,17 @@ You have these tools to configure MAMA:
41
41
  - Go to "Bot" tab
42
42
  - Click "Reset Token" and copy it
43
43
  3. Ask them to paste the token
44
- 4. Validate the token using validate_discord_token
44
+ 4. Validate the token using a tagged \`validate_discord_token\` host action and wait for its trusted result
45
45
  5. If valid, save it:
46
46
  \`\`\`
47
- update_config("discord.token", "MTQ2NDg4...")
48
- update_config("discord.enabled", true)
47
+ <mama_setup_action>{"type":"save_integration_token","platform":"discord","token":"DISCORD_BOT_TOKEN"}</mama_setup_action>
49
48
  \`\`\`
50
49
  6. Generate invite link: https://discord.com/oauth2/authorize?client_id=CLIENT_ID&permissions=8&scope=bot
51
50
  7. Ask them to invite the bot to their server
52
51
  8. Ask for the channel ID where they want MAMA to respond
53
52
  9. Save channel ID:
54
53
  \`\`\`
55
- update_config("discord.default_channel", "CHANNEL_ID_HERE")
54
+ <mama_setup_action>{"type":"update_config","key":"discord.default_channel_id","value":"CHANNEL_ID_HERE"}</mama_setup_action>
56
55
  \`\`\`
57
56
 
58
57
  ### Slack Setup
@@ -69,28 +68,14 @@ You have these tools to configure MAMA:
69
68
  - Copy App-Level Token
70
69
  3. Save tokens:
71
70
  \`\`\`
72
- update_config("slack.bot_token", "xoxb-...")
73
- update_config("slack.app_token", "xapp-...")
74
- update_config("slack.enabled", true)
71
+ <mama_setup_action>{"type":"save_integration_token","platform":"slack","bot_token":"xoxb-...","app_token":"xapp-..."}</mama_setup_action>
75
72
  \`\`\`
76
73
 
77
74
  ### Agent Backend Setup
78
75
 
79
- Ask users which AI backend they want to use:
80
-
81
- **Options:**
82
- - **claude** (default): Uses Claude CLI. Requires Claude Code subscription.
83
- - **codex**: Uses OpenAI Codex app-server. Requires a Codex subscription and codex login.
84
-
85
- To configure:
86
- \`\`\`
87
- update_config("agent.backend", "claude") // or "codex"
88
- update_config("agent.model", "claude-sonnet-4-6") // for claude
89
- update_config("agent.model", "gpt-5.4") // for codex
90
- \`\`\`
91
-
92
- **Important:**
93
- - If using \`codex\`, authenticate first with \`codex login\`; MAMA manages its isolated runtime home.
76
+ The wizard runs on the backend that was already authenticated and selected before it started.
77
+ Do not mutate \`agent.backend\` or \`agent.model\` here. To change providers, tell the user to finish
78
+ this setup, authenticate the target CLI, and run \`mama init --force --backend claude|codex|cline\`.
94
79
 
95
80
  ### Security & Permission Settings
96
81
 
@@ -108,7 +93,7 @@ This controls whether agents can execute tools (file writes, bash commands, git
108
93
 
109
94
  To configure:
110
95
  \`\`\`
111
- update_config("multi_agent.dangerouslySkipPermissions", true)
96
+ <mama_setup_action>{"type":"update_config","key":"multi_agent.dangerouslySkipPermissions","value":true}</mama_setup_action>
112
97
  \`\`\`
113
98
 
114
99
  **IMPORTANT**: This setting also requires \`MAMA_TRUSTED_ENV=true\` environment variable.
@@ -123,7 +108,7 @@ After setup is done:
123
108
  1. Summarize what was configured
124
109
  2. Tell them to run: mama start
125
110
  3. Explain how to use MAMA (mention bot in Discord/Slack)
126
- 4. Call mark_setup_complete
111
+ 4. Emit \`<mama_setup_action>{"type":"mark_setup_complete"}</mama_setup_action>\` and wait for its trusted result
127
112
 
128
113
  ## Important Rules
129
114
 
@@ -151,9 +136,13 @@ First, you'll need to create a Discord application:
151
136
 
152
137
  Once you have the token, paste it here."
153
138
 
154
- User: "MTIzNDU2Nzg5MDEyMzQ1Njc4OQ..."
139
+ User: "DISCORD_BOT_TOKEN"
155
140
 
156
- You: [validate token] "✓ Token is valid! I've saved it to your configuration.
141
+ You: <mama_setup_action>{"type":"save_integration_token","platform":"discord","token":"DISCORD_BOT_TOKEN"}</mama_setup_action>
142
+
143
+ Host: Trusted MAMA setup host action results: [{"type":"save_integration_token","ok":true,"data":{"platform":"discord"}}]
144
+
145
+ You: "✓ Token is valid and the host saved it to your configuration.
157
146
 
158
147
  Now let's invite the bot to your server:
159
148
  https://discord.com/oauth2/authorize?client_id=YOUR_BOT_CLIENT_ID&permissions=8&scope=bot
@@ -162,14 +151,20 @@ Click that link and select your server. After that, tell me the channel ID where
162
151
 
163
152
  User: "1234567890123456789"
164
153
 
165
- You: [save channel] "Perfect! Your Discord bot is now configured.
154
+ You: <mama_setup_action>{"type":"update_config","key":"discord.default_channel_id","value":"1234567890123456789"}</mama_setup_action>
155
+
156
+ Host: Trusted MAMA setup host action results: [{"type":"update_config","ok":true,"data":{"key":"discord.default_channel_id"}}]
157
+
158
+ You: <mama_setup_action>{"type":"mark_setup_complete"}</mama_setup_action>
159
+
160
+ Host: Trusted MAMA setup host action results: [{"type":"mark_setup_complete","ok":true,"data":{"completed":true}}]
161
+
162
+ You: "Perfect! Your Discord bot is now configured.
166
163
 
167
164
  To start MAMA, run:
168
165
  \`mama start\`
169
166
 
170
- Then go to Discord and mention @MAMA to start chatting!
171
-
172
- [mark_setup_complete]"
167
+ Then go to Discord and mention @MAMA to start chatting!"
173
168
 
174
169
  ## Tone
175
170
 
@@ -1 +1 @@
1
- {"version":3,"file":"setup-prompt.js","sourceRoot":"","sources":["../../src/setup/setup-prompt.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgLlC,CAAC"}
1
+ {"version":3,"file":"setup-prompt.js","sourceRoot":"","sources":["../../src/setup/setup-prompt.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2KlC,CAAC"}
@@ -2,7 +2,12 @@
2
2
  * Setup Server - HTTP + WebSocket server for interactive setup wizard
3
3
  */
4
4
  export interface SetupServer {
5
- close: (callback?: () => void) => void;
5
+ close: () => Promise<void>;
6
6
  }
7
+ export interface SetupNonceStore {
8
+ issue(): string | null;
9
+ consume(candidate: string): boolean;
10
+ }
11
+ export declare function createSetupNonceStore(now?: () => number): SetupNonceStore;
7
12
  export declare function startSetupServer(port?: number): Promise<SetupServer>;
8
13
  //# sourceMappingURL=setup-server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup-server.d.ts","sourceRoot":"","sources":["../../src/setup/setup-server.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CACxC;AAED,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CA+FhF"}
1
+ {"version":3,"file":"setup-server.d.ts","sourceRoot":"","sources":["../../src/setup/setup-server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAKD,MAAM,WAAW,eAAe;IAC9B,KAAK,IAAI,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;CACrC;AAED,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,MAAiB,GAAG,eAAe,CAuBnF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CA+GhF"}