@autopilot-harness/port-pi 0.14.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,121 @@
1
+ /**
2
+ * @autopilot-harness/port-pi — in-process Pi extension adapters (no shell stdin stamp).
3
+ * Research: plans/v0.14-pi/research-pi-hooks.md (Pi 0.85.1).
4
+ */
5
+ import { type PhaseActionConfig, type ReviewEngine, type StateStore } from "@autopilot-harness/core";
6
+ export declare const PI_PLATFORM = "pi";
7
+ /** Soft doctor tip — probed API surface. */
8
+ export declare const PI_SOFT_MIN_VERSION = "0.85.1";
9
+ /** Pi package.json engines.node. */
10
+ export declare const PI_SOFT_MIN_NODE = "22.19.0";
11
+ /** sendMessage customType for Autopilot continue. */
12
+ export declare const PI_CONTINUE_CUSTOM_TYPE = "autopilot-harness";
13
+ /** Locked continue delivery (research). */
14
+ export declare const PI_CONTINUE_DELIVER: {
15
+ deliverAs: "followUp";
16
+ triggerTurn: true;
17
+ };
18
+ /** Built-in edit tools that arm review (research). */
19
+ export declare const PI_EDIT_TOOLS: readonly ["write", "edit"];
20
+ export declare const MAX_NEED_PICK_SLUGS = 40;
21
+ export declare const MAX_NEED_PICK_CONTEXT_CHARS = 2000;
22
+ export declare const MAX_HOOK_TEXT_CHARS = 8192;
23
+ export declare const MAX_PI_PATH_CHARS = 4096;
24
+ export declare const MAX_PI_PATHS = 256;
25
+ export interface PiPortConfig {
26
+ phaseActions?: PhaseActionConfig;
27
+ }
28
+ /** Thin payload from Pi extension handlers (not shell stdin). */
29
+ export interface PiInputPayload {
30
+ text?: string;
31
+ /** Pi `input` event.source */
32
+ source?: "interactive" | "rpc" | "extension" | string;
33
+ sessionFile?: string | null;
34
+ sessionId?: string | null;
35
+ cwd?: string;
36
+ mode?: "tui" | "rpc" | "json" | "print" | string;
37
+ }
38
+ export interface PiBeforeAgentStartPayload {
39
+ prompt?: string;
40
+ sessionFile?: string | null;
41
+ sessionId?: string | null;
42
+ cwd?: string;
43
+ mode?: string;
44
+ }
45
+ export interface PiToolResultPayload {
46
+ toolName?: string;
47
+ tool_name?: string;
48
+ input?: Record<string, unknown> | null;
49
+ sessionFile?: string | null;
50
+ sessionId?: string | null;
51
+ cwd?: string;
52
+ }
53
+ export interface PiAgentSettledPayload {
54
+ sessionFile?: string | null;
55
+ sessionId?: string | null;
56
+ cwd?: string;
57
+ mode?: string;
58
+ }
59
+ export interface PiInputResult {
60
+ /** Extension source / harness followup — skip ON/RUN / clear-pending. */
61
+ harnessOwned?: boolean;
62
+ /** Unsupported mode (print/json) — fail-open no-op tip for extension. */
63
+ unsupportedMode?: boolean;
64
+ }
65
+ export interface PiSubmitResult {
66
+ /** Inject via before_agent_start `message.content` (needPick / gate). */
67
+ message?: string;
68
+ }
69
+ export interface PiSettledResult {
70
+ /**
71
+ * If set, extension MUST `pi.sendMessage` with PI_CONTINUE_DELIVER.
72
+ * R1: only when Autopilot has a looping pending followup.
73
+ * R9: extension must not call blocking ctx.ui on this path.
74
+ */
75
+ continueMessage?: string;
76
+ }
77
+ /**
78
+ * R2 — Autopilot conversation_id.
79
+ * `pi:<sessionFile ?? sessionId>`; empty if neither usable.
80
+ */
81
+ export declare function buildPiConversationId(sessionFile?: string | null, sessionId?: string | null): string;
82
+ export declare function conversationIdFromPiPayload(p: {
83
+ sessionFile?: string | null;
84
+ sessionId?: string | null;
85
+ }): string;
86
+ export declare function isPiEditTool(toolName: string): boolean;
87
+ export declare function isPiUnsupportedAutopilotMode(mode: unknown): boolean;
88
+ export declare function resolvePiWorkspaceRoot(opts: {
89
+ installRoot?: string | null;
90
+ cwd?: string | null;
91
+ }): string | null;
92
+ export declare function buildNeedPickMessage(userMessage: unknown, candidates?: ReadonlyArray<{
93
+ slug?: string;
94
+ }>): string;
95
+ /**
96
+ * `input` event — R10 mode tip; harness-owned when source=extension or followup text.
97
+ */
98
+ export declare function handlePiInput(store: StateStore, payload: PiInputPayload, projectRoot: string): PiInputResult;
99
+ export declare const handlePiUserInput: typeof handlePiInput;
100
+ /**
101
+ * `before_agent_start` — ON/RUN triggers + inject guidance (cannot discard prompt).
102
+ */
103
+ export declare function handlePiBeforeAgentStart(store: StateStore, payload: PiBeforeAgentStartPayload, projectRoot: string, portConfig?: PiPortConfig): PiSubmitResult;
104
+ export declare const handlePiSubmit: typeof handlePiBeforeAgentStart;
105
+ export declare function filePathsFromPiToolInput(input: Record<string, unknown> | null | undefined, cwd?: string | null): string[];
106
+ /**
107
+ * `tool_result` — arm write/edit; never blocks.
108
+ */
109
+ export declare function handlePiToolResult(store: StateStore, payload: PiToolResultPayload, projectRoot: string): void;
110
+ export declare const handlePiPostTool: typeof handlePiToolResult;
111
+ /**
112
+ * `agent_settled` — ReviewEngine.handleStop (includes dirty-tree arm / R8).
113
+ * R1: only return continueMessage when action.loop + message (pending followup).
114
+ * R9: callers must not use blocking UI when delivering continueMessage.
115
+ */
116
+ export declare function handlePiAgentSettled(engine: ReviewEngine, store: StateStore, payload: PiAgentSettledPayload, projectRoot: string, opts?: {
117
+ loopCount?: number;
118
+ status?: "completed" | "error" | "aborted";
119
+ }): PiSettledResult;
120
+ export declare const handlePiStop: typeof handlePiAgentSettled;
121
+ //# 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,404 @@
1
+ /**
2
+ * @autopilot-harness/port-pi — in-process Pi extension adapters (no shell stdin stamp).
3
+ * Research: plans/v0.14-pi/research-pi-hooks.md (Pi 0.85.1).
4
+ */
5
+ import path from "node:path";
6
+ 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";
7
+ export const PI_PLATFORM = "pi";
8
+ /** Soft doctor tip — probed API surface. */
9
+ export const PI_SOFT_MIN_VERSION = "0.85.1";
10
+ /** Pi package.json engines.node. */
11
+ export const PI_SOFT_MIN_NODE = "22.19.0";
12
+ /** sendMessage customType for Autopilot continue. */
13
+ export const PI_CONTINUE_CUSTOM_TYPE = "autopilot-harness";
14
+ /** Locked continue delivery (research). */
15
+ export const PI_CONTINUE_DELIVER = {
16
+ deliverAs: "followUp",
17
+ triggerTurn: true,
18
+ };
19
+ /** Built-in edit tools that arm review (research). */
20
+ export const PI_EDIT_TOOLS = Object.freeze(["write", "edit"]);
21
+ export const MAX_NEED_PICK_SLUGS = 40;
22
+ export const MAX_NEED_PICK_CONTEXT_CHARS = 2_000;
23
+ export const MAX_HOOK_TEXT_CHARS = 8_192;
24
+ export const MAX_PI_PATH_CHARS = 4_096;
25
+ export const MAX_PI_PATHS = 256;
26
+ function clipText(text, max = MAX_HOOK_TEXT_CHARS) {
27
+ if (text.length <= max)
28
+ return text;
29
+ return `${text.slice(0, max - 1)}…`;
30
+ }
31
+ function isSafePath(p) {
32
+ if (!p || p.length > MAX_PI_PATH_CHARS)
33
+ return false;
34
+ if (/[\u0000-\u001f\u007f]/.test(p))
35
+ return false;
36
+ return true;
37
+ }
38
+ /**
39
+ * R2 — Autopilot conversation_id.
40
+ * `pi:<sessionFile ?? sessionId>`; empty if neither usable.
41
+ */
42
+ export function buildPiConversationId(sessionFile, sessionId) {
43
+ const file = typeof sessionFile === "string" && sessionFile.trim()
44
+ ? sessionFile.trim()
45
+ : "";
46
+ const id = typeof sessionId === "string" && sessionId.trim() ? sessionId.trim() : "";
47
+ const raw = file || id;
48
+ if (!raw || /[\u0000-\u001f\u007f]/.test(raw))
49
+ return "";
50
+ return `pi:${raw}`;
51
+ }
52
+ export function conversationIdFromPiPayload(p) {
53
+ return buildPiConversationId(p.sessionFile, p.sessionId);
54
+ }
55
+ export function isPiEditTool(toolName) {
56
+ const n = toolName.trim();
57
+ return n === "write" || n === "edit";
58
+ }
59
+ export function isPiUnsupportedAutopilotMode(mode) {
60
+ return mode === "print" || mode === "json";
61
+ }
62
+ export function resolvePiWorkspaceRoot(opts) {
63
+ for (const v of [opts.installRoot, opts.cwd]) {
64
+ if (typeof v === "string" && v.trim())
65
+ return v.trim();
66
+ }
67
+ return null;
68
+ }
69
+ function stampPiPlatform(store, conversationId, projectRoot) {
70
+ const session = store.getSession(conversationId);
71
+ if (!session || session.platform === PI_PLATFORM)
72
+ return;
73
+ store.upsertSession({
74
+ conversation_id: conversationId,
75
+ project_root: session.project_root || projectRoot,
76
+ code_root: session.code_root || projectRoot,
77
+ platform: PI_PLATFORM,
78
+ });
79
+ }
80
+ function blockReason(userMessage, fallback) {
81
+ if (typeof userMessage === "string" && userMessage.trim()) {
82
+ return clipText(userMessage.trim());
83
+ }
84
+ return fallback;
85
+ }
86
+ export function buildNeedPickMessage(userMessage, candidates) {
87
+ const fromMessage = typeof userMessage === "string" && userMessage.trim()
88
+ ? userMessage.trim()
89
+ : "";
90
+ const slugs = [
91
+ ...new Set((candidates ?? [])
92
+ .map((c) => (c && typeof c.slug === "string" ? c.slug.trim() : ""))
93
+ .filter((s) => s.length > 0 && isSafeTrackSlug(s))),
94
+ ].slice(0, MAX_NEED_PICK_SLUGS);
95
+ let ctx = fromMessage ||
96
+ (slugs.length > 0
97
+ ? `[Autopilot] Select a plan to execute:\n\n${slugs
98
+ .map((s, i) => ` ${i + 1}. ${s}`)
99
+ .join("\n")}\n\nReply with a number or /autopilot-run <slug>.`
100
+ : "[Autopilot] Select a plan to execute. Reply with a number or /autopilot-run <slug>.");
101
+ if (ctx.length > MAX_NEED_PICK_CONTEXT_CHARS) {
102
+ ctx = `${ctx.slice(0, MAX_NEED_PICK_CONTEXT_CHARS - 1)}…`;
103
+ }
104
+ return ctx;
105
+ }
106
+ function injectMessage(text) {
107
+ const t = text.trim();
108
+ if (!t)
109
+ return {};
110
+ return { message: clipText(t, MAX_NEED_PICK_CONTEXT_CHARS + 256) };
111
+ }
112
+ function gateMessage(userMessage, fallback) {
113
+ return injectMessage(blockReason(userMessage, fallback));
114
+ }
115
+ /**
116
+ * `input` event — R10 mode tip; harness-owned when source=extension or followup text.
117
+ */
118
+ export function handlePiInput(store, payload, projectRoot) {
119
+ try {
120
+ return handlePiInputInner(store, payload, projectRoot);
121
+ }
122
+ catch {
123
+ return {};
124
+ }
125
+ }
126
+ export const handlePiUserInput = handlePiInput;
127
+ function handlePiInputInner(store, payload, projectRoot) {
128
+ if (isPiUnsupportedAutopilotMode(payload.mode)) {
129
+ return { unsupportedMode: true };
130
+ }
131
+ const conversationId = conversationIdFromPiPayload(payload);
132
+ const text = typeof payload.text === "string" ? payload.text : "";
133
+ if (payload.source === "extension" || isHarnessFollowupMessage(text)) {
134
+ return { harnessOwned: true };
135
+ }
136
+ if (!conversationId)
137
+ return {};
138
+ try {
139
+ store.clearPendingFollowupIf(conversationId, isRecoverOrStuckFollowupMessage);
140
+ }
141
+ catch {
142
+ /* best-effort */
143
+ }
144
+ stampPiPlatform(store, conversationId, projectRoot);
145
+ return {};
146
+ }
147
+ /**
148
+ * `before_agent_start` — ON/RUN triggers + inject guidance (cannot discard prompt).
149
+ */
150
+ export function handlePiBeforeAgentStart(store, payload, projectRoot, portConfig) {
151
+ try {
152
+ return handlePiBeforeAgentStartInner(store, payload, projectRoot, portConfig);
153
+ }
154
+ catch {
155
+ return {};
156
+ }
157
+ }
158
+ export const handlePiSubmit = handlePiBeforeAgentStart;
159
+ function handlePiBeforeAgentStartInner(store, payload, projectRoot, portConfig) {
160
+ if (isPiUnsupportedAutopilotMode(payload.mode))
161
+ return {};
162
+ const conversationId = conversationIdFromPiPayload(payload);
163
+ if (!conversationId)
164
+ return {};
165
+ const prompt = typeof payload.prompt === "string" ? payload.prompt : "";
166
+ // Continuations injected via sendMessage / sendUserMessage — harness-owned.
167
+ if (isHarnessFollowupMessage(prompt)) {
168
+ stampPiPlatform(store, conversationId, projectRoot);
169
+ return {};
170
+ }
171
+ try {
172
+ store.clearPendingFollowupIf(conversationId, isRecoverOrStuckFollowupMessage);
173
+ }
174
+ catch {
175
+ /* best-effort */
176
+ }
177
+ const session = store.getSession(conversationId);
178
+ const hookCfg = loadProjectHookConfig(projectRoot);
179
+ const trigger = parseTrigger({
180
+ prompt,
181
+ conversationId,
182
+ projectRoot,
183
+ pendingAction: session?.pending_action,
184
+ triggers: hookCfg.triggers,
185
+ });
186
+ const actionConfig = {
187
+ ...portConfig?.phaseActions,
188
+ plansDir: portConfig?.phaseActions?.plansDir ?? hookCfg.plansDir,
189
+ };
190
+ const gateFallback = "[Autopilot] Rejected this prompt. Check `npx autopilot-harness status`.";
191
+ if (trigger) {
192
+ if (trigger.kind === "off") {
193
+ applyOff(store, conversationId);
194
+ stampPiPlatform(store, conversationId, projectRoot);
195
+ return {};
196
+ }
197
+ if (trigger.kind === "on") {
198
+ const result = applyOn(store, conversationId, projectRoot, {
199
+ initialBrief: trigger.initialBrief,
200
+ slug: trigger.slug,
201
+ platform: PI_PLATFORM,
202
+ });
203
+ stampPiPlatform(store, conversationId, projectRoot);
204
+ if (!result.ok)
205
+ return gateMessage(result.userMessage, gateFallback);
206
+ return {};
207
+ }
208
+ if (trigger.kind === "resume") {
209
+ const result = applyResume(store, conversationId, {
210
+ slug: trigger.slug,
211
+ });
212
+ stampPiPlatform(store, conversationId, projectRoot);
213
+ if (!result.ok)
214
+ return gateMessage(result.userMessage, gateFallback);
215
+ return {};
216
+ }
217
+ if (trigger.kind === "resume_review") {
218
+ applyResumeReview(store, conversationId);
219
+ stampPiPlatform(store, conversationId, projectRoot);
220
+ return {};
221
+ }
222
+ if (trigger.kind === "run") {
223
+ const result = applyRun(store, conversationId, projectRoot, {
224
+ slug: trigger.slug,
225
+ config: actionConfig,
226
+ platform: PI_PLATFORM,
227
+ });
228
+ stampPiPlatform(store, conversationId, projectRoot);
229
+ if (!result.ok) {
230
+ if (isChannelANeedPick(result)) {
231
+ return injectMessage(buildNeedPickMessage(result.userMessage, result.candidates));
232
+ }
233
+ return gateMessage(result.userMessage, gateFallback);
234
+ }
235
+ return {};
236
+ }
237
+ if (trigger.kind === "replan") {
238
+ const result = applyReplan(store, conversationId, projectRoot, {
239
+ slug: trigger.slug,
240
+ config: actionConfig,
241
+ platform: PI_PLATFORM,
242
+ });
243
+ stampPiPlatform(store, conversationId, projectRoot);
244
+ if (!result.ok) {
245
+ if (isChannelANeedPick(result)) {
246
+ return injectMessage(buildNeedPickMessage(result.userMessage, result.candidates));
247
+ }
248
+ return gateMessage(result.userMessage, gateFallback);
249
+ }
250
+ return {};
251
+ }
252
+ if (trigger.kind === "track_pick" && trigger.trackPick) {
253
+ const result = applyTrackPick(store, conversationId, projectRoot, trigger.trackPick, { config: actionConfig, platform: PI_PLATFORM });
254
+ stampPiPlatform(store, conversationId, projectRoot);
255
+ if (!result.ok) {
256
+ if (isChannelANeedPick(result)) {
257
+ return injectMessage(buildNeedPickMessage(result.userMessage, result.candidates));
258
+ }
259
+ return gateMessage(result.userMessage, gateFallback);
260
+ }
261
+ return {};
262
+ }
263
+ return {};
264
+ }
265
+ if (!isHarnessFollowupMessage(prompt)) {
266
+ store.clearChainPending(conversationId);
267
+ }
268
+ stampPiPlatform(store, conversationId, projectRoot);
269
+ return {};
270
+ }
271
+ function armCodeEdited(store, conversationId, projectRoot) {
272
+ const cfg = loadProjectReviewConfig(projectRoot);
273
+ if (cfg.reviewScope === "project") {
274
+ ensureAmbientReviewSession(store, conversationId, projectRoot, cfg.reviewScope, PI_PLATFORM);
275
+ }
276
+ stampPiPlatform(store, conversationId, projectRoot);
277
+ const session = store.getSession(conversationId);
278
+ const checklistPath = session?.checklist_path?.trim() ?? "";
279
+ let checklistSnap = null;
280
+ if (checklistPath) {
281
+ try {
282
+ checklistSnap = parseChecklist(checklistPath, { projectRoot });
283
+ }
284
+ catch {
285
+ /* still arm */
286
+ }
287
+ }
288
+ store.markCodeEdited(conversationId, (chain) => {
289
+ const fromPending = parseAdvanceNextItemId(chain.pending_followup);
290
+ if (checklistSnap) {
291
+ if (fromPending && effectiveReviewingItemId(checklistSnap, fromPending)) {
292
+ return fromPending;
293
+ }
294
+ return firstUnchecked(checklistSnap)?.id ?? null;
295
+ }
296
+ return fromPending;
297
+ });
298
+ }
299
+ export function filePathsFromPiToolInput(input, cwd) {
300
+ if (!input || typeof input !== "object")
301
+ return [];
302
+ const raw = input.path;
303
+ if (typeof raw !== "string")
304
+ return [];
305
+ let p = raw.trim();
306
+ if (!isSafePath(p))
307
+ return [];
308
+ // Pi may pass cwd-relative paths; resolve before product-code checks.
309
+ if (!path.isAbsolute(p)) {
310
+ const base = typeof cwd === "string" && cwd.trim() ? cwd.trim() : undefined;
311
+ if (base && isSafePath(base)) {
312
+ p = path.resolve(base, p);
313
+ }
314
+ }
315
+ if (!isSafePath(p))
316
+ return [];
317
+ return [p].slice(0, MAX_PI_PATHS);
318
+ }
319
+ function armPaths(store, conversationId, projectRoot, filePaths) {
320
+ if (filePaths.length === 0) {
321
+ stampPiPlatform(store, conversationId, projectRoot);
322
+ return;
323
+ }
324
+ let plansDir;
325
+ try {
326
+ plansDir = loadProjectHookConfig(projectRoot).plansDir;
327
+ }
328
+ catch {
329
+ plansDir = undefined;
330
+ }
331
+ let armed = false;
332
+ for (const filePath of filePaths) {
333
+ try {
334
+ notePlansDirEdit(store, conversationId, projectRoot, filePath, plansDir);
335
+ }
336
+ catch {
337
+ /* best-effort */
338
+ }
339
+ if (!isProductCodeEdit(filePath, { projectRoot }))
340
+ continue;
341
+ if (!armed) {
342
+ armCodeEdited(store, conversationId, projectRoot);
343
+ armed = true;
344
+ }
345
+ }
346
+ if (!armed) {
347
+ stampPiPlatform(store, conversationId, projectRoot);
348
+ }
349
+ }
350
+ /**
351
+ * `tool_result` — arm write/edit; never blocks.
352
+ */
353
+ export function handlePiToolResult(store, payload, projectRoot) {
354
+ try {
355
+ handlePiToolResultInner(store, payload, projectRoot);
356
+ }
357
+ catch {
358
+ /* fail-open */
359
+ }
360
+ }
361
+ export const handlePiPostTool = handlePiToolResult;
362
+ function handlePiToolResultInner(store, payload, projectRoot) {
363
+ const conversationId = conversationIdFromPiPayload(payload);
364
+ const toolName = String(payload.toolName ?? payload.tool_name ?? "").trim();
365
+ if (!conversationId || !isPiEditTool(toolName))
366
+ return;
367
+ armPaths(store, conversationId, projectRoot, filePathsFromPiToolInput(payload.input, payload.cwd ?? projectRoot));
368
+ }
369
+ /**
370
+ * `agent_settled` — ReviewEngine.handleStop (includes dirty-tree arm / R8).
371
+ * R1: only return continueMessage when action.loop + message (pending followup).
372
+ * R9: callers must not use blocking UI when delivering continueMessage.
373
+ */
374
+ export function handlePiAgentSettled(engine, store, payload, projectRoot, opts) {
375
+ try {
376
+ return handlePiAgentSettledInner(engine, store, payload, projectRoot, opts);
377
+ }
378
+ catch {
379
+ return {};
380
+ }
381
+ }
382
+ export const handlePiStop = handlePiAgentSettled;
383
+ function handlePiAgentSettledInner(engine, store, payload, projectRoot, opts) {
384
+ if (isPiUnsupportedAutopilotMode(payload.mode))
385
+ return {};
386
+ const conversationId = conversationIdFromPiPayload(payload);
387
+ if (!conversationId)
388
+ return {};
389
+ stampPiPlatform(store, conversationId, projectRoot);
390
+ const action = engine.handleStop({
391
+ conversationId,
392
+ status: opts?.status ?? "completed",
393
+ loopCount: opts?.loopCount ?? 0,
394
+ platform: PI_PLATFORM,
395
+ });
396
+ // R1: no pending / non-looping / blank message → empty (extension must not inject).
397
+ const msg = typeof action?.message === "string" ? action.message.trim() : "";
398
+ if (!msg || !action?.loop)
399
+ return {};
400
+ return {
401
+ continueMessage: clipText(msg, MAX_HOOK_TEXT_CHARS),
402
+ };
403
+ }
404
+ //# 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,55 @@
1
+ {
2
+ "name": "@autopilot-harness/port-pi",
3
+ "version": "0.14.0",
4
+ "description": "Autopilot harness host port for Pi coding agent extensions (input/before_agent_start; tool_result arm; agent_settled sendMessage followUp+triggerTurn; soft min Pi ≥0.85.1)",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/mt2007/autopilot-harness.git",
9
+ "directory": "packages/ports/pi"
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.14.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
+ "vibecoding",
46
+ "pi",
47
+ "pi-coding-agent",
48
+ "checklist",
49
+ "code-review"
50
+ ],
51
+ "scripts": {
52
+ "build": "tsc -p tsconfig.json",
53
+ "typecheck": "tsc -p tsconfig.json --noEmit"
54
+ }
55
+ }