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.
- package/dist/commands/arm-reminder.js +1 -1
- package/dist/commands/arm-reminder.js.map +1 -1
- package/dist/commands/codex-supervisor.js +27 -8
- package/dist/commands/codex-supervisor.js.map +1 -1
- package/dist/commands/codex.js +27 -4
- package/dist/commands/codex.js.map +1 -1
- package/dist/commands/friction-reminder.d.ts +3 -4
- package/dist/commands/friction-reminder.js +42 -9
- package/dist/commands/friction-reminder.js.map +1 -1
- package/dist/commands/inbox-drain.js +9 -2
- package/dist/commands/inbox-drain.js.map +1 -1
- package/dist/commands/inbox-primer-reminder.d.ts +1 -1
- package/dist/commands/inbox-primer-reminder.js +1 -1
- package/dist/commands/inbox-primer-reminder.js.map +1 -1
- package/dist/commands/inbox-watch.d.ts +3 -0
- package/dist/commands/inbox-watch.js +9 -3
- package/dist/commands/inbox-watch.js.map +1 -1
- package/dist/commands/mechanic-live.d.ts +12 -0
- package/dist/commands/mechanic-live.js +89 -0
- package/dist/commands/mechanic-live.js.map +1 -0
- package/dist/commands/mechanic-manifest.d.ts +16 -0
- package/dist/commands/mechanic-manifest.js +81 -0
- package/dist/commands/mechanic-manifest.js.map +1 -0
- package/dist/commands/mechanic.d.ts +3 -0
- package/dist/commands/mechanic.js +61 -7
- package/dist/commands/mechanic.js.map +1 -1
- package/dist/commands/opencode-relay.js +10 -1
- package/dist/commands/opencode-relay.js.map +1 -1
- package/dist/commands/reminder-types.d.ts +6 -0
- package/dist/guard.d.ts +9 -2
- package/dist/guard.js +12 -5
- package/dist/guard.js.map +1 -1
- package/dist/harness.d.ts +6 -0
- package/dist/harness.js +47 -0
- package/dist/harness.js.map +1 -0
- package/dist/hook.js +81 -4
- package/dist/hook.js.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/mechanic-friction.d.ts +93 -0
- package/dist/mechanic-friction.js +368 -0
- package/dist/mechanic-friction.js.map +1 -0
- package/dist/mechanic-role.d.ts +20 -0
- package/dist/mechanic-role.js +107 -0
- package/dist/mechanic-role.js.map +1 -0
- package/dist/opencode-plugin.bundle.js +47 -13
- package/dist/session-id.d.ts +1 -1
- package/dist/session-id.js +2 -2
- package/dist/session-id.js.map +1 -1
- package/package.json +1 -1
- package/skill/greprag/docs/inbox-watch.md +3 -0
- 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
|
|
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
|
-
"
|
|
1974
|
-
|
|
1975
|
-
`
|
|
1976
|
-
|
|
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
|
-
//
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
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
|
package/dist/session-id.d.ts
CHANGED
|
@@ -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
|