greprag 5.53.0 → 5.53.1

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 (52) hide show
  1. package/dist/commands/arm-reminder.js +1 -1
  2. package/dist/commands/arm-reminder.js.map +1 -1
  3. package/dist/commands/codex-supervisor.js +27 -8
  4. package/dist/commands/codex-supervisor.js.map +1 -1
  5. package/dist/commands/codex.js +27 -4
  6. package/dist/commands/codex.js.map +1 -1
  7. package/dist/commands/friction-reminder.d.ts +3 -4
  8. package/dist/commands/friction-reminder.js +42 -9
  9. package/dist/commands/friction-reminder.js.map +1 -1
  10. package/dist/commands/inbox-drain.js +9 -2
  11. package/dist/commands/inbox-drain.js.map +1 -1
  12. package/dist/commands/inbox-primer-reminder.d.ts +1 -1
  13. package/dist/commands/inbox-primer-reminder.js +1 -1
  14. package/dist/commands/inbox-primer-reminder.js.map +1 -1
  15. package/dist/commands/inbox-watch.d.ts +3 -0
  16. package/dist/commands/inbox-watch.js +9 -3
  17. package/dist/commands/inbox-watch.js.map +1 -1
  18. package/dist/commands/mechanic-live.d.ts +12 -0
  19. package/dist/commands/mechanic-live.js +89 -0
  20. package/dist/commands/mechanic-live.js.map +1 -0
  21. package/dist/commands/mechanic-manifest.d.ts +16 -0
  22. package/dist/commands/mechanic-manifest.js +81 -0
  23. package/dist/commands/mechanic-manifest.js.map +1 -0
  24. package/dist/commands/mechanic.d.ts +3 -0
  25. package/dist/commands/mechanic.js +61 -7
  26. package/dist/commands/mechanic.js.map +1 -1
  27. package/dist/commands/opencode-relay.js +10 -1
  28. package/dist/commands/opencode-relay.js.map +1 -1
  29. package/dist/commands/reminder-types.d.ts +6 -0
  30. package/dist/guard.d.ts +9 -2
  31. package/dist/guard.js +12 -5
  32. package/dist/guard.js.map +1 -1
  33. package/dist/harness.d.ts +6 -0
  34. package/dist/harness.js +47 -0
  35. package/dist/harness.js.map +1 -0
  36. package/dist/hook.js +81 -4
  37. package/dist/hook.js.map +1 -1
  38. package/dist/index.js +12 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/mechanic-friction.d.ts +93 -0
  41. package/dist/mechanic-friction.js +368 -0
  42. package/dist/mechanic-friction.js.map +1 -0
  43. package/dist/mechanic-role.d.ts +20 -0
  44. package/dist/mechanic-role.js +107 -0
  45. package/dist/mechanic-role.js.map +1 -0
  46. package/dist/opencode-plugin.bundle.js +47 -13
  47. package/dist/session-id.d.ts +1 -1
  48. package/dist/session-id.js +2 -2
  49. package/dist/session-id.js.map +1 -1
  50. package/package.json +1 -1
  51. package/skill/greprag/docs/inbox-watch.md +3 -0
  52. package/skill/mechanic/SKILL.md +22 -0
