greprag 5.52.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/docptr.js +16 -3
- package/dist/commands/docptr.js.map +1 -1
- package/dist/commands/email-primer-reminder.d.ts +23 -0
- package/dist/commands/email-primer-reminder.js +38 -0
- package/dist/commands/email-primer-reminder.js.map +1 -0
- 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 +3 -4
- 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-registry.js +2 -0
- package/dist/commands/reminder-registry.js.map +1 -1
- package/dist/commands/reminder-types.d.ts +6 -0
- package/dist/docptr-refs.d.ts +37 -0
- package/dist/docptr-refs.js +148 -0
- package/dist/docptr-refs.js.map +1 -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 +110 -10
- 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 +69 -17
- 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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"}
|