@usepipr/runtime 0.3.3 → 0.3.6

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.
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
- import { CommentableRange, DiffManifest, ReviewFinding, ReviewResult } from "@usepipr/sdk";
2
+ import { CommentableRange, DiffManifest, ReviewFinding, ReviewResult, ReviewSide } from "@usepipr/sdk";
3
+ import "@usepipr/sdk/internal";
3
4
  //#region src/config/init.d.ts
4
5
  type InitOfficialMinimalProjectResult = {
5
6
  configDir: string;
@@ -240,10 +241,6 @@ type InspectRuntimePlan = {
240
241
  schemas: string[];
241
242
  };
242
243
  //#endregion
243
- //#region ../sdk/src/types/manifest.d.ts
244
- /** Side of a pull request diff that a commentable range belongs to. */
245
- type ReviewSide = "RIGHT" | "LEFT";
246
- //#endregion
247
244
  //#region src/review/prior-state.d.ts
248
245
  declare const priorReviewStateSchema: z.ZodObject<{
249
246
  version: z.ZodLiteral<1>;
@@ -297,6 +294,7 @@ declare const threadActionSchema: z.ZodObject<{
297
294
  type ThreadAction = z.infer<typeof threadActionSchema>;
298
295
  declare const publicationMetadataSchema: z.ZodObject<{
299
296
  runtimeVersion: z.ZodString;
297
+ configVersion: z.ZodOptional<z.ZodString>;
300
298
  trustedConfigSha: z.ZodOptional<z.ZodString>;
301
299
  trustedConfigHash: z.ZodOptional<z.ZodString>;
302
300
  reviewedHeadSha: z.ZodString;
@@ -326,6 +324,7 @@ declare const publicationPlanSchema: z.ZodObject<{
326
324
  }, z.core.$strict>>;
327
325
  metadata: z.ZodObject<{
328
326
  runtimeVersion: z.ZodString;
327
+ configVersion: z.ZodOptional<z.ZodString>;
329
328
  trustedConfigSha: z.ZodOptional<z.ZodString>;
330
329
  trustedConfigHash: z.ZodOptional<z.ZodString>;
331
330
  reviewedHeadSha: z.ZodString;
@@ -808,8 +807,11 @@ type LocalReviewCommandOptions = RuntimeCommandOptions & {
808
807
  type DryRunCommandResult = {
809
808
  configSource: string;
810
809
  event: ChangeRequestEventContext;
810
+ warnings: string[];
811
+ };
812
+ type InspectCommandResult = InspectRuntimePlan & {
813
+ warnings: string[];
811
814
  };
812
- type InspectCommandResult = InspectRuntimePlan;
813
815
  type LocalReviewCommandResult = ReviewRuntimeResult & {
814
816
  kind: "review" | "skipped";
815
817
  commandResponse?: never;
@@ -870,4 +872,4 @@ declare function runActionCommand(options: ActionCommandOptions): Promise<Action
870
872
  declare function runActionCommandWithDependencies(options: ActionCommandDependencyOptions): Promise<ActionCommandResult>;
871
873
  //#endregion
872
874
  export { PlatformInfo as A, GitHubPublicationClient as C, ChangeRequestRef as D, ChangeRequestEventContext as E, supportedOfficialInitAdapters as F, RepositoryRef as M, RuntimeSettings as N, DiffManifest as O, OfficialInitAdapter as P, ActionLogSink as S, PublicationResult as T, piBuiltinToolNames as _, runInspectCommand as a, piThinkingLevels as b, ActionCommandOptions as c, DryRunCommandResult as d, InitCommandOptions as f, RuntimeCommandOptions as g, LocalReviewCommandResult as h, runInitCommand as i, ProviderConfig as j, PiprConfig as k, ActionCommandResult as l, LocalReviewCommandOptions as m, runActionCommandWithDependencies as n, runLocalReviewCommand as o, InspectCommandResult as p, runDryRunCommand as r, runValidateCommand as s, runActionCommand as t, DryRunCommandOptions as u, piReadOnlyToolNames as v, PublicationError as w, ActionLogRecord as x, piRequiredCliFlags as y };
873
- //# sourceMappingURL=commands-4n3t4t5P.d.mts.map
875
+ //# sourceMappingURL=commands-C6wfO-y7.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands-C6wfO-y7.d.mts","names":[],"sources":["../src/config/init.ts","../src/types.ts","../src/config/project.ts","../src/review/prior-state.ts","../src/review/comment.ts","../src/review/publication-result.ts","../src/hosts/types.ts","../src/hosts/github/command.ts","../src/hosts/github/publication-client.ts","../src/shared/logging.ts","../src/pi/contract.ts","../src/review/task/task-output.ts","../src/review/task/task-runtime.ts","../src/action/types.ts","../src/action/commands.ts"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,5 +1,4 @@
1
- import { A as PlatformInfo, D as ChangeRequestRef, E as ChangeRequestEventContext, F as supportedOfficialInitAdapters, M as RepositoryRef, N as RuntimeSettings, O as DiffManifest, P as OfficialInitAdapter, S as ActionLogSink, T as PublicationResult, a as runInspectCommand, c as ActionCommandOptions, d as DryRunCommandResult, f as InitCommandOptions, g as RuntimeCommandOptions, h as LocalReviewCommandResult, i as runInitCommand, j as ProviderConfig, k as PiprConfig, l as ActionCommandResult, m as LocalReviewCommandOptions, o as runLocalReviewCommand, p as InspectCommandResult, r as runDryRunCommand, s as runValidateCommand, t as runActionCommand, u as DryRunCommandOptions, w as PublicationError, x as ActionLogRecord } from "./commands-4n3t4t5P.mjs";
2
-
1
+ import { A as PlatformInfo, D as ChangeRequestRef, E as ChangeRequestEventContext, F as supportedOfficialInitAdapters, M as RepositoryRef, N as RuntimeSettings, O as DiffManifest, P as OfficialInitAdapter, S as ActionLogSink, T as PublicationResult, a as runInspectCommand, c as ActionCommandOptions, d as DryRunCommandResult, f as InitCommandOptions, g as RuntimeCommandOptions, h as LocalReviewCommandResult, i as runInitCommand, j as ProviderConfig, k as PiprConfig, l as ActionCommandResult, m as LocalReviewCommandOptions, o as runLocalReviewCommand, p as InspectCommandResult, r as runDryRunCommand, s as runValidateCommand, t as runActionCommand, u as DryRunCommandOptions, w as PublicationError, x as ActionLogRecord } from "./commands-C6wfO-y7.mjs";
3
2
  //#region src/config/recipes/types.d.ts
4
3
  type OfficialInitRecipeFile = {
5
4
  relativePath: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/config/recipes/types.ts","../src/config/recipes.ts"],"mappings":";;;KAAY,sBAAA;EACV,YAAA;EACA,QAAQ;AAAA;AAAA,KAGE,mCAAA;EACV,GAAA;EACA,MAAM;AAAA;AAAA,KAGI,kBAAA;EACV,EAAA;EACA,KAAA;EACA,WAAA;EACA,WAAA;EACA,QAAA;EACA,KAAA,YAAiB,sBAAA;EACjB,kBAAA,YAA8B,mCAAmC;EACjE,cAAA;AAAA;;;cCGW,4BAAA;AAAA,KAkBD,oBAAA,WAA+B,4BAA4B;AAAA,iBAqBvD,uBAAA,IAA2B,kBAAkB"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/config/recipes/types.ts","../src/config/recipes.ts"],"mappings":";;KAAY;EACV;EACA;;KAGU;EACV;EACA;;KAGU;EACV;EACA;EACA;EACA;EACA;EACA,iBAAiB;EACjB,8BAA8B;EAC9B;;;;cCGW;KAkBD,+BAA+B;iBAqB3B,2BAA2B"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { a as runInspectCommand, c as PublicationError, d as listOfficialInitRecipes, f as supportedOfficialInitRecipes, i as runInitCommand, o as runLocalReviewCommand, r as runDryRunCommand, s as runValidateCommand, t as runActionCommand, u as supportedOfficialInitAdapters } from "./commands-C1sVsbEj.mjs";
1
+ import { a as runInspectCommand, c as PublicationError, d as supportedOfficialInitRecipes, i as runInitCommand, l as supportedOfficialInitAdapters, o as runLocalReviewCommand, r as runDryRunCommand, s as runValidateCommand, t as runActionCommand, u as listOfficialInitRecipes } from "./commands-Btw_Ummi.mjs";
2
2
  export { PublicationError, listOfficialInitRecipes, runActionCommand, runDryRunCommand, runInitCommand, runInspectCommand, runLocalReviewCommand, runValidateCommand, supportedOfficialInitAdapters, supportedOfficialInitRecipes };
@@ -0,0 +1,18 @@
1
+ //#region src/review/inline-finding-limits.d.ts
2
+ declare const maxInlineFindingBodyCharacters = 700;
3
+ declare const maxInlineFindingBodyLines = 4;
4
+ //#endregion
5
+ //#region src/review/suggested-fix-publication-policy.d.ts
6
+ type SuggestedFixPublicationSelection = {
7
+ side: "RIGHT" | "LEFT";
8
+ kind: "added" | "deleted" | "context" | "mixed";
9
+ rangeStartLine: number;
10
+ startLine: number;
11
+ endLine: number;
12
+ preview?: string;
13
+ suggestedFix: string;
14
+ };
15
+ declare function isPublishableSuggestedFixSelection(selection: SuggestedFixPublicationSelection): boolean;
16
+ //#endregion
17
+ export { isPublishableSuggestedFixSelection, maxInlineFindingBodyCharacters, maxInlineFindingBodyLines };
18
+ //# sourceMappingURL=review-testing.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-testing.d.mts","names":[],"sources":["../../src/review/inline-finding-limits.ts","../../src/review/suggested-fix-publication-policy.ts"],"mappings":";cAAa;cACA;;;KCDR;EACH;EACA;EACA;EACA;EACA;EACA;EACA;;iBAWc,mCACd,WAAW"}
@@ -0,0 +1,2 @@
1
+ import { n as maxInlineFindingBodyCharacters, r as maxInlineFindingBodyLines, t as isPublishableSuggestedFixSelection } from "../suggested-fix-publication-policy-B5Wwuudp.mjs";
2
+ export { isPublishableSuggestedFixSelection, maxInlineFindingBodyCharacters, maxInlineFindingBodyLines };
@@ -1,16 +1,2 @@
1
- import { C as GitHubPublicationClient, _ as piBuiltinToolNames, b as piThinkingLevels, l as ActionCommandResult, n as runActionCommandWithDependencies, v as piReadOnlyToolNames, y as piRequiredCliFlags } from "../commands-4n3t4t5P.mjs";
2
-
3
- //#region src/review/inline-publication-policy.d.ts
4
- type SuggestedFixPublicationSelection = {
5
- side: "RIGHT" | "LEFT";
6
- kind: "added" | "deleted" | "context" | "mixed";
7
- rangeStartLine: number;
8
- startLine: number;
9
- endLine: number;
10
- preview?: string;
11
- suggestedFix: string;
12
- };
13
- declare function isPublishableSuggestedFixSelection(selection: SuggestedFixPublicationSelection): boolean;
14
- //#endregion
15
- export { type ActionCommandResult, type GitHubPublicationClient, type SuggestedFixPublicationSelection, isPublishableSuggestedFixSelection, piBuiltinToolNames, piReadOnlyToolNames, piRequiredCliFlags, piThinkingLevels, runActionCommandWithDependencies };
16
- //# sourceMappingURL=testing.d.mts.map
1
+ import { C as GitHubPublicationClient, _ as piBuiltinToolNames, b as piThinkingLevels, l as ActionCommandResult, n as runActionCommandWithDependencies, v as piReadOnlyToolNames, y as piRequiredCliFlags } from "../commands-C6wfO-y7.mjs";
2
+ export { type ActionCommandResult, type GitHubPublicationClient, piBuiltinToolNames, piReadOnlyToolNames, piRequiredCliFlags, piThinkingLevels, runActionCommandWithDependencies };
@@ -1,2 +1,2 @@
1
- import { g as piThinkingLevels, h as piRequiredCliFlags, l as isPublishableSuggestedFixSelection, m as piReadOnlyToolNames, n as runActionCommandWithDependencies, p as piBuiltinToolNames } from "../commands-C1sVsbEj.mjs";
2
- export { isPublishableSuggestedFixSelection, piBuiltinToolNames, piReadOnlyToolNames, piRequiredCliFlags, piThinkingLevels, runActionCommandWithDependencies };
1
+ import { f as piBuiltinToolNames, h as piThinkingLevels, m as piRequiredCliFlags, n as runActionCommandWithDependencies, p as piReadOnlyToolNames } from "../commands-Btw_Ummi.mjs";
2
+ export { piBuiltinToolNames, piReadOnlyToolNames, piRequiredCliFlags, piThinkingLevels, runActionCommandWithDependencies };
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-tools-extension.d.mts","names":[],"sources":["../../src/pi/runtime-tools-extension.ts"],"mappings":";KAmBK,eAAA;EACH,YAAA,CAAa,IAAA,EAAM,MAAM;AAAA;AAAA,KAGtB,MAAA;EACH,IAAA;EACA,KAAA;EACA,WAAA;EACA,UAAA,EAAY,MAAA;EACZ,OAAA,GACE,UAAA,UACA,MAAA,WACA,MAAA,YACA,QAAA,YACA,GAAA;IAAQ,GAAA;EAAA,MACL,OAAA,CAAQ,UAAA;AAAA;AAAA,KAGV,UAAA;EACH,OAAA,EAAS,KAAK;IAAG,IAAA;IAAc,IAAA;EAAA;EAC/B,OAAA;AAAA;;iBA2BsB,gBAAA,CAAiB,EAAmB,EAAf,eAAe"}
1
+ {"version":3,"file":"runtime-tools-extension.d.mts","names":[],"sources":["../../src/pi/runtime-tools-extension.ts"],"mappings":";KAmBK;EACH,aAAa,MAAM;;KAGhB;EACH;EACA;EACA;EACA,YAAY;EACZ,UACE,oBACA,iBACA,kBACA,oBACA;IAAQ;QACL,QAAQ;;KAGV;EACH,SAAS;IAAQ;IAAc;;EAC/B;;;iBA2BsB,iBAAiB,IAAI"}
@@ -77,7 +77,8 @@ function registerRuntimeReadTools(pi, dataPath) {
77
77
  },
78
78
  async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
79
79
  const cwd = typeof ctx?.cwd === "string" ? ctx.cwd : "";
80
- return textResult(await readAtRef(dataRoot, await Bun.file(dataPath).json(), readAtRefParams(params), cwd));
80
+ const data = await Bun.file(dataPath).json();
81
+ return textResult(await readAtRef(dataRoot, data, readAtRefParams(params), cwd));
81
82
  }
82
83
  });
83
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-tools-extension.mjs","names":[],"sources":["../../src/pi/runtime-tools-extension.ts"],"sourcesContent":["// Internal Pi sandbox contract loaded by the Pipr runtime. Not user API.\nimport { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { compact } from \"lodash-es\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkPath,\n type BaseRangeSnapshot,\n boundedLineSlice,\n type ReadAtRefParams,\n type RuntimeToolData,\n readAtRefParams,\n readDiffFromRuntimeData,\n readDiffParams,\n resolveAllowedPath,\n resolveReadAtRefRequest,\n unavailableReadAtRefResult,\n} from \"./runtime-tools-core.js\";\n\ntype PiExtensionHost = {\n registerTool(tool: PiTool): void;\n};\n\ntype PiTool = {\n name: string;\n label: string;\n description: string;\n parameters: Record<string, unknown>;\n execute: (\n toolCallId: string,\n params: unknown,\n signal?: unknown,\n onUpdate?: unknown,\n ctx?: { cwd?: unknown },\n ) => Promise<ToolResult>;\n};\n\ntype ToolResult = {\n content: Array<{ type: \"text\"; text: string }>;\n details: unknown;\n};\n\nconst customToolDataSchema = z.strictObject({\n tools: z.array(\n z.strictObject({\n name: z.string().min(1),\n description: z.string().optional(),\n }),\n ),\n});\n\nconst customToolBridgePayloadSchema = z.record(z.string(), z.unknown());\nconst readableBaseSnapshotSchema = z.looseObject({\n path: z.string(),\n ref: z.enum([\"base\", \"head\"]),\n sourcePath: z.string(),\n rangeId: z.string(),\n startLine: z.number(),\n endLine: z.number(),\n available: z.literal(true),\n relativePath: z.string(),\n bytes: z.number().optional(),\n truncated: z.boolean().optional(),\n});\n\n/** Registers pipr runtime read tools and config-defined custom tools with Pi. */\nexport default function piprRuntimeTools(pi: PiExtensionHost): void {\n const registrations = toolRegistrations();\n if (registrations.length === 0) {\n throw new Error(\"PIPR_RUNTIME_TOOLS_DATA or PIPR_CUSTOM_TOOLS_DATA is required\");\n }\n for (const registration of registrations) {\n registration.register(pi, registration.dataPath);\n }\n}\n\nfunction toolRegistrations(): Array<{\n dataPath: string;\n register(pi: PiExtensionHost, dataPath: string): void;\n}> {\n return compact([\n registration(runtimeDataPath(), registerRuntimeReadTools),\n registration(customToolsDataPath(), registerCustomTools),\n ]);\n}\n\nfunction registration(\n dataPath: string | undefined,\n register: (pi: PiExtensionHost, dataPath: string) => void,\n) {\n return dataPath ? { dataPath, register } : undefined;\n}\n\nfunction registerRuntimeReadTools(pi: PiExtensionHost, dataPath: string): void {\n const dataRoot = path.dirname(dataPath);\n\n pi.registerTool({\n name: \"pipr_read_diff\",\n label: \"Read pipr Diff Manifest\",\n description: \"Read bounded full Diff Manifest data by path and/or range id.\",\n parameters: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n path: { type: \"string\" },\n rangeId: { type: \"string\" },\n },\n },\n async execute(_toolCallId, params) {\n const data = (await Bun.file(dataPath).json()) as RuntimeToolData;\n const result = readDiffFromRuntimeData(data, readDiffParams(params));\n return textResult(result);\n },\n });\n\n pi.registerTool({\n name: \"pipr_read_at_ref\",\n label: \"Read pipr file at ref\",\n description: \"Read bounded file content for a Diff Manifest path at base or head.\",\n parameters: {\n type: \"object\",\n additionalProperties: false,\n required: [\"path\", \"ref\", \"rangeId\"],\n properties: {\n path: { type: \"string\" },\n ref: { type: \"string\", enum: [\"base\", \"head\"] },\n rangeId: { type: \"string\" },\n },\n },\n async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n const cwd = typeof ctx?.cwd === \"string\" ? ctx.cwd : \"\";\n const data = (await Bun.file(dataPath).json()) as RuntimeToolData;\n const result = await readAtRef(dataRoot, data, readAtRefParams(params), cwd);\n return textResult(result);\n },\n });\n}\n\nfunction registerCustomTools(pi: PiExtensionHost, dataPath: string): void {\n const bridgeUrl = customToolBridgeUrl();\n const bridgeToken = customToolBridgeToken();\n const data = customToolDataSchema.parse(JSON.parse(readFileSync(dataPath, \"utf8\")));\n for (const tool of data.tools) {\n pi.registerTool({\n name: tool.name,\n label: tool.name,\n description: tool.description ?? \"pipr custom config tool.\",\n parameters: {\n type: \"object\",\n additionalProperties: true,\n },\n async execute(_toolCallId, params) {\n const result = await callCustomTool(bridgeUrl, bridgeToken, tool.name, params);\n return textResult(result);\n },\n });\n }\n}\n\nfunction runtimeDataPath(): string | undefined {\n const dataPath = process.env.PIPR_RUNTIME_TOOLS_DATA;\n if (!dataPath) {\n return undefined;\n }\n if (!path.isAbsolute(dataPath)) {\n throw new Error(\"PIPR_RUNTIME_TOOLS_DATA must be an absolute path\");\n }\n return dataPath;\n}\n\nfunction customToolsDataPath(): string | undefined {\n const dataPath = process.env.PIPR_CUSTOM_TOOLS_DATA;\n if (!dataPath) {\n return undefined;\n }\n if (!path.isAbsolute(dataPath)) {\n throw new Error(\"PIPR_CUSTOM_TOOLS_DATA must be an absolute path\");\n }\n return dataPath;\n}\n\nfunction customToolBridgeUrl(): string {\n const value = process.env.PIPR_CUSTOM_TOOLS_BRIDGE_URL;\n if (!value) {\n throw new Error(\"PIPR_CUSTOM_TOOLS_BRIDGE_URL is required for pipr custom tools\");\n }\n return value;\n}\n\nfunction customToolBridgeToken(): string {\n const value = process.env.PIPR_CUSTOM_TOOLS_BRIDGE_TOKEN;\n if (!value) {\n throw new Error(\"PIPR_CUSTOM_TOOLS_BRIDGE_TOKEN is required for pipr custom tools\");\n }\n return value;\n}\n\nasync function callCustomTool(\n bridgeUrl: string,\n bridgeToken: string,\n tool: string,\n params: unknown,\n): Promise<unknown> {\n const response = await fetch(`${bridgeUrl}/call`, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${bridgeToken}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ tool, params }),\n });\n const payload = await parseCustomToolBridgePayload(response, tool);\n assertCustomToolBridgeOk(response, payload, tool);\n return Reflect.get(payload, \"result\");\n}\n\nasync function parseCustomToolBridgePayload(\n response: Response,\n tool: string,\n): Promise<Record<string, unknown>> {\n try {\n return customToolBridgePayloadSchema.parse(await response.json());\n } catch {\n throw new Error(`Custom tool '${tool}' returned invalid bridge response`);\n }\n}\n\nfunction assertCustomToolBridgeOk(\n response: Response,\n payload: Record<string, unknown>,\n tool: string,\n): void {\n if (!response.ok || Reflect.get(payload, \"ok\") !== true) {\n const error = Reflect.get(payload, \"error\");\n throw new Error(typeof error === \"string\" ? error : `Custom tool '${tool}' failed`);\n }\n}\n\nfunction textResult(value: unknown): ToolResult {\n return {\n content: [{ type: \"text\", text: JSON.stringify(value, null, 2) }],\n details: value,\n };\n}\n\nasync function readAtRef(\n dataRoot: string,\n data: RuntimeToolData,\n params: ReadAtRefParams,\n cwd: string,\n): Promise<unknown> {\n const request = resolveReadAtRefRequest(data.manifest, params);\n if (!request.window) {\n return unavailableReadAtRefResult(request);\n }\n if (params.ref === \"base\") {\n return await readBaseSnapshot(dataRoot, data.baseRanges[params.rangeId], params, request);\n }\n return await readHeadWorkspaceFile(cwd, data.toolResponseMaxBytes, params, request);\n}\n\nasync function readBaseSnapshot(\n dataRoot: string,\n snapshot: BaseRangeSnapshot | undefined,\n params: ReadAtRefParams,\n request: ReturnType<typeof resolveReadAtRefRequest>,\n): Promise<unknown> {\n const readable = readableBaseSnapshotSchema.safeParse(snapshot);\n if (!readable.success) {\n return snapshot ?? unavailableReadAtRefResult(request);\n }\n const snapshotData = readable.data;\n return {\n path: params.path,\n ref: params.ref,\n sourcePath: request.sourcePath,\n rangeId: params.rangeId,\n startLine: snapshotData.startLine,\n endLine: snapshotData.endLine,\n available: true,\n content: await Bun.file(path.join(dataRoot, snapshotData.relativePath)).text(),\n bytes: snapshotData.bytes,\n truncated: snapshotData.truncated,\n };\n}\n\nasync function readHeadWorkspaceFile(\n cwd: string,\n maxBytes: number,\n params: ReadAtRefParams,\n request: ReturnType<typeof resolveReadAtRefRequest>,\n): Promise<unknown> {\n if (!request.window) {\n return unavailableReadAtRefResult(request);\n }\n const target = resolveAllowedPath(cwd, request.sourcePath);\n await assertNoSymlinkPath(cwd, request.sourcePath);\n return {\n path: params.path,\n ref: params.ref,\n sourcePath: request.sourcePath,\n rangeId: params.rangeId,\n startLine: request.window.startLine,\n endLine: request.window.endLine,\n ...boundedLineSlice(await Bun.file(target).text(), request.window, maxBytes),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"runtime-tools-extension.mjs","names":[],"sources":["../../src/pi/runtime-tools-extension.ts"],"sourcesContent":["// Internal Pi sandbox contract loaded by the Pipr runtime. Not user API.\nimport { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { compact } from \"lodash-es\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkPath,\n type BaseRangeSnapshot,\n boundedLineSlice,\n type ReadAtRefParams,\n type RuntimeToolData,\n readAtRefParams,\n readDiffFromRuntimeData,\n readDiffParams,\n resolveAllowedPath,\n resolveReadAtRefRequest,\n unavailableReadAtRefResult,\n} from \"./runtime-tools-core.js\";\n\ntype PiExtensionHost = {\n registerTool(tool: PiTool): void;\n};\n\ntype PiTool = {\n name: string;\n label: string;\n description: string;\n parameters: Record<string, unknown>;\n execute: (\n toolCallId: string,\n params: unknown,\n signal?: unknown,\n onUpdate?: unknown,\n ctx?: { cwd?: unknown },\n ) => Promise<ToolResult>;\n};\n\ntype ToolResult = {\n content: Array<{ type: \"text\"; text: string }>;\n details: unknown;\n};\n\nconst customToolDataSchema = z.strictObject({\n tools: z.array(\n z.strictObject({\n name: z.string().min(1),\n description: z.string().optional(),\n }),\n ),\n});\n\nconst customToolBridgePayloadSchema = z.record(z.string(), z.unknown());\nconst readableBaseSnapshotSchema = z.looseObject({\n path: z.string(),\n ref: z.enum([\"base\", \"head\"]),\n sourcePath: z.string(),\n rangeId: z.string(),\n startLine: z.number(),\n endLine: z.number(),\n available: z.literal(true),\n relativePath: z.string(),\n bytes: z.number().optional(),\n truncated: z.boolean().optional(),\n});\n\n/** Registers pipr runtime read tools and config-defined custom tools with Pi. */\nexport default function piprRuntimeTools(pi: PiExtensionHost): void {\n const registrations = toolRegistrations();\n if (registrations.length === 0) {\n throw new Error(\"PIPR_RUNTIME_TOOLS_DATA or PIPR_CUSTOM_TOOLS_DATA is required\");\n }\n for (const registration of registrations) {\n registration.register(pi, registration.dataPath);\n }\n}\n\nfunction toolRegistrations(): Array<{\n dataPath: string;\n register(pi: PiExtensionHost, dataPath: string): void;\n}> {\n return compact([\n registration(runtimeDataPath(), registerRuntimeReadTools),\n registration(customToolsDataPath(), registerCustomTools),\n ]);\n}\n\nfunction registration(\n dataPath: string | undefined,\n register: (pi: PiExtensionHost, dataPath: string) => void,\n) {\n return dataPath ? { dataPath, register } : undefined;\n}\n\nfunction registerRuntimeReadTools(pi: PiExtensionHost, dataPath: string): void {\n const dataRoot = path.dirname(dataPath);\n\n pi.registerTool({\n name: \"pipr_read_diff\",\n label: \"Read pipr Diff Manifest\",\n description: \"Read bounded full Diff Manifest data by path and/or range id.\",\n parameters: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n path: { type: \"string\" },\n rangeId: { type: \"string\" },\n },\n },\n async execute(_toolCallId, params) {\n const data = (await Bun.file(dataPath).json()) as RuntimeToolData;\n const result = readDiffFromRuntimeData(data, readDiffParams(params));\n return textResult(result);\n },\n });\n\n pi.registerTool({\n name: \"pipr_read_at_ref\",\n label: \"Read pipr file at ref\",\n description: \"Read bounded file content for a Diff Manifest path at base or head.\",\n parameters: {\n type: \"object\",\n additionalProperties: false,\n required: [\"path\", \"ref\", \"rangeId\"],\n properties: {\n path: { type: \"string\" },\n ref: { type: \"string\", enum: [\"base\", \"head\"] },\n rangeId: { type: \"string\" },\n },\n },\n async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n const cwd = typeof ctx?.cwd === \"string\" ? ctx.cwd : \"\";\n const data = (await Bun.file(dataPath).json()) as RuntimeToolData;\n const result = await readAtRef(dataRoot, data, readAtRefParams(params), cwd);\n return textResult(result);\n },\n });\n}\n\nfunction registerCustomTools(pi: PiExtensionHost, dataPath: string): void {\n const bridgeUrl = customToolBridgeUrl();\n const bridgeToken = customToolBridgeToken();\n const data = customToolDataSchema.parse(JSON.parse(readFileSync(dataPath, \"utf8\")));\n for (const tool of data.tools) {\n pi.registerTool({\n name: tool.name,\n label: tool.name,\n description: tool.description ?? \"pipr custom config tool.\",\n parameters: {\n type: \"object\",\n additionalProperties: true,\n },\n async execute(_toolCallId, params) {\n const result = await callCustomTool(bridgeUrl, bridgeToken, tool.name, params);\n return textResult(result);\n },\n });\n }\n}\n\nfunction runtimeDataPath(): string | undefined {\n const dataPath = process.env.PIPR_RUNTIME_TOOLS_DATA;\n if (!dataPath) {\n return undefined;\n }\n if (!path.isAbsolute(dataPath)) {\n throw new Error(\"PIPR_RUNTIME_TOOLS_DATA must be an absolute path\");\n }\n return dataPath;\n}\n\nfunction customToolsDataPath(): string | undefined {\n const dataPath = process.env.PIPR_CUSTOM_TOOLS_DATA;\n if (!dataPath) {\n return undefined;\n }\n if (!path.isAbsolute(dataPath)) {\n throw new Error(\"PIPR_CUSTOM_TOOLS_DATA must be an absolute path\");\n }\n return dataPath;\n}\n\nfunction customToolBridgeUrl(): string {\n const value = process.env.PIPR_CUSTOM_TOOLS_BRIDGE_URL;\n if (!value) {\n throw new Error(\"PIPR_CUSTOM_TOOLS_BRIDGE_URL is required for pipr custom tools\");\n }\n return value;\n}\n\nfunction customToolBridgeToken(): string {\n const value = process.env.PIPR_CUSTOM_TOOLS_BRIDGE_TOKEN;\n if (!value) {\n throw new Error(\"PIPR_CUSTOM_TOOLS_BRIDGE_TOKEN is required for pipr custom tools\");\n }\n return value;\n}\n\nasync function callCustomTool(\n bridgeUrl: string,\n bridgeToken: string,\n tool: string,\n params: unknown,\n): Promise<unknown> {\n const response = await fetch(`${bridgeUrl}/call`, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${bridgeToken}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ tool, params }),\n });\n const payload = await parseCustomToolBridgePayload(response, tool);\n assertCustomToolBridgeOk(response, payload, tool);\n return Reflect.get(payload, \"result\");\n}\n\nasync function parseCustomToolBridgePayload(\n response: Response,\n tool: string,\n): Promise<Record<string, unknown>> {\n try {\n return customToolBridgePayloadSchema.parse(await response.json());\n } catch {\n throw new Error(`Custom tool '${tool}' returned invalid bridge response`);\n }\n}\n\nfunction assertCustomToolBridgeOk(\n response: Response,\n payload: Record<string, unknown>,\n tool: string,\n): void {\n if (!response.ok || Reflect.get(payload, \"ok\") !== true) {\n const error = Reflect.get(payload, \"error\");\n throw new Error(typeof error === \"string\" ? error : `Custom tool '${tool}' failed`);\n }\n}\n\nfunction textResult(value: unknown): ToolResult {\n return {\n content: [{ type: \"text\", text: JSON.stringify(value, null, 2) }],\n details: value,\n };\n}\n\nasync function readAtRef(\n dataRoot: string,\n data: RuntimeToolData,\n params: ReadAtRefParams,\n cwd: string,\n): Promise<unknown> {\n const request = resolveReadAtRefRequest(data.manifest, params);\n if (!request.window) {\n return unavailableReadAtRefResult(request);\n }\n if (params.ref === \"base\") {\n return await readBaseSnapshot(dataRoot, data.baseRanges[params.rangeId], params, request);\n }\n return await readHeadWorkspaceFile(cwd, data.toolResponseMaxBytes, params, request);\n}\n\nasync function readBaseSnapshot(\n dataRoot: string,\n snapshot: BaseRangeSnapshot | undefined,\n params: ReadAtRefParams,\n request: ReturnType<typeof resolveReadAtRefRequest>,\n): Promise<unknown> {\n const readable = readableBaseSnapshotSchema.safeParse(snapshot);\n if (!readable.success) {\n return snapshot ?? unavailableReadAtRefResult(request);\n }\n const snapshotData = readable.data;\n return {\n path: params.path,\n ref: params.ref,\n sourcePath: request.sourcePath,\n rangeId: params.rangeId,\n startLine: snapshotData.startLine,\n endLine: snapshotData.endLine,\n available: true,\n content: await Bun.file(path.join(dataRoot, snapshotData.relativePath)).text(),\n bytes: snapshotData.bytes,\n truncated: snapshotData.truncated,\n };\n}\n\nasync function readHeadWorkspaceFile(\n cwd: string,\n maxBytes: number,\n params: ReadAtRefParams,\n request: ReturnType<typeof resolveReadAtRefRequest>,\n): Promise<unknown> {\n if (!request.window) {\n return unavailableReadAtRefResult(request);\n }\n const target = resolveAllowedPath(cwd, request.sourcePath);\n await assertNoSymlinkPath(cwd, request.sourcePath);\n return {\n path: params.path,\n ref: params.ref,\n sourcePath: request.sourcePath,\n rangeId: params.rangeId,\n startLine: request.window.startLine,\n endLine: request.window.endLine,\n ...boundedLineSlice(await Bun.file(target).text(), request.window, maxBytes),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,206 @@
1
+ //#region src/review/inline-finding-limits.ts
2
+ const maxInlineFindingBodyCharacters = 700;
3
+ const maxInlineFindingBodyLines = 4;
4
+ //#endregion
5
+ //#region src/review/suggested-fix-publication-policy.ts
6
+ const maxSuggestedFixSelectedLines = 12;
7
+ const maxSuggestedFixReplacementLines = 20;
8
+ const environmentKeyAccessPattern = /\b(?:process|Bun|import\.meta)(?:\s*\.|\s*\?\.)\s*env(?:\s*(?:\.|\?\.)\s*([A-Za-z_][A-Za-z0-9_]*)|\s*\?\.\s*\[\s*["']([A-Za-z_][A-Za-z0-9_]*)["']\s*\]|\s*\[\s*["']([A-Za-z_][A-Za-z0-9_]*)["']\s*\])|\bDeno(?:\s*\.|\s*\?\.)\s*env(?:\s*\.|\s*\?\.)\s*get\s*\(\s*["']([A-Za-z_][A-Za-z0-9_]*)["']\s*\)/g;
9
+ const environmentDestructurePattern = /\{([^{}]*)\}\s*=\s*(?:process|Bun|import\.meta)(?:\s*\.|\s*\?\.)\s*env\b/g;
10
+ const environmentKeyNamePattern = /^[A-Za-z_][A-Za-z0-9_]*$/;
11
+ function isPublishableSuggestedFixSelection(selection) {
12
+ const suggestedLines = normalizedSuggestedFixLines(selection.suggestedFix);
13
+ const selectedLineCount = selection.endLine - selection.startLine + 1;
14
+ if (selection.side !== "RIGHT" || selection.kind === "deleted" || selectedLineCount > maxSuggestedFixSelectedLines || suggestedLines.length > maxSuggestedFixReplacementLines) return false;
15
+ const originalLines = selectedPreviewLines(selection, selectedLineCount);
16
+ if (!originalLines) return false;
17
+ const structuralEdgePattern = /^([{}[\]()<>]+)[;,]?$/;
18
+ const firstOriginalEdge = originalLines[0]?.trim().match(structuralEdgePattern)?.[1];
19
+ const firstSuggestedEdge = suggestedLines[0]?.trim().match(structuralEdgePattern)?.[1];
20
+ const lastOriginalEdge = originalLines.at(-1)?.trim().match(structuralEdgePattern)?.[1];
21
+ const lastSuggestedEdge = suggestedLines.at(-1)?.trim().match(structuralEdgePattern)?.[1];
22
+ const originalLinesWithoutTrailingBlanks = originalLines.slice(0, lastNonBlankLineIndex(originalLines) + 1);
23
+ const suggestedLinesWithoutTrailingBlanks = suggestedLines.slice(0, lastNonBlankLineIndex(suggestedLines) + 1);
24
+ return (originalLinesWithoutTrailingBlanks.length !== suggestedLinesWithoutTrailingBlanks.length || originalLinesWithoutTrailingBlanks.some((line, index) => line !== suggestedLinesWithoutTrailingBlanks[index])) && !onlyChangesWhitespace(originalLinesWithoutTrailingBlanks, suggestedLinesWithoutTrailingBlanks) && !suggestionIntroducesNewEnvironmentAccess(selection.preview, selection.suggestedFix) && (firstOriginalEdge === void 0 || firstOriginalEdge === firstSuggestedEdge) && (lastOriginalEdge === void 0 || lastOriginalEdge === lastSuggestedEdge) && !hasUnchangedSelectionEdge(originalLines, suggestedLines) && !suggestionIncludesUnselectedContext(selection, selectedLineCount, suggestedLines);
25
+ }
26
+ function normalizedSuggestedFixLines(value) {
27
+ const normalized = value.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
28
+ const withoutFinalNewline = normalized.endsWith("\n") ? normalized.slice(0, -1) : normalized;
29
+ return withoutFinalNewline.length === 0 ? [] : withoutFinalNewline.split("\n");
30
+ }
31
+ function selectedPreviewLines(selection, selectedLineCount) {
32
+ if (!selection.preview) return;
33
+ const offset = selection.startLine - selection.rangeStartLine;
34
+ if (offset < 0) return;
35
+ const previewLines = selection.preview.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
36
+ if (offset + selectedLineCount > previewLines.length) return;
37
+ return previewLines.slice(offset, offset + selectedLineCount);
38
+ }
39
+ function suggestionIncludesUnselectedContext(selection, selectedLineCount, suggestedLines) {
40
+ if (!selection.preview || suggestedLines.length <= selectedLineCount) return false;
41
+ const offset = selection.startLine - selection.rangeStartLine;
42
+ if (offset < 0) return false;
43
+ const previewLines = selection.preview.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
44
+ return [offset > 0 ? previewLines[offset - 1] : void 0, previewLines[offset + selectedLineCount]].filter((line) => Boolean(line?.trim())).some((line) => suggestedLines.includes(line));
45
+ }
46
+ function hasUnchangedSelectionEdge(originalLines, suggestedLines) {
47
+ const firstLineUnchanged = originalLines[0] === suggestedLines[0];
48
+ const lastLineUnchanged = originalLines.at(-1) === suggestedLines.at(-1);
49
+ if (originalLines.length === suggestedLines.length || originalLines.length === 1) return firstLineUnchanged || lastLineUnchanged;
50
+ return firstLineUnchanged && lastLineUnchanged;
51
+ }
52
+ function lastNonBlankLineIndex(lines) {
53
+ for (let index = lines.length - 1; index >= 0; index -= 1) if (lines[index]?.trim() !== "") return index;
54
+ return -1;
55
+ }
56
+ function onlyChangesWhitespace(originalLines, suggestedLines) {
57
+ const original = originalLines.join("\n");
58
+ const suggested = suggestedLines.join("\n");
59
+ const originalScan = scanCodeWhitespace(original);
60
+ const suggestedScan = scanCodeWhitespace(suggested);
61
+ if (originalScan.containsCommentSyntax || suggestedScan.containsCommentSyntax) return false;
62
+ return originalScan.stripped === suggestedScan.stripped;
63
+ }
64
+ function scanCodeWhitespace(value) {
65
+ let result = "";
66
+ const state = {
67
+ literalDelimiter: void 0,
68
+ escaped: false,
69
+ regexCharacterClass: false,
70
+ templateExpressionDepths: []
71
+ };
72
+ for (let index = 0; index < value.length; index += 1) {
73
+ const char = value.charAt(index);
74
+ if (advanceCodeLiteralScan(state, char, value[index + 1])) {
75
+ result += char;
76
+ continue;
77
+ }
78
+ if (char === "/" && ["/", "*"].includes(value[index + 1] ?? "")) return {
79
+ stripped: result,
80
+ containsCommentSyntax: true
81
+ };
82
+ if (/\s/.test(char)) {
83
+ const nextNonWhitespace = value.slice(index + 1).match(/\S/)?.[0];
84
+ result += codeTokenSeparator(result.at(-1), nextNonWhitespace);
85
+ continue;
86
+ }
87
+ advanceTemplateExpressionScan(state, char);
88
+ state.literalDelimiter ??= openingCodeLiteralDelimiter(char, value[index + 1], result);
89
+ state.regexCharacterClass = false;
90
+ result += char;
91
+ }
92
+ return {
93
+ stripped: result,
94
+ containsCommentSyntax: false
95
+ };
96
+ }
97
+ function codeTokenSeparator(previousChar, nextChar) {
98
+ if (!previousChar || !nextChar) return "";
99
+ if (/[A-Za-z0-9_$]/.test(previousChar) && /[A-Za-z0-9_$]/.test(nextChar)) return " ";
100
+ return [
101
+ "++",
102
+ "--",
103
+ "//",
104
+ "/*",
105
+ "**",
106
+ "??",
107
+ "?.",
108
+ "=>",
109
+ "==",
110
+ "!=",
111
+ "<=",
112
+ ">=",
113
+ "&&",
114
+ "||",
115
+ "<<",
116
+ ">>"
117
+ ].includes(previousChar + nextChar) ? " " : "";
118
+ }
119
+ function advanceCodeLiteralScan(state, char, nextChar) {
120
+ if (!state.literalDelimiter) return false;
121
+ if (state.escaped) {
122
+ state.escaped = false;
123
+ return true;
124
+ }
125
+ if (char === "\\") {
126
+ state.escaped = true;
127
+ return true;
128
+ }
129
+ if (state.literalDelimiter.charCodeAt(0) === 96 && char === "$" && nextChar === "{") {
130
+ state.templateExpressionDepths.push(0);
131
+ state.literalDelimiter = void 0;
132
+ return true;
133
+ }
134
+ if (state.literalDelimiter !== "/") {
135
+ if (char === state.literalDelimiter) state.literalDelimiter = void 0;
136
+ return true;
137
+ }
138
+ advanceRegexLiteralScan(state, char);
139
+ return true;
140
+ }
141
+ function advanceTemplateExpressionScan(state, char) {
142
+ const depthIndex = state.templateExpressionDepths.length - 1;
143
+ const depth = state.templateExpressionDepths[depthIndex];
144
+ if (depth === void 0) return;
145
+ if (char === "{") state.templateExpressionDepths[depthIndex] = depth + 1;
146
+ else if (char === "}") if (depth <= 1) {
147
+ state.templateExpressionDepths.pop();
148
+ state.literalDelimiter = "`";
149
+ } else state.templateExpressionDepths[depthIndex] = depth - 1;
150
+ }
151
+ function advanceRegexLiteralScan(state, char) {
152
+ if (char === "[") state.regexCharacterClass = true;
153
+ else if (char === "]") state.regexCharacterClass = false;
154
+ else if (char === "/" && !state.regexCharacterClass) state.literalDelimiter = void 0;
155
+ }
156
+ function openingCodeLiteralDelimiter(char, nextChar, previousCode) {
157
+ if (char === "\"" || char === "'" || char.charCodeAt(0) === 96) return char;
158
+ return startsRegexLiteral(char, nextChar, previousCode) ? "/" : void 0;
159
+ }
160
+ function startsRegexLiteral(char, nextChar, previousCode) {
161
+ const previousChar = previousCode.at(-1);
162
+ const previousWord = previousCode.split(/[^A-Za-z]+/).at(-1);
163
+ const followsRegexKeyword = [
164
+ "return",
165
+ "throw",
166
+ "case",
167
+ "delete",
168
+ "void",
169
+ "typeof",
170
+ "instanceof",
171
+ "in",
172
+ "of",
173
+ "yield",
174
+ "await"
175
+ ].includes(previousWord ?? "");
176
+ return char === "/" && nextChar !== "/" && nextChar !== "*" && (previousChar === void 0 || "([{:;,=!?&|+-*%^~<>)".includes(previousChar) || followsRegexKeyword);
177
+ }
178
+ function suggestionIntroducesNewEnvironmentAccess(preview, suggestedFix) {
179
+ const suggestedKeys = environmentAccessKeys(suggestedFix);
180
+ if (suggestedKeys.size === 0) return false;
181
+ const existingKeys = environmentAccessKeys(preview ?? "");
182
+ return Array.from(suggestedKeys).some((key) => !existingKeys.has(key));
183
+ }
184
+ function environmentAccessKeys(value) {
185
+ const keys = /* @__PURE__ */ new Set();
186
+ for (const match of value.matchAll(environmentKeyAccessPattern)) {
187
+ const key = match[1] ?? match[2] ?? match[3] ?? match[4];
188
+ if (key) keys.add(key);
189
+ }
190
+ for (const match of value.matchAll(environmentDestructurePattern)) addDestructuredEnvironmentKeys(keys, match[1] ?? "");
191
+ return keys;
192
+ }
193
+ function addDestructuredEnvironmentKeys(keys, bindings) {
194
+ for (const binding of bindings.split(",")) {
195
+ const key = destructuredEnvironmentKey(binding);
196
+ if (key) keys.add(key);
197
+ }
198
+ }
199
+ function destructuredEnvironmentKey(binding) {
200
+ const key = binding.split(/[:=]/, 1)[0]?.trim().replace(/^["']|["']$/g, "");
201
+ return key && !key.startsWith("...") && environmentKeyNamePattern.test(key) ? key : void 0;
202
+ }
203
+ //#endregion
204
+ export { maxInlineFindingBodyCharacters as n, maxInlineFindingBodyLines as r, isPublishableSuggestedFixSelection as t };
205
+
206
+ //# sourceMappingURL=suggested-fix-publication-policy-B5Wwuudp.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggested-fix-publication-policy-B5Wwuudp.mjs","names":[],"sources":["../src/review/inline-finding-limits.ts","../src/review/suggested-fix-publication-policy.ts"],"sourcesContent":["export const maxInlineFindingBodyCharacters = 700;\nexport const maxInlineFindingBodyLines = 4;\n","type SuggestedFixPublicationSelection = {\n side: \"RIGHT\" | \"LEFT\";\n kind: \"added\" | \"deleted\" | \"context\" | \"mixed\";\n rangeStartLine: number;\n startLine: number;\n endLine: number;\n preview?: string;\n suggestedFix: string;\n};\n\nconst maxSuggestedFixSelectedLines = 12;\nconst maxSuggestedFixReplacementLines = 20;\nconst environmentKeyAccessPattern =\n /\\b(?:process|Bun|import\\.meta)(?:\\s*\\.|\\s*\\?\\.)\\s*env(?:\\s*(?:\\.|\\?\\.)\\s*([A-Za-z_][A-Za-z0-9_]*)|\\s*\\?\\.\\s*\\[\\s*[\"']([A-Za-z_][A-Za-z0-9_]*)[\"']\\s*\\]|\\s*\\[\\s*[\"']([A-Za-z_][A-Za-z0-9_]*)[\"']\\s*\\])|\\bDeno(?:\\s*\\.|\\s*\\?\\.)\\s*env(?:\\s*\\.|\\s*\\?\\.)\\s*get\\s*\\(\\s*[\"']([A-Za-z_][A-Za-z0-9_]*)[\"']\\s*\\)/g;\nconst environmentDestructurePattern =\n /\\{([^{}]*)\\}\\s*=\\s*(?:process|Bun|import\\.meta)(?:\\s*\\.|\\s*\\?\\.)\\s*env\\b/g;\nconst environmentKeyNamePattern = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nexport function isPublishableSuggestedFixSelection(\n selection: SuggestedFixPublicationSelection,\n): boolean {\n const suggestedLines = normalizedSuggestedFixLines(selection.suggestedFix);\n const selectedLineCount = selection.endLine - selection.startLine + 1;\n if (\n selection.side !== \"RIGHT\" ||\n selection.kind === \"deleted\" ||\n selectedLineCount > maxSuggestedFixSelectedLines ||\n suggestedLines.length > maxSuggestedFixReplacementLines\n ) {\n return false;\n }\n\n const originalLines = selectedPreviewLines(selection, selectedLineCount);\n if (!originalLines) {\n return false;\n }\n const structuralEdgePattern = /^([{}[\\]()<>]+)[;,]?$/;\n const firstOriginalEdge = originalLines[0]?.trim().match(structuralEdgePattern)?.[1];\n const firstSuggestedEdge = suggestedLines[0]?.trim().match(structuralEdgePattern)?.[1];\n const lastOriginalEdge = originalLines.at(-1)?.trim().match(structuralEdgePattern)?.[1];\n const lastSuggestedEdge = suggestedLines.at(-1)?.trim().match(structuralEdgePattern)?.[1];\n const originalLinesWithoutTrailingBlanks = originalLines.slice(\n 0,\n lastNonBlankLineIndex(originalLines) + 1,\n );\n const suggestedLinesWithoutTrailingBlanks = suggestedLines.slice(\n 0,\n lastNonBlankLineIndex(suggestedLines) + 1,\n );\n const hasTextChange =\n originalLinesWithoutTrailingBlanks.length !== suggestedLinesWithoutTrailingBlanks.length ||\n originalLinesWithoutTrailingBlanks.some(\n (line, index) => line !== suggestedLinesWithoutTrailingBlanks[index],\n );\n return (\n hasTextChange &&\n !onlyChangesWhitespace(\n originalLinesWithoutTrailingBlanks,\n suggestedLinesWithoutTrailingBlanks,\n ) &&\n !suggestionIntroducesNewEnvironmentAccess(selection.preview, selection.suggestedFix) &&\n (firstOriginalEdge === undefined || firstOriginalEdge === firstSuggestedEdge) &&\n (lastOriginalEdge === undefined || lastOriginalEdge === lastSuggestedEdge) &&\n !hasUnchangedSelectionEdge(originalLines, suggestedLines) &&\n !suggestionIncludesUnselectedContext(selection, selectedLineCount, suggestedLines)\n );\n}\n\nfunction normalizedSuggestedFixLines(value: string): string[] {\n const normalized = value.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n const withoutFinalNewline = normalized.endsWith(\"\\n\") ? normalized.slice(0, -1) : normalized;\n return withoutFinalNewline.length === 0 ? [] : withoutFinalNewline.split(\"\\n\");\n}\n\nfunction selectedPreviewLines(\n selection: SuggestedFixPublicationSelection,\n selectedLineCount: number,\n): string[] | undefined {\n if (!selection.preview) {\n return undefined;\n }\n const offset = selection.startLine - selection.rangeStartLine;\n if (offset < 0) {\n return undefined;\n }\n const previewLines = selection.preview.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\").split(\"\\n\");\n if (offset + selectedLineCount > previewLines.length) {\n return undefined;\n }\n return previewLines.slice(offset, offset + selectedLineCount);\n}\n\nfunction suggestionIncludesUnselectedContext(\n selection: SuggestedFixPublicationSelection,\n selectedLineCount: number,\n suggestedLines: string[],\n): boolean {\n if (!selection.preview || suggestedLines.length <= selectedLineCount) {\n return false;\n }\n const offset = selection.startLine - selection.rangeStartLine;\n if (offset < 0) {\n return false;\n }\n const previewLines = selection.preview.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\").split(\"\\n\");\n const contextLines = [\n offset > 0 ? previewLines[offset - 1] : undefined,\n previewLines[offset + selectedLineCount],\n ].filter((line): line is string => Boolean(line?.trim()));\n return contextLines.some((line) => suggestedLines.includes(line));\n}\n\nfunction hasUnchangedSelectionEdge(originalLines: string[], suggestedLines: string[]): boolean {\n const firstLineUnchanged = originalLines[0] === suggestedLines[0];\n const lastLineUnchanged = originalLines.at(-1) === suggestedLines.at(-1);\n if (originalLines.length === suggestedLines.length || originalLines.length === 1) {\n return firstLineUnchanged || lastLineUnchanged;\n }\n return firstLineUnchanged && lastLineUnchanged;\n}\n\nfunction lastNonBlankLineIndex(lines: string[]): number {\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n if (lines[index]?.trim() !== \"\") {\n return index;\n }\n }\n return -1;\n}\n\nfunction onlyChangesWhitespace(originalLines: string[], suggestedLines: string[]): boolean {\n const original = originalLines.join(\"\\n\");\n const suggested = suggestedLines.join(\"\\n\");\n const originalScan = scanCodeWhitespace(original);\n const suggestedScan = scanCodeWhitespace(suggested);\n if (originalScan.containsCommentSyntax || suggestedScan.containsCommentSyntax) {\n return false;\n }\n return originalScan.stripped === suggestedScan.stripped;\n}\n\nfunction scanCodeWhitespace(value: string): {\n stripped: string;\n containsCommentSyntax: boolean;\n} {\n let result = \"\";\n const state: CodeWhitespaceScanState = {\n literalDelimiter: undefined,\n escaped: false,\n regexCharacterClass: false,\n templateExpressionDepths: [],\n };\n\n for (let index = 0; index < value.length; index += 1) {\n const char = value.charAt(index);\n if (advanceCodeLiteralScan(state, char, value[index + 1])) {\n result += char;\n continue;\n }\n if (char === \"/\" && [\"/\", \"*\"].includes(value[index + 1] ?? \"\")) {\n return { stripped: result, containsCommentSyntax: true };\n }\n if (/\\s/.test(char)) {\n const nextNonWhitespace = value.slice(index + 1).match(/\\S/)?.[0];\n result += codeTokenSeparator(result.at(-1), nextNonWhitespace);\n continue;\n }\n advanceTemplateExpressionScan(state, char);\n state.literalDelimiter ??= openingCodeLiteralDelimiter(char, value[index + 1], result);\n state.regexCharacterClass = false;\n result += char;\n }\n\n return { stripped: result, containsCommentSyntax: false };\n}\n\nfunction codeTokenSeparator(\n previousChar: string | undefined,\n nextChar: string | undefined,\n): string {\n if (!previousChar || !nextChar) {\n return \"\";\n }\n if (/[A-Za-z0-9_$]/.test(previousChar) && /[A-Za-z0-9_$]/.test(nextChar)) {\n return \" \";\n }\n const requiresSeparator = [\n \"++\",\n \"--\",\n \"//\",\n \"/*\",\n \"**\",\n \"??\",\n \"?.\",\n \"=>\",\n \"==\",\n \"!=\",\n \"<=\",\n \">=\",\n \"&&\",\n \"||\",\n \"<<\",\n \">>\",\n ].includes(previousChar + nextChar);\n return requiresSeparator ? \" \" : \"\";\n}\n\ntype CodeWhitespaceScanState = {\n literalDelimiter: string | undefined;\n escaped: boolean;\n regexCharacterClass: boolean;\n templateExpressionDepths: number[];\n};\n\nfunction advanceCodeLiteralScan(\n state: CodeWhitespaceScanState,\n char: string,\n nextChar: string | undefined,\n): boolean {\n if (!state.literalDelimiter) {\n return false;\n }\n if (state.escaped) {\n state.escaped = false;\n return true;\n }\n if (char === \"\\\\\") {\n state.escaped = true;\n return true;\n }\n if (state.literalDelimiter.charCodeAt(0) === 96 && char === \"$\" && nextChar === \"{\") {\n state.templateExpressionDepths.push(0);\n state.literalDelimiter = undefined;\n return true;\n }\n if (state.literalDelimiter !== \"/\") {\n if (char === state.literalDelimiter) {\n state.literalDelimiter = undefined;\n }\n return true;\n }\n advanceRegexLiteralScan(state, char);\n return true;\n}\n\nfunction advanceTemplateExpressionScan(state: CodeWhitespaceScanState, char: string): void {\n const depthIndex = state.templateExpressionDepths.length - 1;\n const depth = state.templateExpressionDepths[depthIndex];\n if (depth === undefined) {\n return;\n }\n if (char === \"{\") {\n state.templateExpressionDepths[depthIndex] = depth + 1;\n } else if (char === \"}\") {\n if (depth <= 1) {\n state.templateExpressionDepths.pop();\n state.literalDelimiter = \"`\";\n } else {\n state.templateExpressionDepths[depthIndex] = depth - 1;\n }\n }\n}\n\nfunction advanceRegexLiteralScan(state: CodeWhitespaceScanState, char: string): void {\n if (char === \"[\") {\n state.regexCharacterClass = true;\n } else if (char === \"]\") {\n state.regexCharacterClass = false;\n } else if (char === \"/\" && !state.regexCharacterClass) {\n state.literalDelimiter = undefined;\n }\n}\n\nfunction openingCodeLiteralDelimiter(\n char: string,\n nextChar: string | undefined,\n previousCode: string,\n): string | undefined {\n if (char === '\"' || char === \"'\" || char.charCodeAt(0) === 96) {\n return char;\n }\n return startsRegexLiteral(char, nextChar, previousCode) ? \"/\" : undefined;\n}\n\nfunction startsRegexLiteral(\n char: string,\n nextChar: string | undefined,\n previousCode: string,\n): boolean {\n const previousChar = previousCode.at(-1);\n const previousWord = previousCode.split(/[^A-Za-z]+/).at(-1);\n const followsRegexKeyword = [\n \"return\",\n \"throw\",\n \"case\",\n \"delete\",\n \"void\",\n \"typeof\",\n \"instanceof\",\n \"in\",\n \"of\",\n \"yield\",\n \"await\",\n ].includes(previousWord ?? \"\");\n return (\n char === \"/\" &&\n nextChar !== \"/\" &&\n nextChar !== \"*\" &&\n (previousChar === undefined ||\n \"([{:;,=!?&|+-*%^~<>)\".includes(previousChar) ||\n followsRegexKeyword)\n );\n}\n\nfunction suggestionIntroducesNewEnvironmentAccess(\n preview: string | undefined,\n suggestedFix: string,\n): boolean {\n const suggestedKeys = environmentAccessKeys(suggestedFix);\n if (suggestedKeys.size === 0) {\n return false;\n }\n const existingKeys = environmentAccessKeys(preview ?? \"\");\n return Array.from(suggestedKeys).some((key) => !existingKeys.has(key));\n}\n\nfunction environmentAccessKeys(value: string): Set<string> {\n const keys = new Set<string>();\n for (const match of value.matchAll(environmentKeyAccessPattern)) {\n const key = match[1] ?? match[2] ?? match[3] ?? match[4];\n if (key) {\n keys.add(key);\n }\n }\n for (const match of value.matchAll(environmentDestructurePattern)) {\n addDestructuredEnvironmentKeys(keys, match[1] ?? \"\");\n }\n return keys;\n}\n\nfunction addDestructuredEnvironmentKeys(keys: Set<string>, bindings: string): void {\n for (const binding of bindings.split(\",\")) {\n const key = destructuredEnvironmentKey(binding);\n if (key) {\n keys.add(key);\n }\n }\n}\n\nfunction destructuredEnvironmentKey(binding: string): string | undefined {\n const key = binding\n .split(/[:=]/, 1)[0]\n ?.trim()\n .replace(/^[\"']|[\"']$/g, \"\");\n return key && !key.startsWith(\"...\") && environmentKeyNamePattern.test(key) ? key : undefined;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usepipr/runtime",
3
- "version": "0.3.3",
3
+ "version": "0.3.6",
4
4
  "description": "Runtime package for pipr pull request review automation",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -30,13 +30,17 @@
30
30
  "types": "./dist/internal/testing.d.mts",
31
31
  "default": "./dist/internal/testing.mjs"
32
32
  },
33
+ "./internal/review-testing": {
34
+ "types": "./dist/internal/review-testing.d.mts",
35
+ "default": "./dist/internal/review-testing.mjs"
36
+ },
33
37
  "./runtime-tools-extension": {
34
38
  "types": "./dist/pi/runtime-tools-extension.d.mts",
35
39
  "default": "./dist/pi/runtime-tools-extension.mjs"
36
40
  }
37
41
  },
38
42
  "scripts": {
39
- "build": "tsdown src/index.ts src/internal/testing.ts src/pi/runtime-tools-extension.ts --dts --format esm --out-dir dist",
43
+ "build": "tsdown src/index.ts src/internal/testing.ts src/internal/review-testing.ts src/pi/runtime-tools-extension.ts --dts --format esm --out-dir dist",
40
44
  "typecheck": "tsc --noEmit",
41
45
  "test": "bun test --timeout 60000",
42
46
  "test:config-init": "bun test --timeout 60000 src/config/tests/init.test.ts",
@@ -50,7 +54,7 @@
50
54
  "dependencies": {
51
55
  "@octokit/rest": "22.0.1",
52
56
  "@types/bun": "1.3.14",
53
- "@usepipr/sdk": "0.3.3",
57
+ "@usepipr/sdk": "0.3.6",
54
58
  "lodash-es": "4.18.1",
55
59
  "picomatch": "4.0.5",
56
60
  "typescript": "6.0.3",
@@ -58,7 +62,7 @@
58
62
  },
59
63
  "devDependencies": {
60
64
  "@types/lodash-es": "4.17.12",
61
- "@types/node": "26.1.0",
65
+ "@types/node": "26.1.1",
62
66
  "@types/picomatch": "4.0.3"
63
67
  }
64
68
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"commands-4n3t4t5P.d.mts","names":[],"sources":["../src/config/init.ts","../src/types.ts","../src/config/project.ts","../../sdk/src/types/manifest.ts","../src/review/prior-state.ts","../src/review/comment.ts","../src/review/publication-result.ts","../src/hosts/types.ts","../src/hosts/github/command.ts","../src/hosts/github/publication-client.ts","../src/shared/logging.ts","../src/pi/contract.ts","../src/review/task/task-output.ts","../src/review/task/task-runtime.ts","../src/action/types.ts","../src/action/commands.ts"],"mappings":"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"}