@autopilot-harness/port-devin 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Autopilot Harness contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,143 @@
1
+ import { type PhaseActionConfig, type ReviewEngine, type StateStore } from "@autopilot-harness/core";
2
+ /** Devin CLI UserPromptSubmit stdin. Conversation key is `session_id` only. */
3
+ export interface DevinSubmitPayload {
4
+ session_id?: string;
5
+ sessionId?: string;
6
+ prompt?: string;
7
+ /** Informational. Store always uses the install-root projectRoot. */
8
+ cwd?: string;
9
+ prompt_id?: string;
10
+ hook_event_name?: string;
11
+ hookEventName?: string;
12
+ }
13
+ /** Devin CLI PostToolUse stdin. */
14
+ export interface DevinEditPayload {
15
+ session_id?: string;
16
+ sessionId?: string;
17
+ cwd?: string;
18
+ tool_name?: string;
19
+ toolName?: string;
20
+ tool_input?: Record<string, unknown> | string;
21
+ toolInput?: Record<string, unknown> | string;
22
+ hook_event_name?: string;
23
+ hookEventName?: string;
24
+ }
25
+ /** Devin CLI Stop stdin. No SubagentStop event in this port. */
26
+ export interface DevinStopPayload {
27
+ session_id?: string;
28
+ sessionId?: string;
29
+ cwd?: string;
30
+ transcript_path?: string;
31
+ transcriptPath?: string;
32
+ status?: string;
33
+ /** Boolean. `true` means a Stop hook is already active (not a numeric cap). */
34
+ stop_hook_active?: boolean;
35
+ stopHookActive?: boolean;
36
+ hook_event_name?: string;
37
+ hookEventName?: string;
38
+ }
39
+ export interface DevinPortConfig {
40
+ phaseActions?: PhaseActionConfig;
41
+ }
42
+ /**
43
+ * UPS / Stop stdout. Allow is an empty object (runner writes zero-byte stdout,
44
+ * exit 0). Optional `{decision:"approve"}` is also allow. Continue is
45
+ * `{decision:"block", reason}`. Never exit 2 — that blocks, and harness
46
+ * errors must fail open.
47
+ */
48
+ export interface DevinSubmitResult {
49
+ decision?: "block" | "approve";
50
+ reason?: string;
51
+ hookSpecificOutput?: {
52
+ hookEventName: "UserPromptSubmit";
53
+ additionalContext?: string;
54
+ };
55
+ }
56
+ export interface DevinStopResult {
57
+ decision?: "block" | "approve";
58
+ reason?: string;
59
+ /** Deliver-once (loop:false). Not the continue contract. */
60
+ continue?: boolean;
61
+ stopReason?: string;
62
+ }
63
+ export declare const DEVIN_PLATFORM = "devin";
64
+ /** Hook child env. Stock command quotes this, not a relative `.autopilot/bin`. */
65
+ export declare const DEVIN_PROJECT_DIR_ENV = "DEVIN_PROJECT_DIR";
66
+ /** The file is the event map. Do not nest under `"hooks"`. */
67
+ export declare const DEVIN_HOOKS_REL_PATH = ".devin/hooks.v1.json";
68
+ /** Seconds. No documented host default — init writes this. */
69
+ export declare const DEVIN_HOOK_TIMEOUT_SEC = 120;
70
+ /**
71
+ * Soft min from research probe (3000.10.31). Below → doctor WARN.
72
+ * Unparseable version → tip to trust the live CLI; do not invent a lower floor.
73
+ */
74
+ export declare const DEVIN_SOFT_MIN_VERSION = "3000.10.31";
75
+ /**
76
+ * Public research: no documented numeric Stop-continue hard-cap / raise knob.
77
+ * Live smoke decides full vs degraded.
78
+ */
79
+ export declare const DEVIN_STOP_CAP_RAISE_FOUND = false;
80
+ /**
81
+ * Anchored PostToolUse matcher. `"edit"` alone is a substring and also
82
+ * matches names that merely contain `edit`. `exec` is intentionally absent
83
+ * (dirty-arm on Stop, never a Post block).
84
+ */
85
+ export declare const DEVIN_POST_TOOL_USE_MATCHER = "^(write|edit|apply_patch|notebook_edit)$";
86
+ export declare const DEVIN_AUTOPILOT_EVENTS: readonly ["UserPromptSubmit", "PostToolUse", "Stop"];
87
+ export type DevinHookEvent = (typeof DEVIN_AUTOPILOT_EVENTS)[number];
88
+ /** Runner must use this on throw / empty allow. Never 2. */
89
+ export declare const DEVIN_FAIL_OPEN_EXIT: 0;
90
+ export declare const MAX_NEED_PICK_SLUGS = 40;
91
+ export declare const MAX_NEED_PICK_CONTEXT_CHARS = 2000;
92
+ export declare const MAX_HOOK_TEXT_CHARS = 8192;
93
+ /** Refuse huge stringified `tool_input` before JSON.parse. */
94
+ export declare const MAX_TOOL_INPUT_JSON_CHARS = 1048576;
95
+ /**
96
+ * Distinct from the Claude stamp (`--platform claude-code`, relative bin).
97
+ * `$DEVIN_PROJECT_DIR` is required because the hook cwd is not the repo root.
98
+ */
99
+ export declare function devinHookCommandLine(event: string): string;
100
+ /** True only for this port's command stamp. Claude lines are not a match. */
101
+ export declare function isDevinHookFingerprint(command: string | undefined): boolean;
102
+ /**
103
+ * Install root, then `DEVIN_PROJECT_DIR`, then stdin cwd.
104
+ * Never `process.cwd()` and never payload `cwd`.
105
+ */
106
+ export declare function resolveDevinWorkspaceRoot(opts?: {
107
+ installRoot?: string;
108
+ env?: NodeJS.ProcessEnv;
109
+ stdinCwd?: string;
110
+ } | null): string | null;
111
+ /**
112
+ * Either boolean form strictly `true` → loopCount ≥ 1.
113
+ * Missing, false, or a non-boolean (including `"true"`) → 0.
114
+ */
115
+ export declare function loopCountFromDevinStopHookActive(payload: DevinStopPayload | null | undefined): number;
116
+ export declare function isDevinEditTool(toolName: string): boolean;
117
+ /** Shell tool. Not in the Post matcher. Stop dirty-arm covers its edits. */
118
+ export declare function isDevinExecTool(toolName: string): boolean;
119
+ /** Empty object → runner zero-byte stdout + exit 0. */
120
+ export declare function isDevinSilentAllow(result: DevinSubmitResult | DevinStopResult | null | undefined): boolean;
121
+ /** First usable path. A bad earlier key does not hide a later one. */
122
+ export declare function filePathFromDevinEdit(payload: DevinEditPayload | null | undefined): string;
123
+ /**
124
+ * UserPromptSubmit. Harness followups are not ON/RUN.
125
+ * Fail-open: throw → `{}` (exit 0), never exit 2.
126
+ */
127
+ export declare function handleDevinUserPromptSubmit(store: StateStore, payload: DevinSubmitPayload, projectRoot: string, portConfig?: DevinPortConfig): DevinSubmitResult;
128
+ /**
129
+ * PostToolUse. Matcher tools arm `code_edited`. `exec` does not (Stop
130
+ * dirty-arm). This function never returns a block decision.
131
+ */
132
+ export declare function handleDevinPostToolUse(store: StateStore, payload: DevinEditPayload, projectRoot: string): void;
133
+ export declare function normalizeDevinStopStatus(payload: DevinStopPayload, opts?: {
134
+ status?: "completed" | "error" | "aborted";
135
+ }): "completed" | "error" | "aborted";
136
+ /**
137
+ * Stop → ReviewEngine. Continue is stdout `{decision:"block", reason}`.
138
+ * `stop_hook_active: true` maps to loopCount 1. Fail-open returns `{}`.
139
+ */
140
+ export declare function handleDevinStop(engine: ReviewEngine, payload: DevinStopPayload, opts?: {
141
+ status?: "completed" | "error" | "aborted";
142
+ }): DevinStopResult;
143
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,515 @@
1
+ import { applyOff, applyOn, applyReplan, applyResume, applyResumeReview, applyRun, applyTrackPick, ensureAmbientReviewSession, effectiveReviewingItemId, firstUnchecked, isChannelANeedPick, isHarnessFollowupMessage, isProductCodeEdit, isRecoverOrStuckFollowupMessage, isSafeTrackSlug, loadProjectHookConfig, loadProjectReviewConfig, notePlansDirEdit, parseAdvanceNextItemId, parseChecklist, parseTrigger, } from "@autopilot-harness/core";
2
+ export const DEVIN_PLATFORM = "devin";
3
+ /** Hook child env. Stock command quotes this, not a relative `.autopilot/bin`. */
4
+ export const DEVIN_PROJECT_DIR_ENV = "DEVIN_PROJECT_DIR";
5
+ /** The file is the event map. Do not nest under `"hooks"`. */
6
+ export const DEVIN_HOOKS_REL_PATH = ".devin/hooks.v1.json";
7
+ /** Seconds. No documented host default — init writes this. */
8
+ export const DEVIN_HOOK_TIMEOUT_SEC = 120;
9
+ /**
10
+ * Soft min from research probe (3000.10.31). Below → doctor WARN.
11
+ * Unparseable version → tip to trust the live CLI; do not invent a lower floor.
12
+ */
13
+ export const DEVIN_SOFT_MIN_VERSION = "3000.10.31";
14
+ /**
15
+ * Public research: no documented numeric Stop-continue hard-cap / raise knob.
16
+ * Live smoke decides full vs degraded.
17
+ */
18
+ export const DEVIN_STOP_CAP_RAISE_FOUND = false;
19
+ /**
20
+ * Anchored PostToolUse matcher. `"edit"` alone is a substring and also
21
+ * matches names that merely contain `edit`. `exec` is intentionally absent
22
+ * (dirty-arm on Stop, never a Post block).
23
+ */
24
+ export const DEVIN_POST_TOOL_USE_MATCHER = "^(write|edit|apply_patch|notebook_edit)$";
25
+ const DEVIN_EDIT_TOOL_RE = new RegExp(DEVIN_POST_TOOL_USE_MATCHER);
26
+ const DEVIN_EXEC_TOOL_RE = /^exec$/;
27
+ export const DEVIN_AUTOPILOT_EVENTS = [
28
+ "UserPromptSubmit",
29
+ "PostToolUse",
30
+ "Stop",
31
+ ];
32
+ /** Runner must use this on throw / empty allow. Never 2. */
33
+ export const DEVIN_FAIL_OPEN_EXIT = 0;
34
+ export const MAX_NEED_PICK_SLUGS = 40;
35
+ export const MAX_NEED_PICK_CONTEXT_CHARS = 2_000;
36
+ export const MAX_HOOK_TEXT_CHARS = 8_192;
37
+ /** Refuse huge stringified `tool_input` before JSON.parse. */
38
+ export const MAX_TOOL_INPUT_JSON_CHARS = 1_048_576;
39
+ const PATH_KEYS = [
40
+ "file_path",
41
+ "filePath",
42
+ "path",
43
+ "notebook_path",
44
+ "notebookPath",
45
+ "target_file",
46
+ "targetFile",
47
+ ];
48
+ /**
49
+ * Distinct from the Claude stamp (`--platform claude-code`, relative bin).
50
+ * `$DEVIN_PROJECT_DIR` is required because the hook cwd is not the repo root.
51
+ */
52
+ export function devinHookCommandLine(event) {
53
+ if (typeof event !== "string") {
54
+ throw new Error("devinHookCommandLine: invalid event");
55
+ }
56
+ const safeEvent = event.replace(/[^A-Za-z0-9._+-]/g, "").slice(0, 64);
57
+ if (!safeEvent ||
58
+ safeEvent !== event ||
59
+ !DEVIN_AUTOPILOT_EVENTS.includes(event)) {
60
+ throw new Error("devinHookCommandLine: invalid event");
61
+ }
62
+ return `node "$${DEVIN_PROJECT_DIR_ENV}"/.autopilot/bin/autopilot-harness-hook.mjs --platform ${DEVIN_PLATFORM} --event ${safeEvent}`;
63
+ }
64
+ /** True only for this port's command stamp. Claude lines are not a match. */
65
+ export function isDevinHookFingerprint(command) {
66
+ if (typeof command !== "string")
67
+ return false;
68
+ if (!command.includes("autopilot-harness-hook.mjs"))
69
+ return false;
70
+ if (/(?:^|\s)--platform claude-code(?:\s|$)/.test(command))
71
+ return false;
72
+ return /(?:^|\s)--platform devin(?:\s|$)/.test(command);
73
+ }
74
+ /**
75
+ * Install root, then `DEVIN_PROJECT_DIR`, then stdin cwd.
76
+ * Never `process.cwd()` and never payload `cwd`.
77
+ */
78
+ export function resolveDevinWorkspaceRoot(opts) {
79
+ if (!opts)
80
+ return null;
81
+ const env = opts.env ?? {};
82
+ const candidates = [
83
+ opts.installRoot,
84
+ env[DEVIN_PROJECT_DIR_ENV],
85
+ opts.stdinCwd,
86
+ ];
87
+ for (const candidate of candidates) {
88
+ if (typeof candidate !== "string")
89
+ continue;
90
+ const trimmed = candidate.trim();
91
+ if (trimmed && !/[\u0000-\u001f\u007f]/.test(trimmed))
92
+ return trimmed;
93
+ }
94
+ return null;
95
+ }
96
+ /**
97
+ * Either boolean form strictly `true` → loopCount ≥ 1.
98
+ * Missing, false, or a non-boolean (including `"true"`) → 0.
99
+ */
100
+ export function loopCountFromDevinStopHookActive(payload) {
101
+ if (!payload || typeof payload !== "object")
102
+ return 0;
103
+ return payload.stop_hook_active === true || payload.stopHookActive === true
104
+ ? 1
105
+ : 0;
106
+ }
107
+ export function isDevinEditTool(toolName) {
108
+ if (typeof toolName !== "string")
109
+ return false;
110
+ return DEVIN_EDIT_TOOL_RE.test(toolName.trim());
111
+ }
112
+ /** Shell tool. Not in the Post matcher. Stop dirty-arm covers its edits. */
113
+ export function isDevinExecTool(toolName) {
114
+ if (typeof toolName !== "string")
115
+ return false;
116
+ return DEVIN_EXEC_TOOL_RE.test(toolName.trim());
117
+ }
118
+ /** Empty object → runner zero-byte stdout + exit 0. */
119
+ export function isDevinSilentAllow(result) {
120
+ if (result == null || typeof result !== "object" || Array.isArray(result)) {
121
+ return false;
122
+ }
123
+ for (const value of Object.values(result)) {
124
+ if (value !== undefined && value !== null)
125
+ return false;
126
+ }
127
+ return true;
128
+ }
129
+ function sessionIdOnly(payload) {
130
+ if (!payload || typeof payload !== "object")
131
+ return "";
132
+ for (const raw of [payload.session_id, payload.sessionId]) {
133
+ if (typeof raw !== "string")
134
+ continue;
135
+ const trimmed = raw.trim();
136
+ // Match StateStore: control chars are not a conversation key.
137
+ if (!trimmed || /[\u0000-\u001f\u007f]/.test(trimmed))
138
+ continue;
139
+ return trimmed;
140
+ }
141
+ return "";
142
+ }
143
+ function clipText(text, max = MAX_HOOK_TEXT_CHARS) {
144
+ if (text.length <= max)
145
+ return text;
146
+ return `${text.slice(0, max - 1)}…`;
147
+ }
148
+ function blockReason(message, fallback) {
149
+ const text = typeof message === "string" ? message.trim() : "";
150
+ return clipText(text || fallback);
151
+ }
152
+ function firstNonBlankString(...values) {
153
+ for (const value of values) {
154
+ if (typeof value !== "string")
155
+ continue;
156
+ const trimmed = value.trim();
157
+ if (trimmed)
158
+ return trimmed;
159
+ }
160
+ return "";
161
+ }
162
+ function toolNameOf(payload) {
163
+ if (!payload || typeof payload !== "object")
164
+ return "";
165
+ return firstNonBlankString(payload.tool_name, payload.toolName);
166
+ }
167
+ function asToolInputObject(value) {
168
+ if (!value)
169
+ return null;
170
+ if (typeof value === "object" && !Array.isArray(value)) {
171
+ return value;
172
+ }
173
+ if (typeof value !== "string")
174
+ return null;
175
+ if (value.length > MAX_TOOL_INPUT_JSON_CHARS)
176
+ return null;
177
+ const text = value.trim();
178
+ if (!text)
179
+ return null;
180
+ try {
181
+ const parsed = JSON.parse(text);
182
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
183
+ return null;
184
+ }
185
+ return parsed;
186
+ }
187
+ catch {
188
+ return null;
189
+ }
190
+ }
191
+ function pathText(value) {
192
+ if (typeof value !== "string")
193
+ return "";
194
+ const trimmed = value.trim();
195
+ if (!trimmed || /[\u0000-\u001f\u007f]/.test(trimmed))
196
+ return "";
197
+ return trimmed;
198
+ }
199
+ function objectHasPath(input) {
200
+ return PATH_KEYS.some((key) => pathText(input[key]).length > 0);
201
+ }
202
+ function toolInputObject(payload) {
203
+ const snake = asToolInputObject(payload.tool_input);
204
+ const camel = asToolInputObject(payload.toolInput);
205
+ if (snake && objectHasPath(snake))
206
+ return snake;
207
+ if (camel && objectHasPath(camel))
208
+ return camel;
209
+ return snake ?? camel;
210
+ }
211
+ function pathsFromToolInput(input) {
212
+ const out = [];
213
+ for (const key of PATH_KEYS) {
214
+ const filePath = pathText(input[key]);
215
+ if (!filePath || out.includes(filePath))
216
+ continue;
217
+ out.push(filePath);
218
+ }
219
+ return out;
220
+ }
221
+ function editPaths(payload) {
222
+ if (!payload || typeof payload !== "object")
223
+ return [];
224
+ if (!isDevinEditTool(toolNameOf(payload)))
225
+ return [];
226
+ const input = toolInputObject(payload);
227
+ if (!input)
228
+ return [];
229
+ return pathsFromToolInput(input);
230
+ }
231
+ /** First usable path. A bad earlier key does not hide a later one. */
232
+ export function filePathFromDevinEdit(payload) {
233
+ return editPaths(payload)[0] ?? "";
234
+ }
235
+ function allowNeedPick(userMessage, candidates) {
236
+ const fromMessage = typeof userMessage === "string" && userMessage.trim().length > 0
237
+ ? userMessage.trim()
238
+ : "";
239
+ const slugs = [
240
+ ...new Set((candidates ?? [])
241
+ .map((c) => (c && typeof c.slug === "string" ? c.slug.trim() : ""))
242
+ .filter((s) => s.length > 0 && isSafeTrackSlug(s))),
243
+ ].slice(0, MAX_NEED_PICK_SLUGS);
244
+ let ctx = fromMessage ||
245
+ (slugs.length > 0
246
+ ? `Select a plan to execute:\n\n${slugs
247
+ .map((s, i) => ` ${i + 1}. ${s}`)
248
+ .join("\n")}\n\nReply with a number or /autopilot-run <slug>.`
249
+ : "Select a plan to execute. Reply with a number or /autopilot-run <slug>.");
250
+ if (ctx.length > MAX_NEED_PICK_CONTEXT_CHARS) {
251
+ ctx = `${ctx.slice(0, MAX_NEED_PICK_CONTEXT_CHARS - 1)}…`;
252
+ }
253
+ return {
254
+ hookSpecificOutput: {
255
+ hookEventName: "UserPromptSubmit",
256
+ additionalContext: ctx,
257
+ },
258
+ };
259
+ }
260
+ function blockSubmit(message, fallback) {
261
+ return { decision: "block", reason: blockReason(message, fallback) };
262
+ }
263
+ function stampDevinPlatform(store, conversationId, projectRoot) {
264
+ const session = store.getSession(conversationId);
265
+ if (!session || session.platform === DEVIN_PLATFORM)
266
+ return;
267
+ store.upsertSession({
268
+ conversation_id: conversationId,
269
+ project_root: session.project_root || projectRoot,
270
+ code_root: session.code_root || projectRoot,
271
+ platform: DEVIN_PLATFORM,
272
+ });
273
+ }
274
+ function armCodeEdited(store, conversationId, projectRoot) {
275
+ const cfg = loadProjectReviewConfig(projectRoot);
276
+ if (cfg.reviewScope === "project") {
277
+ ensureAmbientReviewSession(store, conversationId, projectRoot, cfg.reviewScope, DEVIN_PLATFORM);
278
+ }
279
+ stampDevinPlatform(store, conversationId, projectRoot);
280
+ const session = store.getSession(conversationId);
281
+ const checklistPath = session?.checklist_path?.trim() ?? "";
282
+ let checklistSnap = null;
283
+ if (checklistPath) {
284
+ try {
285
+ checklistSnap = parseChecklist(checklistPath, { projectRoot });
286
+ }
287
+ catch {
288
+ /* still arm code_edited */
289
+ }
290
+ }
291
+ store.markCodeEdited(conversationId, (chain) => {
292
+ const fromPending = parseAdvanceNextItemId(chain.pending_followup);
293
+ if (checklistSnap) {
294
+ if (fromPending && effectiveReviewingItemId(checklistSnap, fromPending)) {
295
+ return fromPending;
296
+ }
297
+ return firstUnchecked(checklistSnap)?.id ?? null;
298
+ }
299
+ return fromPending;
300
+ });
301
+ }
302
+ /**
303
+ * UserPromptSubmit. Harness followups are not ON/RUN.
304
+ * Fail-open: throw → `{}` (exit 0), never exit 2.
305
+ */
306
+ export function handleDevinUserPromptSubmit(store, payload, projectRoot, portConfig) {
307
+ try {
308
+ return handleDevinUserPromptSubmitInner(store, payload, projectRoot, portConfig);
309
+ }
310
+ catch {
311
+ return {};
312
+ }
313
+ }
314
+ function handleDevinUserPromptSubmitInner(store, payload, projectRoot, portConfig) {
315
+ const conversationId = sessionIdOnly(payload);
316
+ if (!conversationId)
317
+ return {};
318
+ const prompt = typeof payload.prompt === "string" ? payload.prompt : "";
319
+ if (isHarnessFollowupMessage(prompt)) {
320
+ stampDevinPlatform(store, conversationId, projectRoot);
321
+ return {};
322
+ }
323
+ try {
324
+ store.clearPendingFollowupIf(conversationId, isRecoverOrStuckFollowupMessage);
325
+ }
326
+ catch {
327
+ /* best-effort */
328
+ }
329
+ const session = store.getSession(conversationId);
330
+ const hookCfg = loadProjectHookConfig(projectRoot);
331
+ const trigger = parseTrigger({
332
+ prompt,
333
+ conversationId,
334
+ projectRoot,
335
+ pendingAction: session?.pending_action,
336
+ triggers: hookCfg.triggers,
337
+ });
338
+ const actionConfig = {
339
+ ...portConfig?.phaseActions,
340
+ plansDir: portConfig?.phaseActions?.plansDir ?? hookCfg.plansDir,
341
+ };
342
+ const gateFallback = "Autopilot rejected this prompt. Check `npx autopilot-harness status`.";
343
+ if (trigger?.kind === "off") {
344
+ applyOff(store, conversationId);
345
+ stampDevinPlatform(store, conversationId, projectRoot);
346
+ return {};
347
+ }
348
+ if (trigger?.kind === "on") {
349
+ const result = applyOn(store, conversationId, projectRoot, {
350
+ initialBrief: trigger.initialBrief,
351
+ slug: trigger.slug,
352
+ platform: DEVIN_PLATFORM,
353
+ });
354
+ stampDevinPlatform(store, conversationId, projectRoot);
355
+ if (!result.ok)
356
+ return blockSubmit(result.userMessage, gateFallback);
357
+ return {};
358
+ }
359
+ if (trigger?.kind === "resume") {
360
+ const result = applyResume(store, conversationId, { slug: trigger.slug });
361
+ stampDevinPlatform(store, conversationId, projectRoot);
362
+ if (!result.ok)
363
+ return blockSubmit(result.userMessage, gateFallback);
364
+ return {};
365
+ }
366
+ if (trigger?.kind === "resume_review") {
367
+ applyResumeReview(store, conversationId);
368
+ stampDevinPlatform(store, conversationId, projectRoot);
369
+ return {};
370
+ }
371
+ if (trigger?.kind === "run") {
372
+ const result = applyRun(store, conversationId, projectRoot, {
373
+ slug: trigger.slug,
374
+ config: actionConfig,
375
+ platform: DEVIN_PLATFORM,
376
+ });
377
+ stampDevinPlatform(store, conversationId, projectRoot);
378
+ if (!result.ok) {
379
+ if (isChannelANeedPick(result)) {
380
+ return allowNeedPick(result.userMessage, result.candidates);
381
+ }
382
+ return blockSubmit(result.userMessage, gateFallback);
383
+ }
384
+ return {};
385
+ }
386
+ if (trigger?.kind === "replan") {
387
+ const result = applyReplan(store, conversationId, projectRoot, {
388
+ slug: trigger.slug,
389
+ config: actionConfig,
390
+ platform: DEVIN_PLATFORM,
391
+ });
392
+ stampDevinPlatform(store, conversationId, projectRoot);
393
+ if (!result.ok) {
394
+ if (isChannelANeedPick(result)) {
395
+ return allowNeedPick(result.userMessage, result.candidates);
396
+ }
397
+ return blockSubmit(result.userMessage, gateFallback);
398
+ }
399
+ return {};
400
+ }
401
+ if (trigger?.kind === "track_pick" && trigger.trackPick) {
402
+ const result = applyTrackPick(store, conversationId, projectRoot, trigger.trackPick, { config: actionConfig, platform: DEVIN_PLATFORM });
403
+ stampDevinPlatform(store, conversationId, projectRoot);
404
+ if (!result.ok) {
405
+ if (isChannelANeedPick(result)) {
406
+ return allowNeedPick(result.userMessage, result.candidates);
407
+ }
408
+ return blockSubmit(result.userMessage, gateFallback);
409
+ }
410
+ return {};
411
+ }
412
+ store.clearChainPending(conversationId);
413
+ stampDevinPlatform(store, conversationId, projectRoot);
414
+ return {};
415
+ }
416
+ /**
417
+ * PostToolUse. Matcher tools arm `code_edited`. `exec` does not (Stop
418
+ * dirty-arm). This function never returns a block decision.
419
+ */
420
+ export function handleDevinPostToolUse(store, payload, projectRoot) {
421
+ try {
422
+ handleDevinPostToolUseInner(store, payload, projectRoot);
423
+ }
424
+ catch {
425
+ /* fail-open exit 0 */
426
+ }
427
+ }
428
+ function handleDevinPostToolUseInner(store, payload, projectRoot) {
429
+ if (!payload || typeof payload !== "object")
430
+ return;
431
+ const conversationId = sessionIdOnly(payload);
432
+ const toolName = toolNameOf(payload);
433
+ if (!conversationId || !isDevinEditTool(toolName))
434
+ return;
435
+ const paths = editPaths(payload);
436
+ if (paths.length === 0) {
437
+ stampDevinPlatform(store, conversationId, projectRoot);
438
+ return;
439
+ }
440
+ let plansDir;
441
+ try {
442
+ plansDir = loadProjectHookConfig(projectRoot).plansDir;
443
+ }
444
+ catch {
445
+ plansDir = undefined;
446
+ }
447
+ let armed = false;
448
+ for (const filePath of paths) {
449
+ try {
450
+ notePlansDirEdit(store, conversationId, projectRoot, filePath, plansDir);
451
+ }
452
+ catch {
453
+ /* best-effort */
454
+ }
455
+ if (armed || !isProductCodeEdit(filePath, { projectRoot }))
456
+ continue;
457
+ armCodeEdited(store, conversationId, projectRoot);
458
+ armed = true;
459
+ }
460
+ if (!armed)
461
+ stampDevinPlatform(store, conversationId, projectRoot);
462
+ }
463
+ export function normalizeDevinStopStatus(payload, opts) {
464
+ const statusRaw = String(payload?.status ?? "")
465
+ .toLowerCase()
466
+ .trim();
467
+ if (statusRaw === "aborted" ||
468
+ statusRaw === "cancelled" ||
469
+ statusRaw === "canceled" ||
470
+ opts?.status === "aborted") {
471
+ return "aborted";
472
+ }
473
+ if (statusRaw === "error" ||
474
+ statusRaw === "failed" ||
475
+ opts?.status === "error") {
476
+ return "error";
477
+ }
478
+ return "completed";
479
+ }
480
+ /**
481
+ * Stop → ReviewEngine. Continue is stdout `{decision:"block", reason}`.
482
+ * `stop_hook_active: true` maps to loopCount 1. Fail-open returns `{}`.
483
+ */
484
+ export function handleDevinStop(engine, payload, opts) {
485
+ try {
486
+ return handleDevinStopInner(engine, payload, opts);
487
+ }
488
+ catch {
489
+ return {};
490
+ }
491
+ }
492
+ function handleDevinStopInner(engine, payload, opts) {
493
+ const conversationId = sessionIdOnly(payload);
494
+ if (!conversationId)
495
+ return {};
496
+ const transcriptTrimmed = firstNonBlankString(payload.transcript_path, payload.transcriptPath);
497
+ const transcriptPath = transcriptTrimmed && !/[\u0000-\u001f\u007f]/.test(transcriptTrimmed)
498
+ ? transcriptTrimmed
499
+ : undefined;
500
+ const action = engine.handleStop({
501
+ conversationId,
502
+ status: normalizeDevinStopStatus(payload, opts),
503
+ loopCount: loopCountFromDevinStopHookActive(payload),
504
+ transcriptPath,
505
+ platform: DEVIN_PLATFORM,
506
+ });
507
+ if (!action?.message)
508
+ return {};
509
+ const reason = blockReason(action.message, "Autopilot followup");
510
+ if (!action.loop) {
511
+ return { continue: false, stopReason: reason };
512
+ }
513
+ return { decision: "block", reason };
514
+ }
515
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@autopilot-harness/port-devin",
3
+ "version": "0.15.0",
4
+ "description": "Autopilot harness host port for Devin CLI hooks (subprocess; Stop decision:block+reason; anchored PostToolUse matcher; independent --platform devin fingerprint). CLI only — not Desktop, cloud, or Cascade.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/mt2007/autopilot-harness.git",
9
+ "directory": "packages/ports/devin"
10
+ },
11
+ "homepage": "https://github.com/mt2007/autopilot-harness#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/mt2007/autopilot-harness/issues"
14
+ },
15
+ "type": "module",
16
+ "main": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "dependencies": {
28
+ "@autopilot-harness/core": "0.15.0"
29
+ },
30
+ "devDependencies": {
31
+ "typescript": "^5.8.2"
32
+ },
33
+ "engines": {
34
+ "node": ">=22"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "author": "mt2007 (https://github.com/mt2007)",
40
+ "keywords": [
41
+ "autopilot",
42
+ "harness",
43
+ "agent",
44
+ "ai",
45
+ "devin",
46
+ "devin-cli",
47
+ "checklist",
48
+ "code-review"
49
+ ],
50
+ "scripts": {
51
+ "build": "tsc -p tsconfig.json",
52
+ "typecheck": "tsc -p tsconfig.json --noEmit"
53
+ }
54
+ }