@@ -0,0 +1,368 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MECHANIC_REPLY_MESSAGE_TYPE = exports.MECHANIC_LIVE_MESSAGE_TYPE = exports.MECHANIC_FRICTION_MESSAGE_TYPE = void 0;
37
+ exports.buildMechanicFrictionBody = buildMechanicFrictionBody;
38
+ exports.buildMechanicFrictionPayload = buildMechanicFrictionPayload;
39
+ exports.buildManualMechanicFrictionEvent = buildManualMechanicFrictionEvent;
40
+ exports.postMechanicFriction = postMechanicFriction;
41
+ exports.fanoutMechanicLive = fanoutMechanicLive;
42
+ exports.postMechanicReply = postMechanicReply;
43
+ exports.forwardStressMechanicFriction = forwardStressMechanicFriction;
44
+ const fs = __importStar(require("fs"));
45
+ const os = __importStar(require("os"));
46
+ const path = __importStar(require("path"));
47
+ const project_anchor_1 = require("./project-anchor");
48
+ const session_id_1 = require("./session-id");
49
+ const harness_1 = require("./harness");
50
+ exports.MECHANIC_FRICTION_MESSAGE_TYPE = 'mechanic_friction';
51
+ exports.MECHANIC_LIVE_MESSAGE_TYPE = 'mechanic_live';
52
+ exports.MECHANIC_REPLY_MESSAGE_TYPE = 'mechanic_reply';
53
+ function stateDir() {
54
+ const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
55
+ return path.join(home, '.greprag', 'state');
56
+ }
57
+ function getFlag(args, flag) {
58
+ const idx = args.indexOf(flag);
59
+ if (idx === -1 || idx + 1 >= args.length)
60
+ return undefined;
61
+ return args[idx + 1];
62
+ }
63
+ function getFlags(args, flag) {
64
+ const out = [];
65
+ for (let i = 0; i < args.length - 1; i++)
66
+ if (args[i] === flag)
67
+ out.push(args[i + 1]);
68
+ return out;
69
+ }
70
+ function parseFileFlag(raw) {
71
+ const lastColon = raw.lastIndexOf(':');
72
+ if (lastColon <= 0)
73
+ return { path: raw };
74
+ const tail = raw.slice(lastColon + 1);
75
+ if (/^\d+(-\d+)?$/.test(tail))
76
+ return { path: raw.slice(0, lastColon), lines: tail };
77
+ return { path: raw };
78
+ }
79
+ function positionalBody(args) {
80
+ const bodyFile = getFlag(args, '--body-file');
81
+ if (bodyFile)
82
+ return fs.readFileSync(bodyFile, 'utf-8');
83
+ if (args.includes('--stdin'))
84
+ return fs.readFileSync(0, 'utf-8');
85
+ const valueFlags = new Set([
86
+ '--tier', '--stress', '--stress-score', '--turn-count', '--signal',
87
+ '--from-session', '--file', '--body-file', '--source', '--platform',
88
+ '--transcript', '--to', '--session', '--friction-id', '--friction',
89
+ ]);
90
+ for (let i = 0; i < args.length; i++) {
91
+ if (args[i].startsWith('--'))
92
+ continue;
93
+ if (i > 0 && valueFlags.has(args[i - 1]))
94
+ continue;
95
+ return args[i];
96
+ }
97
+ return null;
98
+ }
99
+ function coerceTier(raw) {
100
+ return raw === 'sentence' || raw === 'mechanism' || raw === 'unsure' ? raw : 'unsure';
101
+ }
102
+ function numFlag(args, flag) {
103
+ const raw = getFlag(args, flag);
104
+ if (raw === undefined)
105
+ return null;
106
+ const n = Number(raw);
107
+ return Number.isFinite(n) ? n : null;
108
+ }
109
+ function buildMechanicFrictionBody(e) {
110
+ const lines = [
111
+ '[GrepRAG mechanic friction]',
112
+ `Source: ${e.source}${e.platform ? `/${e.platform}` : ''}`,
113
+ `Project: ${e.projectName} (${e.projectId.slice(0, 8)})`,
114
+ `Session: ${e.sourceSessionId || 'unknown'}`,
115
+ `CWD: ${e.cwd}`,
116
+ `Tier guess: ${e.tier}`,
117
+ `Stress: ${e.stress ?? 'n/a'}${e.stressScore !== undefined && e.stressScore !== null ? ` (score ${e.stressScore})` : ''}`,
118
+ e.turnCount !== undefined && e.turnCount !== null ? `Turn count: ${e.turnCount}` : '',
119
+ e.signals.length ? `Signals: ${e.signals.join(', ')}` : '',
120
+ e.files?.length ? `Files: ${e.files.map(f => f.lines ? `${f.path}:${f.lines}` : f.path).join(', ')}` : '',
121
+ '',
122
+ 'Summary:',
123
+ e.summary,
124
+ '',
125
+ 'Mechanic action: investigate the root cause, repair Tier 0/1 when safe, and ping the source session plus the operator for gates/status.',
126
+ ].filter(Boolean);
127
+ if (e.sourceSessionId) {
128
+ lines.push(`Reply to source: greprag mechanic reply --to ${e.sourceSessionId} "..." --friction-id <this-message-id>`);
129
+ }
130
+ return lines.join('\n');
131
+ }
132
+ function buildMechanicFrictionPayload(e) {
133
+ const references = { mechanic_friction: e };
134
+ if (e.files?.length)
135
+ references.files = e.files;
136
+ const payload = {
137
+ to: 'me',
138
+ body: buildMechanicFrictionBody(e),
139
+ message_type: exports.MECHANIC_FRICTION_MESSAGE_TYPE,
140
+ from_project_id: e.projectId,
141
+ references,
142
+ payload: { mechanic_friction: e },
143
+ };
144
+ if (e.sourceSessionId)
145
+ payload.from_session_id = e.sourceSessionId;
146
+ return payload;
147
+ }
148
+ function buildManualMechanicFrictionEvent(args, cwd = process.cwd()) {
149
+ const anchor = (0, project_anchor_1.readAnchor)(cwd);
150
+ const summary = positionalBody(args);
151
+ if (!summary || !summary.trim()) {
152
+ throw new Error('Usage: greprag mechanic friction "<summary>" [--tier sentence|mechanism|unsure] [--signal repetition] [--stress 1|2]');
153
+ }
154
+ return {
155
+ source: getFlag(args, '--source') || 'manual',
156
+ summary: summary.trim(),
157
+ cwd,
158
+ projectId: anchor.projectId,
159
+ projectName: anchor.projectName,
160
+ sourceSessionId: (0, session_id_1.truncateSessionId)(getFlag(args, '--from-session') || (0, session_id_1.readSessionEnv)()),
161
+ tier: coerceTier(getFlag(args, '--tier')),
162
+ stress: numFlag(args, '--stress'),
163
+ stressScore: numFlag(args, '--stress-score'),
164
+ turnCount: numFlag(args, '--turn-count'),
165
+ signals: getFlags(args, '--signal'),
166
+ transcriptPath: getFlag(args, '--transcript') || null,
167
+ files: getFlags(args, '--file').map(parseFileFlag),
168
+ platform: (0, harness_1.normalizeHarness)(getFlag(args, '--platform')) || (0, harness_1.inferCurrentHarness)(),
169
+ createdAt: new Date().toISOString(),
170
+ };
171
+ }
172
+ async function postMechanicFriction(apiUrl, apiKey, event, timeoutMs = 2500) {
173
+ const controller = new AbortController();
174
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
175
+ try {
176
+ const res = await fetch(`${apiUrl.replace(/\/+$/, '')}/v1/inbox/send`, {
177
+ method: 'POST',
178
+ headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
179
+ body: JSON.stringify(buildMechanicFrictionPayload(event)),
180
+ signal: controller.signal,
181
+ });
182
+ const json = await res.json().catch(() => ({}));
183
+ if (!res.ok)
184
+ throw new Error(json.error || `API ${res.status}`);
185
+ return json;
186
+ }
187
+ finally {
188
+ clearTimeout(timer);
189
+ }
190
+ }
191
+ function ownHandle() {
192
+ return (0, session_id_1.readIdentityAlias)() || 'me';
193
+ }
194
+ function sessionAddress(sessionId) {
195
+ const handle = ownHandle();
196
+ if (handle === 'me' || handle === 'self') {
197
+ throw new Error('No cached greprag identity handle; run `greprag identity` or `greprag init` before session-targeted mechanic sends.');
198
+ }
199
+ return `${handle}@greprag.com/${sessionId}`;
200
+ }
201
+ async function fetchLiveWatchers(apiUrl, apiKey) {
202
+ const res = await fetch(`${apiUrl.replace(/\/+$/, '')}/v1/inbox/watchers`, {
203
+ headers: { Authorization: `Bearer ${apiKey}` },
204
+ });
205
+ const data = await res.json().catch(() => ({}));
206
+ if (!res.ok)
207
+ throw new Error(data.error || `API ${res.status}`);
208
+ return Array.isArray(data.watchers) ? data.watchers : [];
209
+ }
210
+ function buildMechanicLiveBody(e) {
211
+ return [
212
+ '[GrepRAG mechanic is LIVE]',
213
+ `Mechanic source project: ${e.projectName} (${e.projectId.slice(0, 8)})`,
214
+ `Mechanic session: ${e.mechanicSessionId || 'project-wide'}`,
215
+ `Your session: ${e.targetSessionId}`,
216
+ '',
217
+ 'Default assumption: you are NOT the Mechanic.',
218
+ 'This is a tenant-wide mechanic rail for live friction from any project.',
219
+ 'For friction, do NOT use generic `greprag send`.',
220
+ 'Use the typed mechanic rail:',
221
+ `greprag mechanic friction "<summary>" --tier sentence|mechanism|unsure --signal <why> --platform <harness> --from-session ${e.targetSessionId}`,
222
+ '',
223
+ 'Then keep working unless blocked. The Mechanic can reply on the mechanic rail for follow-up coordination.',
224
+ ].join('\n');
225
+ }
226
+ async function fanoutMechanicLive(apiUrl, apiKey, input) {
227
+ const watchers = await fetchLiveWatchers(apiUrl, apiKey);
228
+ const seen = new Set();
229
+ let attempted = 0;
230
+ let sent = 0;
231
+ let skipped = 0;
232
+ const errors = [];
233
+ for (const w of watchers) {
234
+ const session = (0, session_id_1.truncateSessionId)(w.session_id || null);
235
+ if (!session || seen.has(session)) {
236
+ skipped++;
237
+ continue;
238
+ }
239
+ seen.add(session);
240
+ if (input.mechanicSessionId && session === input.mechanicSessionId) {
241
+ skipped++;
242
+ continue;
243
+ }
244
+ // The Mechanic is a tenant-level role: friction from any live project should
245
+ // know the typed rail. Skip service/null rows, but do not same-project gate.
246
+ if (!w.project_id && !w.project_name) {
247
+ skipped++;
248
+ continue;
249
+ }
250
+ attempted++;
251
+ const event = {
252
+ projectId: input.projectId,
253
+ projectName: input.projectName,
254
+ mechanicSessionId: input.mechanicSessionId,
255
+ targetSessionId: session,
256
+ cwd: input.cwd,
257
+ createdAt: new Date().toISOString(),
258
+ };
259
+ try {
260
+ const res = await fetch(`${apiUrl.replace(/\/+$/, '')}/v1/inbox/send`, {
261
+ method: 'POST',
262
+ headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
263
+ body: JSON.stringify({
264
+ to: sessionAddress(session),
265
+ body: buildMechanicLiveBody(event),
266
+ message_type: exports.MECHANIC_LIVE_MESSAGE_TYPE,
267
+ from_project_id: input.projectId,
268
+ from_session_id: input.fromSessionId || input.mechanicSessionId || undefined,
269
+ references: { mechanic_live: event },
270
+ payload: { mechanic_live: event },
271
+ }),
272
+ });
273
+ const json = await res.json().catch(() => ({}));
274
+ if (!res.ok)
275
+ throw new Error(json.error || `API ${res.status}`);
276
+ sent++;
277
+ }
278
+ catch (err) {
279
+ errors.push(`${session}: ${err.message}`);
280
+ }
281
+ }
282
+ return { attempted, sent, skipped, errors };
283
+ }
284
+ async function postMechanicReply(apiUrl, apiKey, args, cwd = process.cwd()) {
285
+ const target = (0, session_id_1.truncateSessionId)(getFlag(args, '--to') || getFlag(args, '--session'));
286
+ if (!target)
287
+ throw new Error('Usage: greprag mechanic reply --to <8hex-session> "<message>" [--friction-id <id>]');
288
+ const body = positionalBody(args);
289
+ if (!body || !body.trim())
290
+ throw new Error('Usage: greprag mechanic reply --to <8hex-session> "<message>" [--friction-id <id>]');
291
+ const anchor = (0, project_anchor_1.readAnchor)(cwd);
292
+ const senderSessionId = (0, session_id_1.truncateSessionId)(getFlag(args, '--from-session') || (0, session_id_1.readSessionEnv)());
293
+ const event = {
294
+ projectId: anchor.projectId,
295
+ projectName: anchor.projectName,
296
+ senderSessionId,
297
+ targetSessionId: target,
298
+ frictionId: getFlag(args, '--friction-id') || getFlag(args, '--friction') || null,
299
+ createdAt: new Date().toISOString(),
300
+ };
301
+ const lines = [
302
+ '[GrepRAG mechanic reply]',
303
+ `Project: ${event.projectName} (${event.projectId.slice(0, 8)})`,
304
+ event.frictionId ? `Friction: ${event.frictionId}` : '',
305
+ `Sender session: ${event.senderSessionId || 'unknown'}`,
306
+ '',
307
+ body.trim(),
308
+ '',
309
+ `Reply on mechanic rail: greprag mechanic reply --to ${event.senderSessionId || '<sender-session>'} "..."${event.frictionId ? ` --friction-id ${event.frictionId}` : ''}`,
310
+ ].filter(Boolean).join('\n');
311
+ const res = await fetch(`${apiUrl.replace(/\/+$/, '')}/v1/inbox/send`, {
312
+ method: 'POST',
313
+ headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
314
+ body: JSON.stringify({
315
+ to: sessionAddress(target),
316
+ body: lines,
317
+ message_type: exports.MECHANIC_REPLY_MESSAGE_TYPE,
318
+ from_project_id: anchor.projectId,
319
+ from_session_id: senderSessionId || undefined,
320
+ references: { mechanic_reply: event },
321
+ payload: { mechanic_reply: event },
322
+ }),
323
+ });
324
+ const json = await res.json().catch(() => ({}));
325
+ if (!res.ok)
326
+ throw new Error(json.error || `API ${res.status}`);
327
+ return json;
328
+ }
329
+ function forwardStampPath(projectId, sessionId) {
330
+ return path.join(stateDir(), `mechanic-friction-forward-${projectId}-${sessionId}.json`);
331
+ }
332
+ function shouldForward(projectId, sessionId, turnCount, stress) {
333
+ try {
334
+ const prior = JSON.parse(fs.readFileSync(forwardStampPath(projectId, sessionId), 'utf-8'));
335
+ return prior.turnCount !== turnCount || prior.stress !== stress;
336
+ }
337
+ catch {
338
+ return true;
339
+ }
340
+ }
341
+ function stampForward(projectId, sessionId, turnCount, stress) {
342
+ const file = forwardStampPath(projectId, sessionId);
343
+ fs.mkdirSync(path.dirname(file), { recursive: true });
344
+ fs.writeFileSync(file, JSON.stringify({ turnCount, stress, at: new Date().toISOString() }, null, 2) + '\n');
345
+ }
346
+ async function forwardStressMechanicFriction(input) {
347
+ if (!shouldForward(input.projectId, input.sourceSessionId, input.turnCount, input.stress))
348
+ return;
349
+ const event = {
350
+ source: 'hook',
351
+ summary: 'Live stress detector fired for this working session. The session is likely repeating a tool/action, retrying after errors, or churning on the same file.',
352
+ cwd: input.cwd,
353
+ projectId: input.projectId,
354
+ projectName: input.projectName,
355
+ sourceSessionId: input.sourceSessionId,
356
+ tier: 'unsure',
357
+ stress: input.stress,
358
+ stressScore: input.stressScore ?? null,
359
+ turnCount: input.turnCount,
360
+ signals: ['live-stress', input.stress >= 2 ? 'high' : 'elevated'],
361
+ transcriptPath: input.transcriptPath ?? null,
362
+ platform: input.platform ?? null,
363
+ createdAt: new Date().toISOString(),
364
+ };
365
+ await postMechanicFriction(input.apiUrl, input.apiKey, event);
366
+ stampForward(input.projectId, input.sourceSessionId, input.turnCount, input.stress);
367
+ }
368
+ //# sourceMappingURL=mechanic-friction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mechanic-friction.js","sourceRoot":"","sources":["../src/mechanic-friction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { ProjectAnchor } from './project-anchor';
2
+ export declare const MECHANIC_ROLE = "mechanic";
3
+ export declare function isMechanicProject(anchor: ProjectAnchor): boolean;
4
+ export declare function readMechanicSessionId(anchor: ProjectAnchor): string | null;
5
+ export declare function readMechanicRoleEpoch(anchor: ProjectAnchor): string | null;
6
+ export declare function isMechanicSession(anchor: ProjectAnchor, sessionId: string | null | undefined): boolean;
7
+ export declare function setMechanicProject(cwd: string, sessionId?: string | null): {
8
+ anchor: ProjectAnchor;
9
+ anchorPath: string;
10
+ mechanicSessionId: string | null;
11
+ };
12
+ export declare function clearMechanicProject(cwd: string): {
13
+ anchor: ProjectAnchor;
14
+ anchorPath: string;
15
+ };
16
+ export declare function readMechanicRole(cwd: string): {
17
+ anchor: ProjectAnchor;
18
+ isMechanic: boolean;
19
+ mechanicSessionId: string | null;
20
+ };
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MECHANIC_ROLE = void 0;
37
+ exports.isMechanicProject = isMechanicProject;
38
+ exports.readMechanicSessionId = readMechanicSessionId;
39
+ exports.readMechanicRoleEpoch = readMechanicRoleEpoch;
40
+ exports.isMechanicSession = isMechanicSession;
41
+ exports.setMechanicProject = setMechanicProject;
42
+ exports.clearMechanicProject = clearMechanicProject;
43
+ exports.readMechanicRole = readMechanicRole;
44
+ const fs = __importStar(require("fs"));
45
+ const project_anchor_1 = require("./project-anchor");
46
+ const session_id_1 = require("./session-id");
47
+ exports.MECHANIC_ROLE = 'mechanic';
48
+ const MECHANIC_SESSION_KEY = 'mechanic_session_id';
49
+ const MECHANIC_EPOCH_KEY = 'mechanic_role_set_at';
50
+ function isMechanicProject(anchor) {
51
+ return anchor.role === exports.MECHANIC_ROLE;
52
+ }
53
+ function readRawAnchor(anchorPath) {
54
+ try {
55
+ return JSON.parse(fs.readFileSync(anchorPath, 'utf-8'));
56
+ }
57
+ catch {
58
+ return {};
59
+ }
60
+ }
61
+ function writeRawAnchor(anchorPath, raw) {
62
+ fs.writeFileSync(anchorPath, JSON.stringify(raw, null, 2) + '\n');
63
+ }
64
+ function readMechanicSessionId(anchor) {
65
+ const raw = readRawAnchor(anchor.anchorPath);
66
+ return (0, session_id_1.truncateSessionId)(typeof raw[MECHANIC_SESSION_KEY] === 'string' ? raw[MECHANIC_SESSION_KEY] : null);
67
+ }
68
+ function readMechanicRoleEpoch(anchor) {
69
+ const raw = readRawAnchor(anchor.anchorPath);
70
+ const value = raw[MECHANIC_EPOCH_KEY];
71
+ return typeof value === 'string' && value.trim() ? value : null;
72
+ }
73
+ function isMechanicSession(anchor, sessionId) {
74
+ if (!isMechanicProject(anchor))
75
+ return false;
76
+ const mechanicSessionId = readMechanicSessionId(anchor);
77
+ if (!mechanicSessionId)
78
+ return true;
79
+ return (0, session_id_1.truncateSessionId)(sessionId) === mechanicSessionId;
80
+ }
81
+ function setMechanicProject(cwd, sessionId) {
82
+ const { anchorPath } = (0, project_anchor_1.setProjectRole)(cwd, exports.MECHANIC_ROLE);
83
+ const raw = readRawAnchor(anchorPath);
84
+ raw.role = exports.MECHANIC_ROLE;
85
+ raw[MECHANIC_EPOCH_KEY] = new Date().toISOString();
86
+ const mechanicSessionId = (0, session_id_1.truncateSessionId)(sessionId);
87
+ if (mechanicSessionId)
88
+ raw[MECHANIC_SESSION_KEY] = mechanicSessionId;
89
+ else
90
+ delete raw[MECHANIC_SESSION_KEY];
91
+ writeRawAnchor(anchorPath, raw);
92
+ return { anchor: (0, project_anchor_1.readAnchor)(cwd), anchorPath, mechanicSessionId };
93
+ }
94
+ function clearMechanicProject(cwd) {
95
+ const { anchorPath } = (0, project_anchor_1.setProjectRole)(cwd, null);
96
+ const raw = readRawAnchor(anchorPath);
97
+ delete raw.role;
98
+ delete raw[MECHANIC_SESSION_KEY];
99
+ delete raw[MECHANIC_EPOCH_KEY];
100
+ writeRawAnchor(anchorPath, raw);
101
+ return { anchor: (0, project_anchor_1.readAnchor)(cwd), anchorPath };
102
+ }
103
+ function readMechanicRole(cwd) {
104
+ const anchor = (0, project_anchor_1.readAnchor)(cwd);
105
+ return { anchor, isMechanic: isMechanicProject(anchor), mechanicSessionId: readMechanicSessionId(anchor) };
106
+ }
107
+ //# sourceMappingURL=mechanic-role.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mechanic-role.js","sourceRoot":"","sources":["../src/mechanic-role.ts"],"names":[],"mappings":"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"}
@@ -1746,9 +1746,9 @@ function crushMessages(messages, opts) {
1746
1746
  }
