@a5c-ai/hooks-mux-cli 5.0.1-staging.05ee168a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -0
- package/dist/cli/adapter-loader.d.ts +41 -0
- package/dist/cli/adapter-loader.d.ts.map +1 -0
- package/dist/cli/adapter-loader.js +151 -0
- package/dist/cli/adapter-loader.js.map +1 -0
- package/dist/cli/bootstrap-runtime.d.ts +18 -0
- package/dist/cli/bootstrap-runtime.d.ts.map +1 -0
- package/dist/cli/bootstrap-runtime.js +108 -0
- package/dist/cli/bootstrap-runtime.js.map +1 -0
- package/dist/cli/commands/bootstrap.d.ts +18 -0
- package/dist/cli/commands/bootstrap.d.ts.map +1 -0
- package/dist/cli/commands/bootstrap.js +89 -0
- package/dist/cli/commands/bootstrap.js.map +1 -0
- package/dist/cli/commands/clear-session.d.ts +13 -0
- package/dist/cli/commands/clear-session.d.ts.map +1 -0
- package/dist/cli/commands/clear-session.js +34 -0
- package/dist/cli/commands/clear-session.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +16 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +333 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/exec.d.ts +18 -0
- package/dist/cli/commands/exec.d.ts.map +1 -0
- package/dist/cli/commands/exec.js +104 -0
- package/dist/cli/commands/exec.js.map +1 -0
- package/dist/cli/commands/invoke.d.ts +27 -0
- package/dist/cli/commands/invoke.d.ts.map +1 -0
- package/dist/cli/commands/invoke.js +281 -0
- package/dist/cli/commands/invoke.js.map +1 -0
- package/dist/cli/commands/show-session.d.ts +13 -0
- package/dist/cli/commands/show-session.d.ts.map +1 -0
- package/dist/cli/commands/show-session.js +53 -0
- package/dist/cli/commands/show-session.js.map +1 -0
- package/dist/cli/hooks-logger.d.ts +12 -0
- package/dist/cli/hooks-logger.d.ts.map +1 -0
- package/dist/cli/hooks-logger.js +115 -0
- package/dist/cli/hooks-logger.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +42 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/stdin.d.ts +9 -0
- package/dist/cli/stdin.d.ts.map +1 -0
- package/dist/cli/stdin.js +24 -0
- package/dist/cli/stdin.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* doctor command — Report adapter capability profile, integration warnings,
|
|
4
|
+
* session store health, and stale session detection.
|
|
5
|
+
*
|
|
6
|
+
* Spec section 18.6 (Phase 5 enhancement).
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.doctorCommand = void 0;
|
|
43
|
+
const hooks_mux_core_1 = require("@a5c-ai/hooks-mux-core");
|
|
44
|
+
const adapter_loader_1 = require("../adapter-loader");
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const ALL_CANONICAL_PHASES = [
|
|
48
|
+
'session.start', 'session.end', 'session.cwd_changed', 'session.file_changed',
|
|
49
|
+
'session.config_changed', 'session.compact.before', 'session.compact.after',
|
|
50
|
+
'turn.user_prompt_submitted', 'turn.before_agent', 'turn.after_agent',
|
|
51
|
+
'turn.stop', 'turn.error',
|
|
52
|
+
'model.before_request', 'model.after_response',
|
|
53
|
+
'planner.before_tool_selection',
|
|
54
|
+
'tool.before', 'tool.after', 'tool.error',
|
|
55
|
+
'tool.permission_request', 'tool.permission_denied',
|
|
56
|
+
'subagent.start', 'subagent.end',
|
|
57
|
+
'notification', 'message.received', 'message.sending', 'message.sent',
|
|
58
|
+
'mcp.elicitation', 'mcp.elicitation_result',
|
|
59
|
+
];
|
|
60
|
+
function buildCapabilityProfile(mappings) {
|
|
61
|
+
const supported = new Set();
|
|
62
|
+
const blockable = new Set();
|
|
63
|
+
const mutable = new Set();
|
|
64
|
+
const lossy = new Set();
|
|
65
|
+
const emulated = new Set();
|
|
66
|
+
for (const m of mappings) {
|
|
67
|
+
supported.add(m.canonicalPhase);
|
|
68
|
+
if (m.blockCapability)
|
|
69
|
+
blockable.add(m.canonicalPhase);
|
|
70
|
+
if (m.mutationCapability)
|
|
71
|
+
mutable.add(m.canonicalPhase);
|
|
72
|
+
if (m.supportLevel === 'lossy')
|
|
73
|
+
lossy.add(m.canonicalPhase);
|
|
74
|
+
if (m.supportLevel === 'emulated')
|
|
75
|
+
emulated.add(m.canonicalPhase);
|
|
76
|
+
}
|
|
77
|
+
const unsupported = ALL_CANONICAL_PHASES.filter((p) => !supported.has(p));
|
|
78
|
+
return {
|
|
79
|
+
supportedPhases: [...supported],
|
|
80
|
+
unsupportedPhases: unsupported,
|
|
81
|
+
blockablePhases: [...blockable],
|
|
82
|
+
mutablePhases: [...mutable],
|
|
83
|
+
lossyPhases: [...lossy],
|
|
84
|
+
emulatedPhases: [...emulated],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function analyzeAdapter(name) {
|
|
88
|
+
const warnings = [];
|
|
89
|
+
const packageName = `@a5c-ai/hooks-mux-adapter-${name}`;
|
|
90
|
+
try {
|
|
91
|
+
const loaded = (0, adapter_loader_1.loadAdapter)(name);
|
|
92
|
+
const caps = loaded.capabilities;
|
|
93
|
+
const profile = buildCapabilityProfile(loaded.phaseMappings);
|
|
94
|
+
// Generate warnings based on capability gaps
|
|
95
|
+
if (!caps.supportsBlock) {
|
|
96
|
+
warnings.push('Adapter does not support blocking decisions (deny/ask will be downgraded to noop)');
|
|
97
|
+
}
|
|
98
|
+
if (!caps.supportsNativeAdditionalContext) {
|
|
99
|
+
warnings.push('Adapter does not support native additionalContext injection');
|
|
100
|
+
}
|
|
101
|
+
if (caps.envPersistenceMode === 'none') {
|
|
102
|
+
warnings.push('No env persistence -- session context will not propagate to downstream tools');
|
|
103
|
+
}
|
|
104
|
+
if (caps.sessionIdQuality === 'synthetic' || caps.sessionIdQuality === 'none') {
|
|
105
|
+
warnings.push('Session ID is synthetic or unavailable -- cross-hook state may be unreliable');
|
|
106
|
+
}
|
|
107
|
+
if (caps.toolInterceptionScope === 'none') {
|
|
108
|
+
warnings.push('No tool interception -- tool.before/tool.after phases will be unsupported');
|
|
109
|
+
}
|
|
110
|
+
if (loaded.phaseMappings.length === 0) {
|
|
111
|
+
warnings.push('No phase mappings found -- all events will map to "unknown" phase');
|
|
112
|
+
}
|
|
113
|
+
// Capability gap warnings
|
|
114
|
+
if (profile.unsupportedPhases.length > 0) {
|
|
115
|
+
warnings.push(`${profile.unsupportedPhases.length} canonical phases are unsupported: ${profile.unsupportedPhases.slice(0, 5).join(', ')}${profile.unsupportedPhases.length > 5 ? '...' : ''}`);
|
|
116
|
+
}
|
|
117
|
+
if (profile.lossyPhases.length > 0) {
|
|
118
|
+
warnings.push(`${profile.lossyPhases.length} phases have lossy mapping: ${profile.lossyPhases.join(', ')}`);
|
|
119
|
+
}
|
|
120
|
+
if (!caps.supportsAsk && caps.supportsBlock) {
|
|
121
|
+
warnings.push('Adapter supports block but not ask -- interactive approval flows will not work');
|
|
122
|
+
}
|
|
123
|
+
if (!caps.supportsToolInputMutation && !caps.supportsToolResultMutation) {
|
|
124
|
+
warnings.push('No tool mutation support -- toolMutation results will be ignored');
|
|
125
|
+
}
|
|
126
|
+
if (caps.notes) {
|
|
127
|
+
for (const note of caps.notes) {
|
|
128
|
+
warnings.push(`Note: ${note}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const phaseSummaries = loaded.phaseMappings.map((m) => ({
|
|
132
|
+
canonicalPhase: m.canonicalPhase,
|
|
133
|
+
nativeHook: m.nativeHook,
|
|
134
|
+
supportLevel: m.supportLevel,
|
|
135
|
+
blockCapability: m.blockCapability,
|
|
136
|
+
mutationCapability: m.mutationCapability,
|
|
137
|
+
}));
|
|
138
|
+
return {
|
|
139
|
+
name,
|
|
140
|
+
available: true,
|
|
141
|
+
packageName,
|
|
142
|
+
capabilities: caps,
|
|
143
|
+
phaseMappings: phaseSummaries,
|
|
144
|
+
capabilityProfile: profile,
|
|
145
|
+
warnings,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
return {
|
|
150
|
+
name,
|
|
151
|
+
available: false,
|
|
152
|
+
packageName,
|
|
153
|
+
warnings: [],
|
|
154
|
+
error: err instanceof Error ? err.message : String(err),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async function checkSessionHealth(sessionDir, staleThresholdHours) {
|
|
159
|
+
const report = {
|
|
160
|
+
sessionDir,
|
|
161
|
+
dirExists: false,
|
|
162
|
+
sessionCount: 0,
|
|
163
|
+
staleSessions: [],
|
|
164
|
+
corruptSessions: [],
|
|
165
|
+
totalSizeBytes: 0,
|
|
166
|
+
errors: [],
|
|
167
|
+
};
|
|
168
|
+
try {
|
|
169
|
+
await fs.promises.access(sessionDir);
|
|
170
|
+
report.dirExists = true;
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return report;
|
|
174
|
+
}
|
|
175
|
+
let entries;
|
|
176
|
+
try {
|
|
177
|
+
entries = await fs.promises.readdir(sessionDir);
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
report.errors.push(`Failed to read session directory: ${err instanceof Error ? err.message : String(err)}`);
|
|
181
|
+
return report;
|
|
182
|
+
}
|
|
183
|
+
const jsonFiles = entries.filter((e) => e.endsWith('.json') && !e.includes('.corrupt.') && !e.endsWith('.lock'));
|
|
184
|
+
report.sessionCount = jsonFiles.length;
|
|
185
|
+
const now = Date.now();
|
|
186
|
+
for (const file of jsonFiles) {
|
|
187
|
+
const filePath = path.join(sessionDir, file);
|
|
188
|
+
try {
|
|
189
|
+
const stat = await fs.promises.stat(filePath);
|
|
190
|
+
report.totalSizeBytes += stat.size;
|
|
191
|
+
const raw = await fs.promises.readFile(filePath, 'utf-8');
|
|
192
|
+
const envelope = JSON.parse(raw);
|
|
193
|
+
const session = envelope.session;
|
|
194
|
+
if (!session || !session.updatedAt || !session.sessionId) {
|
|
195
|
+
report.corruptSessions.push(file);
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const updatedAt = new Date(session.updatedAt).getTime();
|
|
199
|
+
const ageHours = (now - updatedAt) / (1000 * 60 * 60);
|
|
200
|
+
if (ageHours > staleThresholdHours) {
|
|
201
|
+
report.staleSessions.push({
|
|
202
|
+
sessionId: session.sessionId,
|
|
203
|
+
lastUpdated: session.updatedAt,
|
|
204
|
+
ageHours: Math.round(ageHours * 10) / 10,
|
|
205
|
+
adapter: session.adapter ?? 'unknown',
|
|
206
|
+
fileSizeBytes: stat.size,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
report.corruptSessions.push(file);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Check for corrupt backup files
|
|
215
|
+
const corruptBackups = entries.filter((e) => e.includes('.corrupt.'));
|
|
216
|
+
if (corruptBackups.length > 0) {
|
|
217
|
+
report.errors.push(`${corruptBackups.length} corrupt backup file(s) found in session directory`);
|
|
218
|
+
}
|
|
219
|
+
return report;
|
|
220
|
+
}
|
|
221
|
+
exports.doctorCommand = {
|
|
222
|
+
command: 'doctor',
|
|
223
|
+
describe: 'Report adapter capability profile, session health, and integration warnings',
|
|
224
|
+
builder: (yargs) => yargs
|
|
225
|
+
.option('adapter', {
|
|
226
|
+
type: 'string',
|
|
227
|
+
describe: 'Specific adapter to check (omit for all known adapters)',
|
|
228
|
+
})
|
|
229
|
+
.option('json', {
|
|
230
|
+
type: 'boolean',
|
|
231
|
+
default: false,
|
|
232
|
+
describe: 'Output JSON format',
|
|
233
|
+
})
|
|
234
|
+
.option('session-dir', {
|
|
235
|
+
type: 'string',
|
|
236
|
+
describe: 'Session store directory to check (defaults to platform default)',
|
|
237
|
+
})
|
|
238
|
+
.option('stale-threshold', {
|
|
239
|
+
type: 'number',
|
|
240
|
+
default: 24,
|
|
241
|
+
describe: 'Hours after which a session is considered stale',
|
|
242
|
+
}),
|
|
243
|
+
handler: async (args) => {
|
|
244
|
+
const adapterNames = args.adapter ? [args.adapter] : [...adapter_loader_1.KNOWN_ADAPTERS];
|
|
245
|
+
const adapterReports = adapterNames.map(analyzeAdapter);
|
|
246
|
+
const sessionDir = args['session-dir'] ?? (0, hooks_mux_core_1.getDefaultSessionDir)();
|
|
247
|
+
const sessionHealth = await checkSessionHealth(sessionDir, args['stale-threshold'] ?? 24);
|
|
248
|
+
const report = {
|
|
249
|
+
timestamp: new Date().toISOString(),
|
|
250
|
+
adapters: adapterReports,
|
|
251
|
+
sessionHealth,
|
|
252
|
+
};
|
|
253
|
+
if (args.json) {
|
|
254
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
// Human-readable output
|
|
258
|
+
console.log('=== Hooks Proxy Doctor ===');
|
|
259
|
+
console.log('');
|
|
260
|
+
// Adapter reports
|
|
261
|
+
console.log('--- Adapters ---');
|
|
262
|
+
for (const r of adapterReports) {
|
|
263
|
+
if (!r.available) {
|
|
264
|
+
console.log(`[x] ${r.name} (${r.packageName}): not available`);
|
|
265
|
+
if (r.error) {
|
|
266
|
+
console.log(` ${r.error}`);
|
|
267
|
+
}
|
|
268
|
+
console.log('');
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
const caps = r.capabilities;
|
|
272
|
+
const profile = r.capabilityProfile;
|
|
273
|
+
console.log(`[ok] ${r.name} (${r.packageName})`);
|
|
274
|
+
console.log(` Family: ${caps.family}`);
|
|
275
|
+
console.log(` Session ID: ${caps.sessionIdQuality}`);
|
|
276
|
+
console.log(` Env persistence: ${caps.envPersistenceMode}`);
|
|
277
|
+
console.log(` Blocking: ${caps.supportsBlock ? 'yes' : 'no'}`);
|
|
278
|
+
console.log(` Ask: ${caps.supportsAsk ? 'yes' : 'no'}`);
|
|
279
|
+
console.log(` Tool scope: ${caps.toolInterceptionScope}`);
|
|
280
|
+
console.log(` Tool mutation: input=${caps.supportsToolInputMutation ? 'yes' : 'no'} result=${caps.supportsToolResultMutation ? 'yes' : 'no'}`);
|
|
281
|
+
console.log(` Phases: ${profile.supportedPhases.length} supported, ${profile.unsupportedPhases.length} unsupported`);
|
|
282
|
+
if (profile.lossyPhases.length > 0) {
|
|
283
|
+
console.log(` Lossy phases: ${profile.lossyPhases.join(', ')}`);
|
|
284
|
+
}
|
|
285
|
+
if (profile.emulatedPhases.length > 0) {
|
|
286
|
+
console.log(` Emulated phases: ${profile.emulatedPhases.join(', ')}`);
|
|
287
|
+
}
|
|
288
|
+
if (r.warnings.length > 0) {
|
|
289
|
+
console.log(' Warnings:');
|
|
290
|
+
for (const w of r.warnings) {
|
|
291
|
+
console.log(` - ${w}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
console.log('');
|
|
295
|
+
}
|
|
296
|
+
// Session health
|
|
297
|
+
console.log('--- Session Store ---');
|
|
298
|
+
console.log(` Directory: ${sessionHealth.sessionDir}`);
|
|
299
|
+
console.log(` Exists: ${sessionHealth.dirExists ? 'yes' : 'no'}`);
|
|
300
|
+
if (sessionHealth.dirExists) {
|
|
301
|
+
console.log(` Sessions: ${sessionHealth.sessionCount}`);
|
|
302
|
+
console.log(` Total size: ${formatBytes(sessionHealth.totalSizeBytes)}`);
|
|
303
|
+
if (sessionHealth.staleSessions.length > 0) {
|
|
304
|
+
console.log(` Stale (>${args['stale-threshold'] ?? 24}h): ${sessionHealth.staleSessions.length}`);
|
|
305
|
+
for (const s of sessionHealth.staleSessions) {
|
|
306
|
+
console.log(` - ${s.sessionId} (${s.adapter}, ${s.ageHours}h old, ${formatBytes(s.fileSizeBytes)})`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (sessionHealth.corruptSessions.length > 0) {
|
|
310
|
+
console.log(` Corrupt: ${sessionHealth.corruptSessions.length}`);
|
|
311
|
+
for (const c of sessionHealth.corruptSessions) {
|
|
312
|
+
console.log(` - ${c}`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
if (sessionHealth.errors.length > 0) {
|
|
316
|
+
console.log(' Errors:');
|
|
317
|
+
for (const e of sessionHealth.errors) {
|
|
318
|
+
console.log(` - ${e}`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
console.log('');
|
|
323
|
+
},
|
|
324
|
+
};
|
|
325
|
+
function formatBytes(bytes) {
|
|
326
|
+
if (bytes === 0)
|
|
327
|
+
return '0 B';
|
|
328
|
+
const units = ['B', 'KB', 'MB', 'GB'];
|
|
329
|
+
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
330
|
+
const val = bytes / Math.pow(1024, i);
|
|
331
|
+
return `${val.toFixed(i > 0 ? 1 : 0)} ${units[i]}`;
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* exec command — Run a command with restored session context.
|
|
3
|
+
*
|
|
4
|
+
* Spec section 18.2.
|
|
5
|
+
*
|
|
6
|
+
* Pipeline:
|
|
7
|
+
* 1. Load session state
|
|
8
|
+
* 2. Materialize env/context into subprocess
|
|
9
|
+
* 3. Exec target command
|
|
10
|
+
*/
|
|
11
|
+
import type { CommandModule } from 'yargs';
|
|
12
|
+
interface ExecArgs {
|
|
13
|
+
'session-id': string;
|
|
14
|
+
_: (string | number)[];
|
|
15
|
+
}
|
|
16
|
+
export declare const execCommand: CommandModule<object, ExecArgs>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=exec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/exec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAO3C,UAAU,QAAQ;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CACxB;AAED,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC,MAAM,EAAE,QAAQ,CAiGvD,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* exec command — Run a command with restored session context.
|
|
4
|
+
*
|
|
5
|
+
* Spec section 18.2.
|
|
6
|
+
*
|
|
7
|
+
* Pipeline:
|
|
8
|
+
* 1. Load session state
|
|
9
|
+
* 2. Materialize env/context into subprocess
|
|
10
|
+
* 3. Exec target command
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.execCommand = void 0;
|
|
14
|
+
const child_process_1 = require("child_process");
|
|
15
|
+
const hooks_mux_core_1 = require("@a5c-ai/hooks-mux-core");
|
|
16
|
+
const hooks_logger_1 = require("../hooks-logger");
|
|
17
|
+
exports.execCommand = {
|
|
18
|
+
command: 'exec',
|
|
19
|
+
describe: 'Run a command with restored session context',
|
|
20
|
+
builder: (yargs) => yargs
|
|
21
|
+
.option('session-id', {
|
|
22
|
+
type: 'string',
|
|
23
|
+
demandOption: true,
|
|
24
|
+
describe: 'Session ID to load context from',
|
|
25
|
+
})
|
|
26
|
+
.parserConfiguration({ 'populate--': true })
|
|
27
|
+
.example('$0 exec --session-id abc123 -- echo hello', 'Run "echo hello" with session abc123 context'),
|
|
28
|
+
handler: async (args) => {
|
|
29
|
+
const logger = (0, hooks_logger_1.createHooksLogger)('exec');
|
|
30
|
+
const sessionId = args['session-id'];
|
|
31
|
+
const command = args['--'] ?? [];
|
|
32
|
+
if (command.length === 0) {
|
|
33
|
+
await logger.error('exec invoked without command', { sessionId });
|
|
34
|
+
console.error('Error: No command specified after --');
|
|
35
|
+
process.exitCode = 1;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Create a session store shim for materializeExecContext
|
|
39
|
+
const sessionStore = {
|
|
40
|
+
loadSession: (id) => (0, hooks_mux_core_1.loadSession)(id),
|
|
41
|
+
saveSession: async () => { },
|
|
42
|
+
};
|
|
43
|
+
// Materialize execution context
|
|
44
|
+
let childEnv;
|
|
45
|
+
try {
|
|
46
|
+
const materialized = await (0, hooks_mux_core_1.materializeExecContext)({
|
|
47
|
+
sessionId,
|
|
48
|
+
sessionStore,
|
|
49
|
+
});
|
|
50
|
+
// Merge materialized env with current process env
|
|
51
|
+
childEnv = {
|
|
52
|
+
...process.env,
|
|
53
|
+
...materialized.env,
|
|
54
|
+
};
|
|
55
|
+
await logger.debug('exec materialized session context', {
|
|
56
|
+
sessionId,
|
|
57
|
+
command: command.join(' '),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Fallback: inject at least AGENT_SESSION_ID even if session not found
|
|
62
|
+
childEnv = {
|
|
63
|
+
...process.env,
|
|
64
|
+
AGENT_SESSION_ID: sessionId,
|
|
65
|
+
};
|
|
66
|
+
await logger.warn('exec fell back to minimal session context', {
|
|
67
|
+
sessionId,
|
|
68
|
+
command: command.join(' '),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// Spawn the target command
|
|
72
|
+
const [cmd, ...cmdArgs] = command;
|
|
73
|
+
await logger.info('exec spawning command', {
|
|
74
|
+
sessionId,
|
|
75
|
+
command: [cmd, ...cmdArgs].join(' '),
|
|
76
|
+
});
|
|
77
|
+
const child = (0, child_process_1.spawn)(cmd, cmdArgs, {
|
|
78
|
+
env: childEnv,
|
|
79
|
+
stdio: 'inherit',
|
|
80
|
+
});
|
|
81
|
+
child.on('error', (err) => {
|
|
82
|
+
void logger.error('exec spawn failed', {
|
|
83
|
+
sessionId,
|
|
84
|
+
command: [cmd, ...cmdArgs].join(' '),
|
|
85
|
+
error: err.message,
|
|
86
|
+
});
|
|
87
|
+
console.error(`Failed to execute command: ${err.message}`);
|
|
88
|
+
process.exitCode = 1;
|
|
89
|
+
});
|
|
90
|
+
child.on('close', (code) => {
|
|
91
|
+
void logger.info('exec completed', {
|
|
92
|
+
sessionId,
|
|
93
|
+
command: [cmd, ...cmdArgs].join(' '),
|
|
94
|
+
exitCode: code ?? 0,
|
|
95
|
+
});
|
|
96
|
+
process.exitCode = code ?? 0;
|
|
97
|
+
});
|
|
98
|
+
// Wait for the child process to finish
|
|
99
|
+
await new Promise((resolve) => {
|
|
100
|
+
child.on('close', () => resolve());
|
|
101
|
+
});
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/cli/commands/exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* invoke command — Primary hook entrypoint.
|
|
3
|
+
*
|
|
4
|
+
* Spec section 18.1.
|
|
5
|
+
*
|
|
6
|
+
* Pipeline:
|
|
7
|
+
* 1. Read stdin when adapter expects it
|
|
8
|
+
* 2. Normalize event via adapter normalizer when available, else core normalizeEvent
|
|
9
|
+
* 3. Resolve/load session context via core session store
|
|
10
|
+
* 4. Run handler or fan-out plan via core runPlan
|
|
11
|
+
* 5. Merge results via core mergeResults
|
|
12
|
+
* 6. Persist session store
|
|
13
|
+
* 7. Apply propagation backend
|
|
14
|
+
* 8. Emit adapter-native output via adapter renderer when available
|
|
15
|
+
*/
|
|
16
|
+
import type { CommandModule } from 'yargs';
|
|
17
|
+
interface InvokeArgs {
|
|
18
|
+
adapter: string;
|
|
19
|
+
handler?: string[];
|
|
20
|
+
'bootstrap-only'?: boolean;
|
|
21
|
+
'native-event'?: string;
|
|
22
|
+
'session-id'?: string;
|
|
23
|
+
json?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare const invokeCommand: CommandModule<object, InvokeArgs>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=invoke.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/invoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAyB3C,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAmJD,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,CAiM3D,CAAC"}
|