@effect-agent/pr-review 0.1.0-beta.9 → 0.1.0-beta.91

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.
Files changed (59) hide show
  1. package/NOTICE +26 -0
  2. package/README.md +170 -168
  3. package/dist/Review.d.mts +294 -0
  4. package/dist/Review.mjs +702 -0
  5. package/dist/Review.mjs.map +1 -0
  6. package/dist/ReviewRepository-Wd_4qCaO.d.mts +71 -0
  7. package/dist/ReviewRepository.d.mts +2 -0
  8. package/dist/ReviewRepository.mjs +15 -0
  9. package/dist/ReviewRepository.mjs.map +1 -0
  10. package/dist/index.d.mts +3 -717
  11. package/dist/index.mjs +3 -66
  12. package/dist/repository-D7NN3225.mjs +101 -0
  13. package/dist/repository-D7NN3225.mjs.map +1 -0
  14. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  15. package/package.json +1 -54
  16. package/src/Review.ts +1052 -0
  17. package/src/ReviewRepository.ts +9 -0
  18. package/src/index.ts +2 -21
  19. package/src/internal/repository.ts +156 -0
  20. package/dist/action.d.mts +0 -190
  21. package/dist/action.mjs +0 -423
  22. package/dist/action.mjs.map +0 -1
  23. package/dist/cli.d.mts +0 -1
  24. package/dist/cli.mjs +0 -103
  25. package/dist/cli.mjs.map +0 -1
  26. package/dist/fan-out-C6gq3CFg.d.mts +0 -1081
  27. package/dist/github-Lfa_ox-u.mjs +0 -1673
  28. package/dist/github-Lfa_ox-u.mjs.map +0 -1
  29. package/dist/index.mjs.map +0 -1
  30. package/dist/providers-CaOnz7mK.mjs +0 -987
  31. package/dist/providers-CaOnz7mK.mjs.map +0 -1
  32. package/dist/testing.d.mts +0 -131
  33. package/dist/testing.mjs +0 -230
  34. package/dist/testing.mjs.map +0 -1
  35. package/src/action.ts +0 -697
  36. package/src/cli.ts +0 -214
  37. package/src/internal/action-entry.ts +0 -42
  38. package/src/internal/coverage.ts +0 -245
  39. package/src/internal/diff.ts +0 -134
  40. package/src/internal/effort.ts +0 -86
  41. package/src/internal/factory.ts +0 -374
  42. package/src/internal/fan-out-scripted.ts +0 -164
  43. package/src/internal/fan-out.ts +0 -450
  44. package/src/internal/fingerprint.ts +0 -74
  45. package/src/internal/fixtures.ts +0 -131
  46. package/src/internal/github-env.ts +0 -142
  47. package/src/internal/github.ts +0 -761
  48. package/src/internal/ignore.ts +0 -88
  49. package/src/internal/profiles.ts +0 -79
  50. package/src/internal/providers.ts +0 -91
  51. package/src/internal/render.ts +0 -428
  52. package/src/internal/retirement.ts +0 -332
  53. package/src/internal/review-agent.ts +0 -385
  54. package/src/internal/review-state.ts +0 -488
  55. package/src/internal/review-units.ts +0 -167
  56. package/src/internal/run.ts +0 -397
  57. package/src/internal/scripted.ts +0 -108
  58. package/src/internal/source.ts +0 -110
  59. package/src/testing.ts +0 -8
