@meego-harness/mara-worker 0.8.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.
@@ -0,0 +1,232 @@
1
+ import { WorkerClientSDK, Part } from '@meego-harness/worker-sdk';
2
+ import { Buffer } from 'node:buffer';
3
+ import { SpawnOptions, ChildProcess, SpawnSyncReturns, spawnSync } from 'node:child_process';
4
+
5
+ type PermissionPreset = 'safe' | 'default' | 'full-access';
6
+ type MiraReasoningEffort = 'low' | 'medium' | 'high' | 'xhigh';
7
+ type MiraReasoningEffortSelection = 'use-mira-default' | 'use-coco-default' | MiraReasoningEffort;
8
+ type MiraModelSelection = 'use-mira-default' | 'use-coco-default' | (string & {});
9
+ interface MiraWorkerConfig {
10
+ serverUrl: string;
11
+ email: string;
12
+ workerId: string;
13
+ capabilitySummary: string;
14
+ defaultWorkspace: string;
15
+ repoMappings: Record<string, string>;
16
+ enabled: boolean;
17
+ permissionPreset: PermissionPreset;
18
+ modelSelection: MiraModelSelection;
19
+ reasoningEffortDefault: MiraReasoningEffortSelection;
20
+ }
21
+ interface MiraWorkerSetupResult extends MiraWorkerConfig {
22
+ }
23
+ type MiraWorkerSetupInput = Partial<MiraWorkerConfig>;
24
+ interface MiraWorkerContextBinding {
25
+ contextId: string;
26
+ repo?: string;
27
+ cwd: string;
28
+ sessionId?: string;
29
+ reasoningEffort?: MiraReasoningEffort;
30
+ planMode: boolean;
31
+ }
32
+ interface MiraWorkerState {
33
+ contexts: MiraWorkerContextBinding[];
34
+ }
35
+ interface MiraWorkerBridgeConfig extends MiraWorkerConfig {
36
+ stateFile?: string;
37
+ reconnectBaseDelayMs?: number;
38
+ reconnectMaxDelayMs?: number;
39
+ }
40
+ interface MiraWorkerBridgeLogger {
41
+ info: (message: string) => void;
42
+ warn: (message: string) => void;
43
+ error: (message: string) => void;
44
+ }
45
+ interface MiraCliTaskExecutionRequest {
46
+ taskId: string;
47
+ contextId: string;
48
+ cwd: string;
49
+ prompt: string;
50
+ sessionId?: string;
51
+ model?: string;
52
+ reasoningEffort?: MiraReasoningEffort;
53
+ permissionPreset: PermissionPreset;
54
+ abortSignal: AbortSignal;
55
+ env?: Record<string, string>;
56
+ }
57
+ interface MiraCliTaskExecutionResult {
58
+ text: string;
59
+ sessionId: string;
60
+ }
61
+ interface MiraTaskExecutor {
62
+ runTurn: (request: MiraCliTaskExecutionRequest) => Promise<MiraCliTaskExecutionResult>;
63
+ }
64
+ interface MiraWorkerBridgeDependencies {
65
+ executor: MiraTaskExecutor;
66
+ logger: MiraWorkerBridgeLogger;
67
+ client?: WorkerClientSDK;
68
+ }
69
+ interface MiraWorkerPrompter {
70
+ text: (params: {
71
+ message: string;
72
+ placeholder?: string;
73
+ initialValue?: string;
74
+ validate?: (value: string) => string | undefined;
75
+ }) => Promise<string>;
76
+ select: (params: {
77
+ message: string;
78
+ options: Array<{
79
+ value: string;
80
+ label: string;
81
+ }>;
82
+ initialValue?: string;
83
+ }) => Promise<string>;
84
+ confirm: (params: {
85
+ message: string;
86
+ initialValue?: boolean;
87
+ }) => Promise<boolean>;
88
+ }
89
+ interface RunMiraWorkerSetupDependencies {
90
+ homeDir?: string;
91
+ logger: MiraWorkerBridgeLogger;
92
+ }
93
+ interface MiraWorkerListItem extends MiraWorkerConfig {
94
+ configFile: string;
95
+ stateFile: string;
96
+ }
97
+ interface MiraWorkerDoctorWorkerReport extends MiraWorkerListItem {
98
+ configStatus: 'ok' | 'error';
99
+ runtimeStatus: 'ok' | 'error';
100
+ errors: string[];
101
+ }
102
+ interface MiraWorkerDoctorReport {
103
+ workers: MiraWorkerDoctorWorkerReport[];
104
+ }
105
+ interface ResolveStoragePathsOptions {
106
+ homeDir?: string;
107
+ }
108
+ interface MiraCliTaskExecutorConfig {
109
+ miraBin?: string;
110
+ pythonBin?: string;
111
+ runnerScript?: string;
112
+ spawn?: (command: string, args: string[], options: SpawnOptions) => ChildProcess;
113
+ spawnSync?: (command: string, args: string[], options: {
114
+ encoding?: BufferEncoding;
115
+ stdio?: 'ignore';
116
+ }) => SpawnSyncReturns<string | Buffer>;
117
+ }
118
+ type CocoReasoningEffort = MiraReasoningEffort;
119
+ type CocoReasoningEffortSelection = MiraReasoningEffortSelection;
120
+ type CocoModelSelection = MiraModelSelection;
121
+ type CocoWorkerConfig = MiraWorkerConfig;
122
+ type CocoWorkerSetupResult = MiraWorkerSetupResult;
123
+ type CocoWorkerSetupInput = MiraWorkerSetupInput;
124
+ type CocoWorkerContextBinding = MiraWorkerContextBinding;
125
+ type CocoWorkerState = MiraWorkerState;
126
+ type CocoWorkerBridgeConfig = MiraWorkerBridgeConfig;
127
+ type CocoWorkerBridgeLogger = MiraWorkerBridgeLogger;
128
+ type CocoCliTaskExecutionRequest = MiraCliTaskExecutionRequest;
129
+ type CocoCliTaskExecutionResult = MiraCliTaskExecutionResult;
130
+ type CocoTaskExecutor = MiraTaskExecutor;
131
+ type CocoWorkerBridgeDependencies = MiraWorkerBridgeDependencies;
132
+ type CocoWorkerPrompter = MiraWorkerPrompter;
133
+ type RunCocoWorkerSetupDependencies = RunMiraWorkerSetupDependencies;
134
+ type CocoWorkerListItem = MiraWorkerListItem;
135
+ type CocoWorkerDoctorWorkerReport = MiraWorkerDoctorWorkerReport;
136
+ type CocoWorkerDoctorReport = MiraWorkerDoctorReport;
137
+ type CocoCliTaskExecutorConfig = MiraCliTaskExecutorConfig;
138
+
139
+ declare class CocoWorkerBridge {
140
+ private readonly config;
141
+ private readonly executor;
142
+ private readonly logger;
143
+ private readonly client;
144
+ private readonly activeTasks;
145
+ private readonly pendingCanceledTaskIds;
146
+ private readonly bindings;
147
+ private readonly contextQueues;
148
+ private readonly stateFile;
149
+ constructor(config: CocoWorkerBridgeConfig, dependencies: CocoWorkerBridgeDependencies);
150
+ start(): Promise<this>;
151
+ stop(): Promise<void>;
152
+ private handleTaskMessage;
153
+ private processTaskMessage;
154
+ private trySendTaskStatusUpdate;
155
+ private handleTaskCancel;
156
+ private createBinding;
157
+ private hydrateBindingFromMetadata;
158
+ private resolveCwd;
159
+ private ensureDirectory;
160
+ private persistState;
161
+ private isTaskCanceled;
162
+ private resolveStructuredProjectNodeResult;
163
+ }
164
+
165
+ declare function resolveMiraWorkerStorageDir(options?: ResolveStoragePathsOptions): string;
166
+ declare function resolveMiraWorkerConfigFile(workerId: string, options?: ResolveStoragePathsOptions): string;
167
+ declare function resolveMiraWorkerStateFile(workerId: string, options?: ResolveStoragePathsOptions): string;
168
+ declare function loadMiraWorkerConfig(workerId: string, options?: ResolveStoragePathsOptions): MiraWorkerConfig;
169
+ declare function writeMiraWorkerConfig(config: MiraWorkerConfig, options?: ResolveStoragePathsOptions): void;
170
+ declare function loadMiraWorkerState(stateFile: string): MiraWorkerState;
171
+ declare function writeMiraWorkerState(stateFile: string, state: MiraWorkerState): void;
172
+ declare function runMiraWorkerSetup(dependencies: RunMiraWorkerSetupDependencies, prompter: MiraWorkerPrompter, input?: MiraWorkerSetupInput): Promise<MiraWorkerSetupResult>;
173
+ declare function listMiraWorkerConfigs(options?: ResolveStoragePathsOptions): MiraWorkerListItem[];
174
+ declare function getMiraWorkerDoctorReport(options?: ResolveStoragePathsOptions, dependencies?: {
175
+ assertCocoCliAvailable?: () => void;
176
+ }): MiraWorkerDoctorReport;
177
+ declare function setMiraWorkerEnabled(workerId: string, enabled: boolean, options?: ResolveStoragePathsOptions): void;
178
+ declare function uninstallMiraWorker(workerId: string, options?: ResolveStoragePathsOptions): {
179
+ configFile: string;
180
+ stateFile: string;
181
+ credentialFile: string | undefined;
182
+ removedConfig: boolean;
183
+ removedState: boolean;
184
+ removedCredential: boolean;
185
+ };
186
+ declare function createClackPrompter(): MiraWorkerPrompter;
187
+ declare const resolveCocoWorkerStorageDir: typeof resolveMiraWorkerStorageDir;
188
+ declare const resolveCocoWorkerConfigFile: typeof resolveMiraWorkerConfigFile;
189
+ declare const resolveCocoWorkerStateFile: typeof resolveMiraWorkerStateFile;
190
+ declare const loadCocoWorkerConfig: typeof loadMiraWorkerConfig;
191
+ declare const writeCocoWorkerConfig: typeof writeMiraWorkerConfig;
192
+ declare const loadCocoWorkerState: typeof loadMiraWorkerState;
193
+ declare const writeCocoWorkerState: typeof writeMiraWorkerState;
194
+ declare const runCocoWorkerSetup: typeof runMiraWorkerSetup;
195
+ declare const listCocoWorkerConfigs: typeof listMiraWorkerConfigs;
196
+ declare const getCocoWorkerDoctorReport: typeof getMiraWorkerDoctorReport;
197
+ declare const setCocoWorkerEnabled: typeof setMiraWorkerEnabled;
198
+ declare const uninstallCocoWorker: typeof uninstallMiraWorker;
199
+
200
+ declare const MIRA_WORKER_ROLE = "coder";
201
+ declare const MIRA_WORKER_WORKING_TEXT = "Mira CLI is working";
202
+ declare const MIRA_WORKER_CONFIG_DIR = ".meego-harness/mara-worker";
203
+ declare const COCO_WORKER_ROLE = "coder";
204
+ declare const COCO_WORKER_WORKING_TEXT = "Mira CLI is working";
205
+ declare const COCO_WORKER_CONFIG_DIR = ".meego-harness/mara-worker";
206
+
207
+ declare function stringifyTaskMessageParts(parts: Part[]): string;
208
+
209
+ declare class MiraCliTaskExecutor {
210
+ private readonly miraBin;
211
+ private readonly pythonBin;
212
+ private readonly runnerScript;
213
+ private readonly spawnChild;
214
+ constructor(config?: MiraCliTaskExecutorConfig);
215
+ runTurn(request: MiraCliTaskExecutionRequest): Promise<MiraCliTaskExecutionResult>;
216
+ }
217
+ declare function assertMiraCliAvailable(miraBin?: string, run?: typeof spawnSync, pythonBin?: string): void;
218
+ declare function buildMiraPayload(request: MiraCliTaskExecutionRequest): {
219
+ cwd: string;
220
+ prompt: string;
221
+ session_id: string | undefined;
222
+ model: string | undefined;
223
+ reasoning_effort: MiraReasoningEffort | undefined;
224
+ permission_preset: PermissionPreset;
225
+ disable_remote_capabilities: boolean;
226
+ };
227
+ declare function createAbortError(): Error;
228
+ declare function isAbortError(error: unknown): boolean;
229
+ declare const CocoCliTaskExecutor: typeof MiraCliTaskExecutor;
230
+ declare const assertCocoCliAvailable: typeof assertMiraCliAvailable;
231
+
232
+ export { COCO_WORKER_CONFIG_DIR, COCO_WORKER_ROLE, COCO_WORKER_WORKING_TEXT, type CocoCliTaskExecutionRequest, type CocoCliTaskExecutionResult, CocoCliTaskExecutor, type CocoCliTaskExecutorConfig, type CocoModelSelection, type CocoReasoningEffort, type CocoReasoningEffortSelection, type CocoTaskExecutor, CocoWorkerBridge, type CocoWorkerBridgeConfig, type CocoWorkerBridgeDependencies, type CocoWorkerBridgeLogger, type CocoWorkerConfig, type CocoWorkerContextBinding, type CocoWorkerDoctorReport, type CocoWorkerDoctorWorkerReport, type CocoWorkerListItem, type CocoWorkerPrompter, type CocoWorkerSetupInput, type CocoWorkerSetupResult, type CocoWorkerState, MIRA_WORKER_CONFIG_DIR, MIRA_WORKER_ROLE, MIRA_WORKER_WORKING_TEXT, type MiraCliTaskExecutionRequest, type MiraCliTaskExecutionResult, MiraCliTaskExecutor, type MiraCliTaskExecutorConfig, type MiraModelSelection, type MiraReasoningEffort, type MiraReasoningEffortSelection, type MiraTaskExecutor, CocoWorkerBridge as MiraWorkerBridge, type MiraWorkerBridgeConfig, type MiraWorkerBridgeDependencies, type MiraWorkerBridgeLogger, type MiraWorkerConfig, type MiraWorkerContextBinding, type MiraWorkerDoctorReport, type MiraWorkerDoctorWorkerReport, type MiraWorkerListItem, type MiraWorkerPrompter, type MiraWorkerSetupInput, type MiraWorkerSetupResult, type MiraWorkerState, type PermissionPreset, type ResolveStoragePathsOptions, type RunCocoWorkerSetupDependencies, type RunMiraWorkerSetupDependencies, assertCocoCliAvailable, assertMiraCliAvailable, buildMiraPayload, createAbortError, createClackPrompter, getCocoWorkerDoctorReport, getMiraWorkerDoctorReport, isAbortError, listCocoWorkerConfigs, listMiraWorkerConfigs, loadCocoWorkerConfig, loadCocoWorkerState, loadMiraWorkerConfig, loadMiraWorkerState, resolveCocoWorkerConfigFile, resolveCocoWorkerStateFile, resolveCocoWorkerStorageDir, resolveMiraWorkerConfigFile, resolveMiraWorkerStateFile, resolveMiraWorkerStorageDir, runCocoWorkerSetup, runMiraWorkerSetup, setCocoWorkerEnabled, setMiraWorkerEnabled, stringifyTaskMessageParts, uninstallCocoWorker, uninstallMiraWorker, writeCocoWorkerConfig, writeCocoWorkerState, writeMiraWorkerConfig, writeMiraWorkerState };
package/dist/index.js ADDED
@@ -0,0 +1,86 @@
1
+ import {
2
+ COCO_WORKER_CONFIG_DIR,
3
+ COCO_WORKER_ROLE,
4
+ COCO_WORKER_WORKING_TEXT,
5
+ CocoCliTaskExecutor,
6
+ CocoWorkerBridge,
7
+ MIRA_WORKER_CONFIG_DIR,
8
+ MIRA_WORKER_ROLE,
9
+ MIRA_WORKER_WORKING_TEXT,
10
+ MiraCliTaskExecutor,
11
+ assertCocoCliAvailable,
12
+ assertMiraCliAvailable,
13
+ buildMiraPayload,
14
+ createAbortError,
15
+ createClackPrompter,
16
+ getCocoWorkerDoctorReport,
17
+ getMiraWorkerDoctorReport,
18
+ isAbortError,
19
+ listCocoWorkerConfigs,
20
+ listMiraWorkerConfigs,
21
+ loadCocoWorkerConfig,
22
+ loadCocoWorkerState,
23
+ loadMiraWorkerConfig,
24
+ loadMiraWorkerState,
25
+ resolveCocoWorkerConfigFile,
26
+ resolveCocoWorkerStateFile,
27
+ resolveCocoWorkerStorageDir,
28
+ resolveMiraWorkerConfigFile,
29
+ resolveMiraWorkerStateFile,
30
+ resolveMiraWorkerStorageDir,
31
+ runCocoWorkerSetup,
32
+ runMiraWorkerSetup,
33
+ setCocoWorkerEnabled,
34
+ setMiraWorkerEnabled,
35
+ stringifyTaskMessageParts,
36
+ uninstallCocoWorker,
37
+ uninstallMiraWorker,
38
+ writeCocoWorkerConfig,
39
+ writeCocoWorkerState,
40
+ writeMiraWorkerConfig,
41
+ writeMiraWorkerState
42
+ } from "./chunk-VUPAW5X2.js";
43
+ export {
44
+ COCO_WORKER_CONFIG_DIR,
45
+ COCO_WORKER_ROLE,
46
+ COCO_WORKER_WORKING_TEXT,
47
+ CocoCliTaskExecutor,
48
+ CocoWorkerBridge,
49
+ MIRA_WORKER_CONFIG_DIR,
50
+ MIRA_WORKER_ROLE,
51
+ MIRA_WORKER_WORKING_TEXT,
52
+ MiraCliTaskExecutor,
53
+ CocoWorkerBridge as MiraWorkerBridge,
54
+ assertCocoCliAvailable,
55
+ assertMiraCliAvailable,
56
+ buildMiraPayload,
57
+ createAbortError,
58
+ createClackPrompter,
59
+ getCocoWorkerDoctorReport,
60
+ getMiraWorkerDoctorReport,
61
+ isAbortError,
62
+ listCocoWorkerConfigs,
63
+ listMiraWorkerConfigs,
64
+ loadCocoWorkerConfig,
65
+ loadCocoWorkerState,
66
+ loadMiraWorkerConfig,
67
+ loadMiraWorkerState,
68
+ resolveCocoWorkerConfigFile,
69
+ resolveCocoWorkerStateFile,
70
+ resolveCocoWorkerStorageDir,
71
+ resolveMiraWorkerConfigFile,
72
+ resolveMiraWorkerStateFile,
73
+ resolveMiraWorkerStorageDir,
74
+ runCocoWorkerSetup,
75
+ runMiraWorkerSetup,
76
+ setCocoWorkerEnabled,
77
+ setMiraWorkerEnabled,
78
+ stringifyTaskMessageParts,
79
+ uninstallCocoWorker,
80
+ uninstallMiraWorker,
81
+ writeCocoWorkerConfig,
82
+ writeCocoWorkerState,
83
+ writeMiraWorkerConfig,
84
+ writeMiraWorkerState
85
+ };
86
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json ADDED
@@ -0,0 +1,218 @@
1
+ {
2
+ "name": "@meego-harness/mara-worker",
3
+ "type": "module",
4
+ "version": "0.8.0",
5
+ "description": "Standalone Mira CLI worker bridge for meego-harness WorkerServerSDK",
6
+ "license": "MIT",
7
+ "keywords": [
8
+ "meego-harness-worker",
9
+ "mira"
10
+ ],
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "default": "./dist/index.js"
15
+ }
16
+ },
17
+ "main": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "bin": {
20
+ "meego-mara-worker": "./bin/meego-mara-worker.mjs"
21
+ },
22
+ "files": [
23
+ "README.md",
24
+ "bin",
25
+ "dist",
26
+ "python"
27
+ ],
28
+ "dependencies": {
29
+ "@clack/prompts": "^1.2.0",
30
+ "zod": "^4.3.6",
31
+ "@meego-harness/manager-contract": "^0.8.0",
32
+ "@meego-harness/prompt-registry": "^0.8.0",
33
+ "@meego-harness/worker-sdk": "^0.8.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^20.19.39",
37
+ "tsup": "^8.5.1",
38
+ "typescript": "^5.9.3",
39
+ "vite": "^7.1.12",
40
+ "vitest": "^4.1.4"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "meegoHarnessWorker": {
46
+ "schemaVersion": 1,
47
+ "id": "mara-worker",
48
+ "displayName": "Mara Worker",
49
+ "description": "Mira CLI worker bridge",
50
+ "installStrategy": "private-package",
51
+ "runtimeKind": "foreground-process",
52
+ "capabilities": [
53
+ "setup",
54
+ "list",
55
+ "doctor",
56
+ "start",
57
+ "stop",
58
+ "uninstall"
59
+ ],
60
+ "prerequisites": [
61
+ {
62
+ "type": "command",
63
+ "command": "mira -v",
64
+ "reason": "Mira CLI must be installed"
65
+ }
66
+ ],
67
+ "setupFields": [
68
+ "defaultWorkspace",
69
+ "permissionPreset",
70
+ "model",
71
+ "reasoningEffort"
72
+ ],
73
+ "setupFieldDefaults": {
74
+ "permissionPreset": "default",
75
+ "model": "use-mira-default",
76
+ "reasoningEffort": "use-mira-default"
77
+ },
78
+ "setupFieldOptions": {
79
+ "permissionPreset": [
80
+ {
81
+ "value": "safe",
82
+ "label": "safe"
83
+ },
84
+ {
85
+ "value": "default",
86
+ "label": "default"
87
+ },
88
+ {
89
+ "value": "full-access",
90
+ "label": "full-access"
91
+ }
92
+ ],
93
+ "model": [
94
+ {
95
+ "value": "use-mira-default",
96
+ "label": "use-mira-default"
97
+ },
98
+ {
99
+ "value": "use-coco-default",
100
+ "label": "use-coco-default"
101
+ },
102
+ {
103
+ "value": "opus4.6t",
104
+ "label": "opus4.6t"
105
+ }
106
+ ],
107
+ "reasoningEffort": [
108
+ {
109
+ "value": "use-mira-default",
110
+ "label": "use-mira-default"
111
+ },
112
+ {
113
+ "value": "use-coco-default",
114
+ "label": "use-coco-default"
115
+ },
116
+ {
117
+ "value": "low",
118
+ "label": "low"
119
+ },
120
+ {
121
+ "value": "medium",
122
+ "label": "medium"
123
+ },
124
+ {
125
+ "value": "high",
126
+ "label": "high"
127
+ },
128
+ {
129
+ "value": "xhigh",
130
+ "label": "xhigh"
131
+ }
132
+ ]
133
+ },
134
+ "quickStartTemplates": [
135
+ {
136
+ "id": "default",
137
+ "displayName": "Default options",
138
+ "description": "Use default Mira options",
139
+ "setupFieldValues": {
140
+ "permissionPreset": "default",
141
+ "model": "use-mira-default",
142
+ "reasoningEffort": "use-mira-default"
143
+ }
144
+ },
145
+ {
146
+ "id": "full-access-latest",
147
+ "displayName": "Full access latest",
148
+ "description": "Use full access with the latest Mira model",
149
+ "setupFieldValues": {
150
+ "permissionPreset": "full-access",
151
+ "model": "opus4.6t",
152
+ "reasoningEffort": "xhigh"
153
+ }
154
+ }
155
+ ],
156
+ "actions": {
157
+ "setup": {
158
+ "runner": "package-bin",
159
+ "executable": "meego-mara-worker",
160
+ "args": [
161
+ "setup",
162
+ "--json"
163
+ ]
164
+ },
165
+ "list": {
166
+ "runner": "package-bin",
167
+ "executable": "meego-mara-worker",
168
+ "args": [
169
+ "list",
170
+ "--json"
171
+ ]
172
+ },
173
+ "doctor": {
174
+ "runner": "package-bin",
175
+ "executable": "meego-mara-worker",
176
+ "args": [
177
+ "doctor",
178
+ "--json"
179
+ ]
180
+ },
181
+ "start": {
182
+ "runner": "package-bin",
183
+ "executable": "meego-mara-worker",
184
+ "args": [
185
+ "start",
186
+ "--worker",
187
+ "{{workerId}}"
188
+ ]
189
+ },
190
+ "stop": {
191
+ "runner": "package-bin",
192
+ "executable": "meego-mara-worker",
193
+ "args": [
194
+ "stop",
195
+ "--worker",
196
+ "{{workerId}}"
197
+ ]
198
+ },
199
+ "uninstall": {
200
+ "runner": "package-bin",
201
+ "executable": "meego-mara-worker",
202
+ "args": [
203
+ "uninstall",
204
+ "--worker",
205
+ "{{workerId}}"
206
+ ]
207
+ }
208
+ }
209
+ },
210
+ "scripts": {
211
+ "build": "tsup",
212
+ "clean": "rm -rf dist",
213
+ "dev": "tsup --watch",
214
+ "test": "vitest run",
215
+ "test:watch": "vitest",
216
+ "typecheck": "tsc --noEmit"
217
+ }
218
+ }
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env python3
2
+
3
+ import importlib.util
4
+ import io
5
+ import json
6
+ import os
7
+ import sys
8
+ import traceback
9
+ from contextlib import redirect_stderr, redirect_stdout
10
+
11
+
12
+ def load_mira_module():
13
+ script_path = os.path.expanduser("~/.mira/mira.py")
14
+ if not os.path.isfile(script_path):
15
+ raise FileNotFoundError(f"Mira Python entrypoint not found: {script_path}")
16
+
17
+ spec = importlib.util.spec_from_file_location("meego_mira_worker_runtime", script_path)
18
+ if spec is None or spec.loader is None:
19
+ raise RuntimeError(f"Unable to load Mira module from {script_path}")
20
+
21
+ module = importlib.util.module_from_spec(spec)
22
+ spec.loader.exec_module(module)
23
+ return module
24
+
25
+
26
+ def resolve_model_key(module, raw_model, reasoning_effort):
27
+ if raw_model and raw_model not in ("use-mira-default", "use-coco-default"):
28
+ normalized = str(raw_model).strip()
29
+ lowered = normalized.lower()
30
+ if normalized in module.MODELS:
31
+ return normalized
32
+ if lowered in module.MODEL_ALIASES:
33
+ return module.MODEL_ALIASES[lowered]
34
+ return normalized
35
+
36
+ if reasoning_effort in ("high", "xhigh"):
37
+ return "opus4.6t"
38
+
39
+ return module.DEFAULT_MODEL
40
+
41
+
42
+ def extract_text(messages):
43
+ for message in reversed(messages):
44
+ if message.get("role") != "assistant":
45
+ continue
46
+ content = message.get("content", [])
47
+ if isinstance(content, list):
48
+ texts = []
49
+ for block in content:
50
+ if isinstance(block, dict) and block.get("type") == "text":
51
+ texts.append(block.get("text", ""))
52
+ text = "".join(texts).strip()
53
+ if text:
54
+ return text
55
+ elif isinstance(content, str):
56
+ text = content.strip()
57
+ if text:
58
+ return text
59
+ return ""
60
+
61
+
62
+ def main():
63
+ try:
64
+ request = json.load(sys.stdin)
65
+ cwd = request["cwd"]
66
+ prompt = request["prompt"]
67
+ session_id = request.get("session_id") or ""
68
+ model = request.get("model")
69
+ reasoning_effort = request.get("reasoning_effort")
70
+ permission_preset = request.get("permission_preset", "default")
71
+ disable_remote_capabilities = bool(request.get("disable_remote_capabilities", True))
72
+
73
+ os.chdir(cwd)
74
+ module = load_mira_module()
75
+
76
+ if disable_remote_capabilities:
77
+ module.MiraClient.fetch_tool_list = lambda self: []
78
+ module.MiraClient.fetch_skill_list = lambda self: []
79
+
80
+ cli = module.MiraCLI()
81
+ if not cli.config.has_auth:
82
+ raise RuntimeError("Mira is not logged in. Run `mira login` first.")
83
+
84
+ cli.config._raw_config["auto_start_bridge"] = False
85
+ cli.config.model_key = resolve_model_key(module, model, reasoning_effort)
86
+ cli.mcp = None
87
+ cli.client = module.MiraClient(cli.config, None)
88
+ cli.executor = module.ToolExecutor(None, cli.client._mcp_tools_for_api, None)
89
+
90
+ if session_id:
91
+ cli.client.load_conversation(session_id)
92
+
93
+ original_execute = cli.executor.execute
94
+
95
+ def guarded_execute(name, inp):
96
+ if permission_preset == "safe" and name in ("write_file", "edit_file"):
97
+ return ("Permission preset safe blocks file mutations in Mira worker mode", True)
98
+ return original_execute(name, inp)
99
+
100
+ cli.executor.execute = guarded_execute
101
+
102
+ captured = io.StringIO()
103
+ with redirect_stdout(captured), redirect_stderr(captured):
104
+ cli.run_turn(prompt)
105
+ cli.client.save_conversation()
106
+
107
+ text = extract_text(cli.client.messages)
108
+ if not text:
109
+ captured_output = captured.getvalue().strip()
110
+ raise RuntimeError(
111
+ "Mira did not produce assistant text."
112
+ + (f" Captured output: {captured_output[-1000:]}" if captured_output else "")
113
+ )
114
+
115
+ print(json.dumps({
116
+ "text": text,
117
+ "sessionId": cli.client.conv_id,
118
+ "miraSessionId": cli.client.mira_session_id,
119
+ }))
120
+ except Exception as error:
121
+ print(json.dumps({
122
+ "error": str(error),
123
+ "traceback": traceback.format_exc(limit=5),
124
+ }))
125
+ sys.exit(1)
126
+
127
+
128
+ if __name__ == "__main__":
129
+ main()