1747
1747
 
1748
1748
  // src/session-id.ts
1749
- function armMonitorCommand(short, ownerPid, assistant = false) {
1749
+ function armMonitorCommand(short, ownerPid, assistant = false, mechanic = false) {
1750
1750
  const owner = ownerPid ? ` --owner-pid ${ownerPid}` : "";
1751
- const role = assistant ? " --assistant" : "";
1751
+ const role = mechanic ? " --mechanic" : assistant ? " --assistant" : "";
1752
1752
  const watch = `greprag inbox watch --session ${short} --json${owner}${role}`;
1753
1753
  return `while true; do ${watch}; case $? in 0|64) break;; esac; sleep 1; done`;
1754
1754
  }
@@ -1756,7 +1756,7 @@ function armMonitorCommand(short, ownerPid, assistant = false) {
1756
1756
  // src/commands/inbox-primer-reminder.ts
1757
1757
  function buildInboxPrimer(env) {
1758
1758
  const codex = env.platform === "codex";
1759
- const arm = armMonitorCommand(env.short, env.ownerPid, env.assistant);
1759
+ const arm = armMonitorCommand(env.short, env.ownerPid, env.assistant, env.mechanic);
1760
1760
  return [
1761
1761
  // LEAD — the forcing function (restored 2026-06-22). ARM is an ALARM, not reference:
1762
1762
  // you are unreachable until you do it, and it must be re-done every time the watcher
@@ -1928,7 +1928,7 @@ function buildArmReminder(d, env) {
1928
1928
  if (d.tier === "silent")
1929
1929
  return null;
1930
1930
  const unread = Number(d.detail && d.detail.unread || 0);
1931
- const arm = env ? `ToolSearch select:Monitor \u2192 persistent Monitor (timeout_ms:3600000) command: \`${armMonitorCommand(env.short, env.ownerPid, env.assistant)}\`` : `arm your Monitor inbox watcher`;
1931
+ const arm = env ? `ToolSearch select:Monitor \u2192 persistent Monitor (timeout_ms:3600000) command: \`${armMonitorCommand(env.short, env.ownerPid, env.assistant, env.mechanic)}\`` : `arm your Monitor inbox watcher`;
1932
1932
  const grounded = `greprag reads your watcher as DOWN (isLocallyArmed=false \u2014 a real pidfile check on your session, NOT a timer; the hook CAN see your watcher)`;
1933
1933
  if (unread > 0) {
1934
1934
  return `\u26A0 A peer messaged you (${unread} waiting) & ${grounded}. You're unreachable. Arm + answer NOW, don't reason past this: ${arm}, then \`greprag inbox\`.`;
@@ -1955,7 +1955,25 @@ function frictionReminderTier(stress) {
1955
1955
  return "nudge";
1956
1956
  return "silent";
1957
1957
  }
1958
- function buildFrictionReminder(tier) {
1958
+ function routeCommand(env) {
1959
+ const platform = env?.platform || "<harness>";
1960
+ return `greprag mechanic friction "<summary>" --tier sentence|mechanism|unsure --signal <why> --platform ${platform}`;
1961
+ }
1962
+ function buildMechanicLiveNotice(env) {
1963
+ return `GrepRAG Mechanic is live. Default assumption: this working session is NOT the Mechanic; route future friction with \`${routeCommand(env)}\`, then keep working. Check role only when needed: \`greprag mechanic role\`.`;
1964
+ }
1965
+ function buildFrictionReminder(tier, env) {
1966
+ const routed = !!env?.mechanicLive && !env?.mechanic;
1967
+ if (routed) {
1968
+ switch (tier) {
1969
+ case "nag":
1970
+ return `\u26A0 FRICTION HIGH (live signal: repetition / errors / churn) \u2014 a live Mechanic exists, so this stress signal is being auto-forwarded. Add specifics if useful: \`${routeCommand(env)}\`; otherwise keep working.`;
1971
+ case "nudge":
1972
+ return `\u26A0 Friction detected (live signal) \u2014 a live Mechanic exists, so this stress signal is being auto-forwarded. Add specifics if useful: \`${routeCommand(env)}\`; otherwise keep working.`;
1973
+ default:
1974
+ return null;
1975
+ }
1976
+ }
1959
1977
  switch (tier) {
1960
1978
  case "nag":
1961
1979
  return '\u26A0 FRICTION HIGH (live signal: repetition / errors / churn) \u2014 STOP pushing through; fix the PATTERN now \u2192 `greprag load reflex-chip` (sentence-tier) or `greprag load workshop-chip` (machinery), then spawn_task. No friction? say "clear" + continue.';
@@ -1970,10 +1988,11 @@ var WORKSHOP_METHOD = "spawn a workshop chip \u2014 `greprag load workshop-chip`
1970
1988
  function buildMechanicAnnounce() {
1971
1989
  return [
1972
1990
  "[Active Mechanic \u2014 keep the harness healthy IN-SESSION. Friction is a signal to fix NOW, not to defer; the moment that produced it still holds the context the fix needs.]",
1973
- "WHEN you hit friction this session \u2014 repeated yourself, fought a tool, got corrected \u22652\xD7 on the same thing, or rediscovered something already known \u2014 fix the PATTERN now; do not push through.",
1974
- `SENTENCE-TIER friction (the fix is words in a file you own \u2014 a skill / doc / CLAUDE.md): ${REFLEX_METHOD}. The chip is preloaded with the mechanic tools + live \`greprag mechanic status\`, lands a Tier-0 born-shadow repair, and ends \u2014 no gate to wait at.`,
1975
- `MECHANISM-TIER friction (the fix is machinery \u2014 a hook / gate / trigger / code, anything you can't fix in words): ${WORKSHOP_METHOD}.`,
1976
- 'MODES (when unsure which, or when it is not a chip): fix (land the repair inline) \xB7 log (`greprag fix log "<obs>"` to queue it for /mechanic) \xB7 ask-human (the operator must decide).',
1991
+ "DEFAULT POSTURE: assume this session is NOT the Mechanic. The exception is explicit role signal: `greprag mechanic role` says `current: ... (will arm with --mechanic)` or the hook names this session as mechanic.",
1992
+ 'WHEN friction happens in a normal working session \u2014 repeated yourself, fought a tool, got corrected >=2x on the same thing, or rediscovered something already known \u2014 send `greprag mechanic friction "<summary>" --tier sentence|mechanism|unsure --signal <why> --platform <harness>` and keep working. The stress hook auto-forwards broad repetition/error/churn.',
1993
+ `WHEN this session IS the Mechanic: fix the PATTERN now; do not push through. SENTENCE-TIER friction (words in a file you own \u2014 a skill / doc / CLAUDE.md): ${REFLEX_METHOD}. The chip is preloaded with the mechanic tools + live \`greprag mechanic status\`, lands a Tier-0 born-shadow repair, and ends \u2014 no gate to wait at.`,
1994
+ `MECHANISM-TIER friction for the Mechanic (a hook / gate / trigger / code, anything you can't fix in words): ${WORKSHOP_METHOD}.`,
1995
+ 'MODES (when unsure which, or when it is not a chip): route (`greprag mechanic friction ...`) \xB7 fix (Mechanic or local blocking repair) \xB7 log (`greprag fix log "<obs>"` to queue it for /mechanic) \xB7 ask-human (the operator must decide).',
1977
1996
  "Every repair is ROOT-CAUSE \u2014 fix the pattern that makes the friction class possible, never a guard on today's trigger.",
1978
1997
  'A per-turn reminder fires ONLY when live friction is DETECTED (the stress signal \u2014 repetition / errors / churn), never on a timer \u2014 act on it, or say "clear" and continue.'
1979
1998
  ].join("\n");
@@ -1981,10 +2000,25 @@ function buildMechanicAnnounce() {
1981
2000
  var mechanicFrictionModule = {
1982
2001
  id: "mechanic-friction",
1983
2002
  dependsOn: ["chip-spawn-pointer"],
1984
- // Fires ONLY on detected stress (elevated/high) — no turn-cadence nag.
1985
- detect: (env) => ({ tier: frictionReminderTier(env.stress) }),
1986
- announce: () => buildMechanicAnnounce(),
1987
- reminder: (d) => buildFrictionReminder(d.tier)
2003
+ // Stress fires the real friction reminder. A designated Mechanic also creates a
2004
+ // one-shot ambient route notice per source session/role epoch (hook-stamped).
2005
+ detect: (env) => {
2006
+ const tier = frictionReminderTier(env.stress);
2007
+ if (tier !== "silent")
2008
+ return { tier };
2009
+ if (env.mechanicLiveNotice && !env.mechanic)
2010
+ return { tier: "ambient" };
2011
+ return { tier: "silent" };
2012
+ },
2013
+ announce: (env = {}) => {
2014
+ const base = buildMechanicAnnounce();
2015
+ if (env.mechanicLive && !env.mechanic)
2016
+ return `${base}
2017
+
2018
+ ${buildMechanicLiveNotice(env)}`;
2019
+ return base;
2020
+ },
2021
+ reminder: (d, env) => d.tier === "ambient" ? buildMechanicLiveNotice(env) : buildFrictionReminder(d.tier, env)
1988
2022
  };
1989
2023
 
1990
2024
  // src/commands/coordinate-gate.ts
@@ -79,7 +79,7 @@ export declare function buildSessionIdContext(short: string, alias?: string | nu
79
79
  * made the wrapper unsafe before. The layers: this loop relaunches a dead
80
80
  * SUPERVISOR; the supervisor respawns a dead SSE CHILD; EPIPE-terminal stops
81
81
  * everything when the consumer leaves. adr: adr/monitor-resilience.md */
82
- export declare function armMonitorCommand(short: string, ownerPid?: number | null, assistant?: boolean): string;
82
+ export declare function armMonitorCommand(short: string, ownerPid?: number | null, assistant?: boolean, mechanic?: boolean): string;
83
83
  /** Handle `greprag-hook session-id`. Reads the Claude Code hook payload
84
84
  * from `input.session_id`, emits a JSON response with hookSpecificOutput.
85
85
  * additionalContext to stdout. Silent on missing session_id (other hook