@@ -1 +0,0 @@
1
- {"version":3,"file":"testing.mjs","names":[],"sources":["../src/internal/scripted.ts","../src/internal/fan-out-scripted.ts","../src/internal/fixtures.ts"],"sourcesContent":["import { Effect, Layer, Ref, Schema, Stream } from \"effect\";\nimport { LanguageModel, Model, type Response } from \"effect/unstable/ai\";\n\nimport { CodeReview } from \"./review-agent.ts\";\n\n// ---------------------------------------------------------------------------\n// Deterministic offline model for the flat reviewer: a prompt-aware scripted\n// model that walks the real tool surface — list, diff, read — then returns\n// the scripted review as its terminal JSON. Decisions key on committed\n// history in the prompt, never on call order, so replays stay honest.\n// ---------------------------------------------------------------------------\n\nexport const OFFLINE_LIST_CALL_ID = \"list-1\";\nexport const OFFLINE_DIFF_CALL_ID = \"diff-1\";\nexport const OFFLINE_READ_CALL_ID = \"read-1\";\n\n/** Usage attached to EVERY scripted model turn; tests pin exact aggregates. */\nexport const SCRIPTED_TURN_USAGE = { inputTokens: 64, outputTokens: 48 } as const;\n\nconst scriptedUsage = {\n inputTokens: { total: SCRIPTED_TURN_USAGE.inputTokens },\n outputTokens: { total: SCRIPTED_TURN_USAGE.outputTokens },\n};\n\nexport const scriptedToolTurn = (\n ...calls: ReadonlyArray<Response.StreamPartEncoded>\n): ReadonlyArray<Response.StreamPartEncoded> => [\n ...calls,\n { type: \"finish\", reason: \"tool-calls\", usage: scriptedUsage },\n];\n\nexport const scriptedFinalParts = (text: string): ReadonlyArray<Response.StreamPartEncoded> => [\n { type: \"text-start\", id: \"code-review\" },\n { type: \"text-delta\", id: \"code-review\", delta: text },\n { type: \"text-end\", id: \"code-review\" },\n { type: \"finish\", reason: \"stop\", usage: scriptedUsage },\n];\n\n/** A prompt-keyed scripted LanguageModel with call and prompt observability. */\nexport const makePromptKeyedModel = (\n name: string,\n decide: (promptJson: string) => ReadonlyArray<Response.StreamPartEncoded>,\n) =>\n Effect.gen(function* () {\n const calls = yield* Ref.make(0);\n const prompts = yield* Ref.make<ReadonlyArray<string>>([]);\n const model = Model.make(\n \"scripted\",\n name,\n Layer.effect(\n LanguageModel.LanguageModel,\n LanguageModel.make({\n generateText: () => Effect.succeed([]),\n streamText: (request) =>\n Stream.unwrap(\n Effect.gen(function* () {\n yield* Ref.update(calls, (value) => value + 1);\n const promptJson = JSON.stringify(request.prompt);\n yield* Ref.update(prompts, (previous) => [...previous, promptJson]);\n return Stream.fromIterable(decide(promptJson));\n }),\n ),\n }),\n ),\n );\n return { model, calls: Ref.get(calls), prompts: Ref.get(prompts) };\n });\n\n/**\n * Build the offline scripted reviewer model. Turn 1 lists the changeset,\n * Turn 2 reads one file diff, Turn 3 reads head context, Turn 4 returns the\n * scripted review JSON.\n */\nexport const makeOfflineReviewerModel = (script: {\n readonly diffPath: string;\n readonly readPath: string;\n readonly review: CodeReview;\n}) =>\n makePromptKeyedModel(\"pr-review-offline\", (promptJson) => {\n if (promptJson.includes(OFFLINE_READ_CALL_ID)) {\n return scriptedFinalParts(JSON.stringify(Schema.encodeSync(CodeReview)(script.review)));\n }\n if (promptJson.includes(OFFLINE_DIFF_CALL_ID)) {\n return scriptedToolTurn({\n type: \"tool-call\",\n id: OFFLINE_READ_CALL_ID,\n name: \"read_file\",\n params: { path: script.readPath },\n providerExecuted: false,\n });\n }\n if (promptJson.includes(OFFLINE_LIST_CALL_ID)) {\n return scriptedToolTurn({\n type: \"tool-call\",\n id: OFFLINE_DIFF_CALL_ID,\n name: \"read_file_diff\",\n params: { path: script.diffPath },\n providerExecuted: false,\n });\n }\n return scriptedToolTurn({\n type: \"tool-call\",\n id: OFFLINE_LIST_CALL_ID,\n name: \"list_changed_files\",\n params: { scope: \"all\" },\n providerExecuted: false,\n });\n });\n","import { Effect, Layer, Ref, Schema, Stream } from \"effect\";\nimport { LanguageModel, Model, type Response } from \"effect/unstable/ai\";\n\nimport { FileReviewReport } from \"./fan-out.ts\";\nimport { CodeReview } from \"./review-agent.ts\";\nimport { makePromptKeyedModel, scriptedFinalParts, scriptedToolTurn } from \"./scripted.ts\";\n\n// ---------------------------------------------------------------------------\n// Deterministic offline models for the fan-out reviewer: prompt-keyed\n// scripted models for BOTH the coordinator and the file-reviewer children.\n// Both key every decision on committed history in the prompt (tool-call ids\n// and briefed unit ids), never on call order, so concurrent children and\n// replays stay honest.\n// ---------------------------------------------------------------------------\n\nexport const OFFLINE_UNITS_CALL_ID = \"units-1\";\n\n/** The delegation Tool Call id the scripted coordinator uses for one unit. */\nexport const offlineUnitCallId = (unitId: string): string => `delegate-${unitId}`;\n\n/** The diff Tool Call id the scripted child uses for one unit. */\nexport const offlineChildDiffCallId = (unitId: string): string => `fanout-diff-${unitId}`;\n\n/** One scripted delegation the offline coordinator declares. */\nexport interface OfflineUnitCall {\n readonly unitId: string;\n readonly paths: ReadonlyArray<string>;\n}\n\n/**\n * Build the offline scripted coordinator model. Turn 1 lists the review\n * units, Turn 2 declares one delegation Tool Call per scripted unit in one\n * batch, Turn 3 returns the scripted merged review JSON. Decisions key on\n * tool-call ids already committed to the prompt.\n */\nexport const makeOfflineFanOutCoordinatorModel = (script: {\n readonly unitCalls: ReadonlyArray<OfflineUnitCall>;\n readonly review: CodeReview;\n}) => {\n const firstUnitCallId = offlineUnitCallId(script.unitCalls[0]?.unitId ?? \"unit-none\");\n return makePromptKeyedModel(\"pr-fanout-coordinator-offline\", (promptJson) => {\n if (promptJson.includes(firstUnitCallId)) {\n return scriptedFinalParts(JSON.stringify(Schema.encodeSync(CodeReview)(script.review)));\n }\n if (promptJson.includes(OFFLINE_UNITS_CALL_ID)) {\n return scriptedToolTurn(\n ...script.unitCalls.map(\n (unit): Response.StreamPartEncoded => ({\n type: \"tool-call\",\n id: offlineUnitCallId(unit.unitId),\n name: \"delegate_file_review\",\n params: { unitId: unit.unitId, paths: unit.paths },\n providerExecuted: false,\n }),\n ),\n );\n }\n return scriptedToolTurn({\n type: \"tool-call\",\n id: OFFLINE_UNITS_CALL_ID,\n name: \"list_review_units\",\n params: { scope: \"all\" },\n providerExecuted: false,\n });\n });\n};\n\n/** How one scripted child behaves for its briefed unit. */\nexport type OfflineUnitOutcome =\n /** Read one diff, then return the scripted report. */\n | { readonly _tag: \"findings\"; readonly report: FileReviewReport }\n /** Read one diff, then return non-JSON — the child fails typed (AgentOutputError). */\n | { readonly _tag: \"malformed-output\" }\n /**\n * Declare more Tool Calls than the child's AgentPolicy allows in one turn —\n * none executes and the child fails typed (AgentPolicyError \"tool-calls\",\n * the reviewer's deliberate `onExhaustion: \"fail\"` pin).\n */\n | { readonly _tag: \"budget-runaway\"; readonly declaredCalls: number };\n\nexport interface OfflineUnitScript {\n readonly unitId: string;\n /** The one file the scripted child reads the diff of. */\n readonly diffPath: string;\n readonly outcome: OfflineUnitOutcome;\n}\n\n/**\n * Build the offline scripted file-reviewer model shared by every delegated\n * child. Each child Run builds the Model Layer inside its own scope; the\n * script entry is selected by the briefed unitId present in the child's OWN\n * prompt, and the turn is selected by whether that unit's diff Tool Call id\n * is already committed there — content-keyed on both axes, so concurrent\n * children never interfere. First-turn child prompts are recorded for\n * context-isolation assertions.\n */\nexport const makeOfflineFileReviewerModel = (scripts: ReadonlyArray<OfflineUnitScript>) =>\n Effect.gen(function* () {\n const calls = yield* Ref.make(0);\n const prompts = yield* Ref.make<ReadonlyArray<string>>([]);\n const decide = (promptJson: string): ReadonlyArray<Response.StreamPartEncoded> | undefined => {\n const script = scripts.find((candidate) => promptJson.includes(candidate.unitId));\n if (script === undefined) return undefined;\n switch (script.outcome._tag) {\n case \"budget-runaway\": {\n return scriptedToolTurn(\n ...Array.from(\n { length: script.outcome.declaredCalls },\n (_, index): Response.StreamPartEncoded => ({\n type: \"tool-call\",\n id: `runaway-${script.unitId}-${index + 1}`,\n name: \"read_file_diff\",\n params: { path: script.diffPath },\n providerExecuted: false,\n }),\n ),\n );\n }\n case \"malformed-output\":\n case \"findings\": {\n if (promptJson.includes(offlineChildDiffCallId(script.unitId))) {\n return scriptedFinalParts(\n script.outcome._tag === \"findings\"\n ? JSON.stringify(Schema.encodeSync(FileReviewReport)(script.outcome.report))\n : \"this is not the JSON you are looking for\",\n );\n }\n return scriptedToolTurn({\n type: \"tool-call\",\n id: offlineChildDiffCallId(script.unitId),\n name: \"read_file_diff\",\n params: { path: script.diffPath },\n providerExecuted: false,\n });\n }\n }\n };\n const model = Model.make(\n \"scripted\",\n \"pr-fanout-file-reviewer-offline\",\n Layer.effect(\n LanguageModel.LanguageModel,\n LanguageModel.make({\n generateText: () => Effect.succeed([]),\n streamText: (request) =>\n Stream.unwrap(\n Effect.gen(function* () {\n yield* Ref.update(calls, (value) => value + 1);\n const promptJson = JSON.stringify(request.prompt);\n yield* Ref.update(prompts, (previous) => [...previous, promptJson]);\n const parts = decide(promptJson);\n if (parts === undefined) {\n return yield* Effect.die(\n new Error(\"The child prompt names no scripted review unit\"),\n );\n }\n return Stream.fromIterable(parts);\n }),\n ),\n }),\n ),\n );\n return { model, calls: Ref.get(calls), prompts: Ref.get(prompts) };\n });\n","import { DateTime, Effect, Layer, Option, Ref, Schema } from \"effect\";\n\nimport { ChangedFile } from \"./diff.ts\";\nimport {\n PriorReviewLookupFailure,\n PriorReviews,\n PublishedReview,\n ReviewPublisher,\n} from \"./github.ts\";\nimport type { ReviewPublicationPlan } from \"./render.ts\";\nimport type { ReviewHeadComparison, ReviewState } from \"./review-state.ts\";\nimport {\n MAX_CHANGED_FILES,\n MAX_FILE_CHARS,\n normalizeRepoRelativePath,\n PullRequestMetadata,\n PullRequestSource,\n ReviewInputViolation,\n} from \"./source.ts\";\n\n// ---------------------------------------------------------------------------\n// Deterministic in-memory adapters for both ports: a fixture pull request\n// serving the PullRequestSource, and a collecting ReviewPublisher recording\n// every plan. Tests, dry runs, and live smokes run against these with no\n// network and no credentials.\n// ---------------------------------------------------------------------------\n\n/** One fixture file: its changeset entry plus optional head content. */\nexport class FixtureFile extends Schema.Class<FixtureFile>(\"@effect-agent/pr-review/FixtureFile\")({\n file: ChangedFile,\n headContent: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(MAX_FILE_CHARS))),\n}) {}\n\n/** A complete in-memory pull request for tests, dry runs, and live smokes. */\nexport class FixturePullRequest extends Schema.Class<FixturePullRequest>(\n \"@effect-agent/pr-review/FixturePullRequest\",\n)({\n metadata: PullRequestMetadata,\n files: Schema.Array(FixtureFile).check(Schema.isMaxLength(MAX_CHANGED_FILES)),\n}) {}\n\nconst requireChanged = (\n fixture: FixturePullRequest,\n path: string,\n): Effect.Effect<FixtureFile, ReviewInputViolation> => {\n const entry = fixture.files.find((candidate) => candidate.file.path === path);\n return entry === undefined\n ? Effect.fail(\n ReviewInputViolation.make({\n input: path,\n reason: \"Path is not part of this pull request's changeset.\",\n }),\n )\n : Effect.succeed(entry);\n};\n\n/** Deterministic `PullRequestSource` over one fixture pull request. */\nexport const fixturePullRequestSourceLayer = (\n fixture: FixturePullRequest,\n): Layer.Layer<PullRequestSource> =>\n Layer.succeed(PullRequestSource)(\n PullRequestSource.of({\n metadata: Effect.succeed(fixture.metadata),\n changedFiles: Effect.succeed(fixture.files.map((entry) => entry.file)),\n anchorFiles: Effect.succeed(fixture.files.map((entry) => entry.file)),\n readFile: (path) =>\n Effect.gen(function* () {\n const relative = yield* normalizeRepoRelativePath(path);\n const entry = yield* requireChanged(fixture, relative);\n if (entry.headContent === undefined) {\n return yield* ReviewInputViolation.make({\n input: relative,\n reason: \"No head content is available for this file.\",\n });\n }\n return entry.headContent;\n }),\n }),\n );\n\n/** In-memory publisher: records every plan and mints a deterministic receipt. */\nexport const collectingReviewPublisherLayer = (\n published: Ref.Ref<ReadonlyArray<ReviewPublicationPlan>>,\n): Layer.Layer<ReviewPublisher> =>\n Layer.succeed(ReviewPublisher)(\n ReviewPublisher.of({\n publish: (plan) =>\n Ref.update(published, (plans) => [...plans, plan]).pipe(\n Effect.flatMap(() => Ref.get(published)),\n Effect.map((plans) =>\n PublishedReview.make({\n reviewId: plans.length,\n url: `memory://review/${plans.length}`,\n event: plan.event,\n inlineComments: plan.comments.length,\n authorNodeId: \"BOT_memory-reviewer\",\n submittedAt: DateTime.makeUnsafe(\n `2026-01-01T00:00:${String(plans.length).padStart(2, \"0\")}Z`,\n ),\n }),\n ),\n ),\n }),\n );\n\n/** Static `PriorReviews` service for tests: fixed history and comparisons. */\nexport const staticPriorReviews = (\n fingerprint: Option.Option<string>,\n options: {\n readonly state?: Option.Option<ReviewState> | undefined;\n readonly comparison?: ReviewHeadComparison | undefined;\n } = {},\n): PriorReviews[\"Service\"] =>\n PriorReviews.of({\n latestFingerprint: Effect.succeed(fingerprint),\n latestState: Effect.succeed(options.state ?? Option.none()),\n compareHeads: () =>\n options.comparison === undefined\n ? Effect.fail(PriorReviewLookupFailure.make({ reason: \"no fixture comparison\" }))\n : Effect.succeed(options.comparison),\n });\n\n/** Layer form for consumers whose Effect explicitly requires `PriorReviews`. */\nexport const staticPriorReviewsLayer = (\n fingerprint: Option.Option<string>,\n options: {\n readonly state?: Option.Option<ReviewState> | undefined;\n readonly comparison?: ReviewHeadComparison | undefined;\n } = {},\n): Layer.Layer<PriorReviews> =>\n Layer.succeed(PriorReviews)(staticPriorReviews(fingerprint, options));\n"],"mappings":"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"}