{
  "version": 3,
  "sources": ["../../../../node_modules/@sniptt/guards/lib/guards/primitives.ts", "../../../../node_modules/@sniptt/guards/lib/guards/structural.ts", "../../../../node_modules/@sniptt/guards/lib/guards/convenience.ts", "../../../../node_modules/@sniptt/guards/lib/index.ts", "twenty-sdk-define-stub:__twenty-sdk-define-stub__", "../../../../src/constants/universal-identifiers.ts", "../../../../src/logic-functions/handlers/ai-review-contract.ts", "../../../../src/constants/messages.ts", "../../../../src/constants/payment-terms.ts", "../../../../src/logic-functions/utils/build-note-markdown.ts", "../../../../src/utils/is-defined.ts", "../../../../src/logic-functions/utils/run-core-graphql.ts", "../../../../src/logic-functions/utils/close-previous-review-tasks.ts", "../../../../src/logic-functions/utils/create-approval-decision.ts", "../../../../src/logic-functions/utils/create-note.ts", "../../../../src/logic-functions/utils/create-task.ts", "../../../../src/logic-functions/utils/detect-document-format.ts", "../../../../src/logic-functions/utils/read-compound-file.ts", "../../../../src/logic-functions/utils/xml-to-text.ts", "../../../../src/logic-functions/utils/extract-doc-text.ts", "../../../../src/logic-functions/utils/read-zip-entry.ts", "../../../../src/logic-functions/utils/extract-docx-text.ts", "../../../../src/logic-functions/utils/extract-rtf-text.ts", "../../../../src/logic-functions/utils/extract-document-text.ts", "../../../../src/logic-functions/utils/fetch-attachment-bytes.ts", "../../../../src/logic-functions/utils/get-llm-api-key.ts", "../../../../src/logic-functions/utils/get-llm-model.ts", "../../../../src/constants/llm-model.ts", "../../../../src/logic-functions/utils/now-iso.ts", "../../../../src/logic-functions/utils/parse-ai-review.ts", "../../../../src/logic-functions/utils/pays-in-installments.ts", "../../../../src/logic-functions/utils/read-contract.ts", "../../../../src/logic-functions/utils/resolve-payment-terms.ts", "../../../../src/logic-functions/utils/build-review-prompt.ts", "../../../../src/logic-functions/utils/request-llm-review.ts", "../../../../src/logic-functions/utils/select-contract-attachment.ts", "../../../../src/logic-functions/utils/update-contract.ts", "../../../../src/utils/prune-undefined.ts", "../../../../src/logic-functions/utils/route-input.ts", "../../../../src/logic-functions/ai-review.function.ts"],
  "sourcesContent": [null, null, null, null, "\n// Auto-generated stub for twenty-sdk/define injected by the SDK CLI build.\n// Real implementations would pull in zod, twenty-shared and ~1MB of code; at\n// runtime only `default.config.handler` is consumed, so tiny no-ops suffice.\nconst __defineFactoryStub = (config) => ({\n  success: true,\n  config,\n  errors: [],\n});\n\nconst __anyHandler = {\n  get(_target, prop) {\n    if (prop === '__esModule') return true;\n    if (prop === Symbol.toPrimitive) return () => '';\n    if (typeof prop === 'symbol') return undefined;\n    return new Proxy(() => undefined, __anyHandler);\n  },\n  apply() {\n    return new Proxy(() => undefined, __anyHandler);\n  },\n};\nconst __anyStub = new Proxy(() => undefined, __anyHandler);\n\nexport const createValidationResult = __defineFactoryStub;\nexport const defineAgent = __defineFactoryStub;\nexport const defineApplication = __defineFactoryStub;\nexport const defineApplicationRole = __defineFactoryStub;\nexport const defineCommandMenuItem = __defineFactoryStub;\nexport const defineConnectionProvider = __defineFactoryStub;\nexport const defineField = __defineFactoryStub;\nexport const defineFrontComponent = __defineFactoryStub;\nexport const defineIndex = __defineFactoryStub;\nexport const defineLogicFunction = __defineFactoryStub;\nexport const defineNavigationMenuItem = __defineFactoryStub;\nexport const defineObject = __defineFactoryStub;\nexport const definePageLayout = __defineFactoryStub;\nexport const definePageLayoutTab = __defineFactoryStub;\nexport const definePermissionFlag = __defineFactoryStub;\nexport const definePostInstallLogicFunction = __defineFactoryStub;\nexport const definePreInstallLogicFunction = __defineFactoryStub;\nexport const defineRole = __defineFactoryStub;\nexport const defineSettingsFrontComponent = __defineFactoryStub;\nexport const defineSkill = __defineFactoryStub;\nexport const defineUninstallLogicFunction = __defineFactoryStub;\nexport const defineView = __defineFactoryStub;\nexport const defineViewField = __defineFactoryStub;\nexport const AggregateOperations = __anyStub;\nexport const DateDisplayFormat = __anyStub;\nexport const FieldMetadataSettingsOnClickAction = __anyStub;\nexport const FieldType = __anyStub;\nexport const HTTPMethod = __anyStub;\nexport const NavigationMenuItemType = __anyStub;\nexport const NumberDataType = __anyStub;\nexport const ObjectRecordGroupByDateGranularity = __anyStub;\nexport const OnDeleteAction = __anyStub;\nexport const PageLayoutTabLayoutMode = __anyStub;\nexport const PageLayoutType = __anyStub;\nexport const RelationType = __anyStub;\nexport const RowLevelPermissionPredicateGroupLogicalOperator = __anyStub;\nexport const RowLevelPermissionPredicateOperand = __anyStub;\nexport const STANDARD_OBJECT = __anyStub;\nexport const STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS = __anyStub;\nexport const STANDARD_PAGE_LAYOUT = __anyStub;\nexport const STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS = __anyStub;\nexport const SystemPermissionFlag = __anyStub;\nexport const ViewCalendarLayout = __anyStub;\nexport const ViewFilterGroupLogicalOperator = __anyStub;\nexport const ViewFilterOperand = __anyStub;\nexport const ViewKey = __anyStub;\nexport const ViewOpenRecordIn = __anyStub;\nexport const ViewSortDirection = __anyStub;\nexport const ViewType = __anyStub;\nexport const ViewVisibility = __anyStub;\nexport const canAccessFullAdminPanel = __anyStub;\nexport const canImpersonate = __anyStub;\nexport const every = __anyStub;\nexport const everyDefined = __anyStub;\nexport const everyEquals = __anyStub;\nexport const favoriteRecordIds = __anyStub;\nexport const featureFlags = __anyStub;\nexport const getFieldUniversalIdentifier = __anyStub;\nexport const getSystemRelationFieldUniversalIdentifier = __anyStub;\nexport const getSystemViewFieldUniversalIdentifier = __anyStub;\nexport const getSystemViewUniversalIdentifier = __anyStub;\nexport const hasAnySoftDeleteFilterOnView = __anyStub;\nexport const includes = __anyStub;\nexport const includesEvery = __anyStub;\nexport const isDashboardPageLayoutInEditMode = __anyStub;\nexport const isDefined = __anyStub;\nexport const isInSidePanel = __anyStub;\nexport const isLayoutCustomizationModeEnabled = __anyStub;\nexport const isNonEmptyString = __anyStub;\nexport const isSelectAll = __anyStub;\nexport const none = __anyStub;\nexport const noneDefined = __anyStub;\nexport const noneEquals = __anyStub;\nexport const numberOfSelectedRecords = __anyStub;\nexport const objectMetadataItem = __anyStub;\nexport const objectMetadataLabel = __anyStub;\nexport const objectPermissions = __anyStub;\nexport const pageType = __anyStub;\nexport const selectedRecords = __anyStub;\nexport const some = __anyStub;\nexport const someDefined = __anyStub;\nexport const someEquals = __anyStub;\nexport const someNonEmptyString = __anyStub;\nexport const targetObjectReadPermissions = __anyStub;\nexport const targetObjectWritePermissions = __anyStub;\nexport const validateFields = __anyStub;\n", "// Auto-generated by scripts/generate-universal-identifiers.mjs.\n// Every identifier is a freshly generated UUID to avoid collisions with other\n// installed apps. Regenerate with: node scripts/generate-universal-identifiers.mjs\n\nexport const APPLICATION_UNIVERSAL_IDENTIFIER =\n  'e18866a9-afd0-440a-9855-1e7e9e693a74';\n\nexport const DEFAULT_ROLE_UNIVERSAL_IDENTIFIER =\n  '77fda223-b7a9-4f4a-844e-4a475f2adf0c';\n\nexport const GERENTE_SOCIO_ROLE_UNIVERSAL_IDENTIFIER =\n  '4f7a44cc-05c0-40c9-b833-ea335199959c';\n\nexport const APPLICATION_VARIABLE_UNIVERSAL_IDENTIFIERS = {\n  anthropicApiKey: \"2f9824be-df6f-4065-aa4e-a8313d201ef8\",\n  llmModel: \"43bc75b0-ef4c-42ec-848e-35297e90364e\"\n} as const;\n\nexport const OBJECT_UNIVERSAL_IDENTIFIERS = {\n  contract: \"45a32a16-21a5-4142-ad6b-7949cacad591\",\n  approvalDecision: \"6e6de038-df90-4dc3-a1bd-fb9c15b98308\"\n} as const;\n\nexport const CONTRACT_FIELD_UNIVERSAL_IDENTIFIERS = {\n  name: \"08a4f050-7c85-463e-9aa4-009d0213ba05\",\n  paymentTermsCustomer: \"df60b392-c2bf-4460-a3ba-9846a7da98f7\",\n  paymentTermsSupplier: \"94443e7c-c83e-4542-93f7-63dad2207a75\",\n  status: \"128da9a5-ffba-4310-9792-5be2805de9f5\",\n  aiReviewSummary: \"e1b7f3eb-eadf-4644-92d4-ef44954ef179\",\n  aiFindings: \"acb5962d-1072-4791-89e8-2d0158db386b\",\n  aiPaymentMismatch: \"2223a01a-25a1-4c2d-a13e-6044bfc3df62\",\n  aiPaymentTermsSnapshot: \"7b1c9d24-3f68-4a05-9e13-c4d2a86f5b70\",\n  submittedAt: \"324d19ae-98c7-4c1c-ae81-258619222ec7\",\n  decidedAt: \"e330567f-d443-4d21-ad7a-307576da6e19\",\n  opportunity: \"8abe646d-41d4-483d-8f22-09859a1bce26\",\n  approver: \"cd548383-5560-4b90-a8ac-fb88f6483fe2\",\n  submittedBy: \"9288433a-6972-4a3f-b7d2-5bbf655ad0c2\",\n  approvalDecisions: \"f2754979-61fa-45eb-aefb-aa9ede9a73ef\"\n} as const;\n\nexport const CONTRACT_SELECT_OPTION_UNIVERSAL_IDENTIFIERS = {\n  status: {\n    draft: \"fd147573-5cd0-455d-9c1d-5a1f1f3dd5b3\",\n    pendingAiReview: \"3dea697a-77f4-49d4-aa44-f5d8662d260b\",\n    pendingManagerApproval: \"fbc4bab6-17ce-4544-a21d-aeb1d92d83ec\",\n    approved: \"660dce9e-d054-462a-b50f-0335d54446f1\",\n    rejected: \"7292e345-7d05-4564-8a56-8378f1359c96\"\n  },\n  aiPaymentMismatch: {\n    unknown: \"16a115a7-7b44-4073-9715-89203605470b\",\n    match: \"55247810-5361-4a18-b094-84e3f1191a79\",\n    mismatch: \"e783ade0-e7e9-42d4-89d9-68944eacdd61\"\n  }\n} as const;\n\nexport const APPROVAL_DECISION_FIELD_UNIVERSAL_IDENTIFIERS = {\n  name: \"80cd5548-93db-43eb-b3c3-953572e973fe\",\n  decision: \"e8769cd6-4e43-43bd-86c9-18ed19d8e3c2\",\n  comment: \"e8263f3c-29c2-4fb9-b9e8-43e2a68dbdd2\",\n  decidedAt: \"becbc35b-dd19-4ca2-bbc7-801a65118abf\",\n  contract: \"b949d9af-6b11-4ff3-8a76-7862bf90ceae\",\n  decidedBy: \"d554d5c1-48d4-4ee8-879d-bb7fe11fe925\"\n} as const;\n\nexport const APPROVAL_DECISION_SELECT_OPTION_UNIVERSAL_IDENTIFIERS = {\n  decision: {\n    approve: \"35ff0df0-202b-4abd-8264-98834c48c502\",\n    reject: \"cbb44164-7e65-468f-98ab-788315c77db1\"\n  }\n} as const;\n\nexport const STANDARD_REVERSE_FIELD_UNIVERSAL_IDENTIFIERS = {\n  opportunityContracts: \"0a9f9101-7093-4ef8-8087-671964f5b642\",\n  workspaceMemberApprovedContracts: \"7dde2294-c596-4234-8aff-54e28af08a1c\",\n  workspaceMemberSubmittedContracts: \"310b6c4e-22ab-4af5-bfc0-caf059128bf5\",\n  workspaceMemberApprovalDecisions: \"67718dfb-37a1-46a6-961a-ec5d48a36c5f\"\n} as const;\n\nexport const LOGIC_FUNCTION_CONSTANTS = {\n  aiReview: {\n    universalIdentifier: \"7e4b41b4-a567-40d5-ac4f-af230e1fb198\",\n    path: \"/contract-approval/ai-review\"\n  },\n  submitForReview: {\n    universalIdentifier: \"db02d2d0-85e9-4d97-a5cc-282d9ee0ca5f\",\n    path: \"/contract-approval/submit-for-review\"\n  },\n  recordDecision: {\n    universalIdentifier: \"6cf39b95-7065-4158-93b2-d4f954ed69ab\",\n    path: \"/contract-approval/record-decision\"\n  },\n  postInstall: {\n    universalIdentifier: \"65b60977-844a-4230-aacc-0dff6e2eb69d\"\n  }\n} as const;\n\nexport const FRONT_COMPONENT_UNIVERSAL_IDENTIFIERS = {\n  approve: \"146f44e2-164f-4173-8e42-11095c71455a\",\n  reject: \"cd900b9d-6fed-40e8-b725-bfddd9fc350a\",\n  submitForReview: \"0c35bc5e-7a5c-475d-a2c2-9eff530dc0a0\"\n} as const;\n\nexport const COMMAND_MENU_ITEM_UNIVERSAL_IDENTIFIERS = {\n  approve: \"4daf5c53-8a72-44ea-8e1a-0ca5b64ca844\",\n  reject: \"c341b153-c8c2-4226-96b5-4b8c1b2fc84e\",\n  submitForReview: \"af85127b-54be-4812-946f-bca6ce3c9fbd\"\n} as const;\n\nexport const VIEW_UNIVERSAL_IDENTIFIERS = {\n  pendingApprovals: \"a89136c8-e306-4416-b23f-ae8d499ef25e\"\n} as const;\n\n// Added 2026-07-15 for the UI enhancements (nav item, risk-level chip, Opportunity tab).\nexport const NAVIGATION_MENU_ITEM_UNIVERSAL_IDENTIFIERS = {\n  contracts: \"979e246d-fac3-4098-bcad-24f77d065f57\",\n  pendingApprovalsView: \"983b3173-3401-440b-af22-8bee5e31d7a1\"\n} as const;\n\nexport const CONTRACT_RISK_LEVEL_FIELD_UNIVERSAL_IDENTIFIER =\n  \"40bb9271-9f33-4e52-b4b6-91cc58a412dc\";\n\nexport const CONTRACT_RISK_LEVEL_OPTION_UNIVERSAL_IDENTIFIERS = {\n  verde: \"98306cd9-e9cb-43fb-8a35-f2d1c8ce8d51\",\n  amarelo: \"4f64ec67-7b70-43d4-812a-1631964eb1b1\",\n  vermelho: \"029e55fa-61fb-480f-b8f5-a585388da4e9\"\n} as const;\n\n// Adds the reverse Opportunity -> Contracts relation to the Opportunity record\n// page's Relations group.\nexport const OPPORTUNITY_CONTRACTS_VIEW_FIELD_UNIVERSAL_IDENTIFIER =\n  \"6f2d9f81-2bf7-4030-af1e-0fffe3468793\";\n\nexport const CONTRACT_RISK_LEVEL_VIEW_FIELD_UNIVERSAL_IDENTIFIER =\n  \"77b79f8d-d365-4068-a88d-96f1a0a6941e\";\n\n// Added 2026-07-29 for renewal tracking (vig\u00EAncia + est\u00E1gio de renova\u00E7\u00E3o).\n//\n// IMPORTANT: unlike every other identifier in this file, these are NOT freshly\n// generated. They are pinned to the field/option identifiers that already exist\n// in the production workspace, where the fields were first created outside the\n// app (under the workspace's own application). Regenerating them would make the\n// deploy try to create a second `dataInicio`/`dataTermino`/`estagioRenovacao`\n// on Contract, which collides on the (object, name) uniqueness constraint.\n// Do not replace these with new UUIDs \u2014 see README \"Renewal tracking\".\nexport const CONTRACT_RENEWAL_FIELD_UNIVERSAL_IDENTIFIERS = {\n  dataInicio: '18dd3809-2832-484a-87b6-c0a74bf70c56',\n  dataTermino: '28eb43b7-fcfb-4259-a894-cef533ba2292',\n  estagioRenovacao: '83f2704a-bb13-4dd9-9bf2-ec792ba800b3',\n} as const;\n\nexport const CONTRACT_RENEWAL_STAGE_OPTION_UNIVERSAL_IDENTIFIERS = {\n  ativo: 'f3f27751-d3ea-4d1b-b2db-4d36179125f3',\n  renovacaoIniciada: '7517bf3d-b13e-4fa3-b199-b2280fe30267',\n  renovado: '5a7e5049-d115-4bb3-84b0-941b00c85f8d',\n  encerrado: '44755541-0569-418d-997c-8fcdb0025d2c',\n} as const;\n\nexport const VIEW_FIELD_UNIVERSAL_IDENTIFIERS = {\n  pendingApprovals: [\n    \"91bff7b8-d653-4e55-b46a-e1897dd1cc7b\",\n    \"deba2d27-b7e2-43c2-9ae6-f373f963b79f\",\n    \"cafed141-82dc-4bed-a039-4f54786f5f97\",\n    \"229831ac-f972-435a-87ac-ec3fa90cfe7e\",\n    \"f1ab3513-d8e6-4fe3-80af-dec9dcf67447\",\n    \"e342b6e0-9699-43d0-a4ae-b4cd139a6e6c\",\n    \"f91c99ea-0a38-4eed-a5ec-dbe7c3440ca3\",\n    \"ed138b74-a407-4c29-86bd-d8acd69340ef\",\n    \"762f5269-1d9b-4ce3-a417-5b26c257f3ad\"\n  ]\n} as const;\n", "import { CoreApiClient } from 'twenty-client-sdk/core';\n\nimport {\n  AI_REVIEW_FAILED_PREFIX,\n  CONTRACT_NOT_FOUND_ERROR,\n  LLM_NOT_CONFIGURED_SUMMARY,\n} from 'src/constants/messages';\nimport { DEFAULT_SUPPLIER_PAYMENT_TERMS } from 'src/constants/payment-terms';\nimport {\n  buildFindingTaskMarkdown,\n  buildReviewNoteMarkdown,\n} from 'src/logic-functions/utils/build-note-markdown';\nimport { closePreviousReviewTasks } from 'src/logic-functions/utils/close-previous-review-tasks';\nimport { createApprovalDecision } from 'src/logic-functions/utils/create-approval-decision';\nimport { createContractNote } from 'src/logic-functions/utils/create-note';\nimport { createContractTask } from 'src/logic-functions/utils/create-task';\nimport { type ReviewDocumentSource } from 'src/logic-functions/utils/build-review-prompt';\nimport { extractDocument } from 'src/logic-functions/utils/extract-document-text';\nimport { fetchAttachmentBytes } from 'src/logic-functions/utils/fetch-attachment-bytes';\nimport { getLlmApiKey } from 'src/logic-functions/utils/get-llm-api-key';\nimport { getLlmModel } from 'src/logic-functions/utils/get-llm-model';\nimport { nowIso } from 'src/logic-functions/utils/now-iso';\nimport { parseAiReview } from 'src/logic-functions/utils/parse-ai-review';\nimport { paysInInstallments } from 'src/logic-functions/utils/pays-in-installments';\nimport { readContract } from 'src/logic-functions/utils/read-contract';\nimport {\n  parsePaymentTermsSnapshot,\n  resolvePaymentTerm,\n  serializePaymentTermsSnapshot,\n} from 'src/logic-functions/utils/resolve-payment-terms';\nimport { requestLlmReview } from 'src/logic-functions/utils/request-llm-review';\nimport { selectContractAttachment } from 'src/logic-functions/utils/select-contract-attachment';\nimport { updateContract } from 'src/logic-functions/utils/update-contract';\nimport { type ContractRecord } from 'src/types/attachment-node';\nimport {\n  type AiReviewInput,\n  type AiReviewOutcome,\n} from 'src/types/logic-function-io';\nimport { isDefined } from 'src/utils/is-defined';\nimport { pruneUndefined } from 'src/utils/prune-undefined';\n\ntype FetchImpl = typeof fetch;\n\n// Mirrors what the Approve/Reject command records, for a decision made by\n// editing the Status field. Idempotent: the app's own status write re-fires the\n// database event, and a contract that already carries decidedAt is left alone.\nconst stampDecisionIfNeeded = async (\n  contract: ContractRecord,\n): Promise<boolean> => {\n  const isDecision =\n    contract.status === 'APPROVED' || contract.status === 'REJECTED';\n\n  if (!isDecision || isDefined(contract.decidedAt)) {\n    return false;\n  }\n\n  const decidedAt = nowIso();\n  const decision = contract.status === 'APPROVED' ? 'APPROVE' : 'REJECT';\n  const decidedById =\n    contract.approverId ?? contract.lastEditorWorkspaceMemberId ?? undefined;\n\n  await createApprovalDecision({\n    data: pruneUndefined({\n      name: `${contract.status === 'APPROVED' ? 'Approved' : 'Rejected'} @ ${decidedAt}`,\n      decision,\n      comment: 'Registrado automaticamente: decis\u00E3o feita pelo campo Status.',\n      decidedAt,\n      contractId: contract.id,\n      decidedById,\n    }),\n  }).catch(() => undefined);\n\n  await updateContract({\n    contractId: contract.id,\n    data: pruneUndefined({ decidedAt, approverId: decidedById }),\n  });\n\n  return true;\n};\n\nexport const aiReviewContractCore = async ({\n  input,\n  client = new CoreApiClient(),\n  fetchImpl,\n  sleep,\n}: {\n  input: AiReviewInput;\n  client?: CoreApiClient;\n  fetchImpl?: FetchImpl;\n  sleep?: (ms: number) => Promise<void>;\n}): Promise<AiReviewOutcome> => {\n  const contractId = input.recordId;\n\n  const contract = await readContract({ contractId });\n\n  if (!isDefined(contract)) {\n    return {\n      success: false,\n      recordId: contractId,\n      llmConfigured: isDefined(getLlmApiKey()),\n      message: CONTRACT_NOT_FOUND_ERROR,\n    };\n  }\n\n  // Only review a contract actually awaiting AI review. This keeps the\n  // DATABASE_EVENT trigger idempotent \u2014 the status update this function makes at\n  // the end re-fires contract.updated, which then no-ops here \u2014 and skips\n  // unrelated status changes (approved/rejected/etc.).\n  if (contract.status !== 'PENDING_AI_REVIEW') {\n    // A manager who approves by editing the Status field instead of using the\n    // Approve command would otherwise leave no trail at all. Stamp the same\n    // audit fields the command writes, attributing it to whoever made the edit.\n    const stamped = await stampDecisionIfNeeded(contract);\n\n    return {\n      success: true,\n      recordId: contractId,\n      status: contract.status ?? undefined,\n      llmConfigured: isDefined(getLlmApiKey()),\n      message: stamped\n        ? `Recorded ${contract.status} decision made by editing the status field.`\n        : `Skipped: contract status is ${\n            contract.status ?? 'unknown'\n          } (not pending AI review).`,\n    };\n  }\n\n  // Same gap on the way in: setting the status by hand triggers this review but\n  // never stamps who submitted it or when.\n  if (!isDefined(contract.submittedAt)) {\n    await updateContract({\n      contractId,\n      data: pruneUndefined({\n        submittedAt: nowIso(),\n        submittedById: contract.lastEditorWorkspaceMemberId ?? undefined,\n      }),\n    });\n  }\n\n  const apiKey = getLlmApiKey();\n\n  // No-key path: advance to manager approval so the contract is discoverable in\n  // the pending-approvals view for manual review, and record why the automatic\n  // AI review did not run.\n  if (!isDefined(apiKey)) {\n    await updateContract({\n      contractId,\n      data: {\n        aiReviewSummary: LLM_NOT_CONFIGURED_SUMMARY,\n        status: 'PENDING_MANAGER_APPROVAL',\n      },\n    });\n\n    return {\n      success: true,\n      recordId: contractId,\n      status: 'PENDING_MANAGER_APPROVAL',\n      llmConfigured: false,\n      message: 'ANTHROPIC_API_KEY is not configured; skipped AI review.',\n    };\n  }\n\n  const resolvedAttachment = selectContractAttachment(contract.attachments);\n  let pdfBase64: string | undefined;\n  let documentText: string | undefined;\n  // Why the review ran without the contract file, when that happens. Surfaced in\n  // the summary so a manager never mistakes a fields-only review for a full one.\n  let attachmentWarning: string | undefined;\n\n  if (isDefined(resolvedAttachment)) {\n    try {\n      const bytes = await fetchAttachmentBytes({\n        url: resolvedAttachment.url,\n        fetchImpl,\n      });\n      const extracted = extractDocument(bytes);\n\n      if (extracted.kind === 'pdf') {\n        pdfBase64 = extracted.base64;\n      } else if (extracted.kind === 'text') {\n        documentText = extracted.text;\n      } else {\n        attachmentWarning = extracted.reason;\n      }\n    } catch (error) {\n      attachmentWarning = `N\u00E3o foi poss\u00EDvel baixar o arquivo do contrato: ${\n        error instanceof Error ? error.message : String(error)\n      }`;\n    }\n  }\n\n  const documentSource: ReviewDocumentSource = isDefined(pdfBase64)\n    ? 'pdf'\n    : isDefined(documentText)\n      ? 'text'\n      : 'none';\n\n  // On an LLM/parse failure, do not strand the contract in pending_ai_review:\n  // record the failure and still advance to manager approval so a human can act.\n  let review;\n  try {\n    const raw = await requestLlmReview({\n      apiKey,\n      model: getLlmModel(),\n      pdfBase64,\n      documentText,\n      context: {\n        contractName: contract.name,\n        paymentTermsCustomer: contract.paymentTermsCustomer,\n        paymentTermsSupplier: contract.paymentTermsSupplier,\n        documentSource,\n      },\n      fetchImpl,\n      sleep,\n    });\n\n    review = parseAiReview(raw);\n  } catch (error) {\n    const detail = error instanceof Error ? error.message : String(error);\n\n    await updateContract({\n      contractId,\n      data: {\n        aiReviewSummary: `${AI_REVIEW_FAILED_PREFIX}: ${detail}. This contract awaits manual manager review.`,\n        status: 'PENDING_MANAGER_APPROVAL',\n      },\n    });\n\n    return {\n      success: false,\n      recordId: contractId,\n      status: 'PENDING_MANAGER_APPROVAL',\n      llmConfigured: true,\n      message: `${AI_REVIEW_FAILED_PREFIX}: ${detail}`,\n    };\n  }\n\n  const previousAiTerms = parsePaymentTermsSnapshot(\n    contract.aiPaymentTermsSnapshot,\n  );\n  const extractedSupplierTerms =\n    review.supplierPaymentTerms ?? DEFAULT_SUPPLIER_PAYMENT_TERMS;\n  const reviewedAt = nowIso();\n\n  // \"Manual\" excludes what a previous review wrote: on a re-review the field\n  // usually still holds this app's own default text, and treating that as human\n  // input would silence the cash-flow backstop below.\n  const hasManualSupplierTerms =\n    isDefined(contract.paymentTermsSupplier) &&\n    contract.paymentTermsSupplier.trim() !== '' &&\n    contract.paymentTermsSupplier.trim() !== previousAiTerms.supplier?.trim();\n\n  // Nothing filled by hand and nothing in the contract: the supplier side is our\n  // standard, which we know for a fact is a SINGLE payment at D+30.\n  const supplierTermsAreDefaulted =\n    !hasManualSupplierTerms && !isDefined(review.supplierPaymentTerms);\n\n  // Backstop for the exposure that costs real money: billing the customer in\n  // installments while paying the supplier in one shot. The prompt spells this\n  // rule out, so the review should already answer \"mismatch\" \u2014 this only\n  // escalates a punted UNKNOWN, and never overrides an explicit MATCH/MISMATCH.\n  const paymentMismatch =\n    review.paymentMismatch === 'UNKNOWN' &&\n    supplierTermsAreDefaulted &&\n    paysInInstallments(\n      review.customerPaymentTerms ?? contract.paymentTermsCustomer,\n    )\n      ? 'MISMATCH'\n      : review.paymentMismatch;\n\n  await updateContract({\n    contractId,\n    data: pruneUndefined({\n      aiReviewSummary: isDefined(attachmentWarning)\n        ? `${attachmentWarning} A an\u00E1lise abaixo usou apenas os campos preenchidos. ${review.summary}`\n        : review.summary,\n      aiPaymentMismatch: paymentMismatch,\n      aiRiskLevel: review.overallRisk,\n      paymentTermsCustomer: resolvePaymentTerm({\n        current: contract.paymentTermsCustomer,\n        extracted: review.customerPaymentTerms,\n        previouslyWrittenByAi: previousAiTerms.customer,\n      }),\n      // A contract silent on supplier payment falls back to the Excelium\n      // standard instead of leaving the field blank. The stored text says it is\n      // a default, so a presumption is never read as a contractual clause.\n      paymentTermsSupplier: resolvePaymentTerm({\n        current: contract.paymentTermsSupplier,\n        extracted: extractedSupplierTerms,\n        previouslyWrittenByAi: previousAiTerms.supplier,\n      }),\n      aiPaymentTermsSnapshot: serializePaymentTermsSnapshot({\n        customer: review.customerPaymentTerms,\n        supplier: extractedSupplierTerms,\n      }),\n      status: 'PENDING_MANAGER_APPROVAL',\n    }),\n  });\n\n  // Best-effort: attach the full analysis as a Note and open a Task per clause\n  // that needs manual review. Each is independent so one failure does not block\n  // the others, and none can fail the already-successful review.\n  // Close the previous round's clause tasks first: they describe the version of\n  // the contract that was just replaced.\n  await closePreviousReviewTasks({ contractId }).catch(() => undefined);\n\n  await createContractNote({\n    client,\n    contractId,\n    // Timestamped so successive rounds are distinguishable in the Notes list.\n    title: `An\u00E1lise de IA \u2014 ${contract.name ?? 'Contrato'} (${reviewedAt.slice(0, 16).replace('T', ' ')})`,\n    markdown: buildReviewNoteMarkdown(contract.name, {\n      ...review,\n      paymentMismatch,\n    }),\n  }).catch(() => undefined);\n\n  for (const finding of review.findings) {\n    if (finding.requiresManualReview) {\n      await createContractTask({\n        client,\n        contractId,\n        title: `Revisar cl\u00E1usula: ${finding.clause}`,\n        markdown: buildFindingTaskMarkdown(finding),\n      }).catch(() => undefined);\n    }\n  }\n\n  return {\n    success: true,\n    recordId: contractId,\n    status: 'PENDING_MANAGER_APPROVAL',\n    paymentMismatch,\n    llmConfigured: true,\n    message: `AI review complete (payment ${paymentMismatch}).`,\n  };\n};\n", "export const LLM_NOT_CONFIGURED_SUMMARY =\n  'AI review not configured: set the ANTHROPIC_API_KEY app variable in Settings \u2192 Apps to enable automatic clause review. This contract awaits manual manager review.';\n\nexport const NON_MANAGER_ERROR =\n  'Only a Manager can approve or reject contracts.';\n\nexport const CONTRACT_NOT_FOUND_ERROR = 'Contract not found.';\n\nexport const CONTRACT_NOT_AWAITING_APPROVAL_ERROR =\n  'This contract is not awaiting manager approval.';\n\nexport const CONTRACT_NOT_SUBMITTABLE_ERROR =\n  'This contract cannot be submitted for review in its current status.';\n\nexport const AI_REVIEW_FAILED_PREFIX = 'AI review failed';\n", "// Posi\u00E7\u00E3o padr\u00E3o da Excelium para pagamento ao fornecedor quando o contrato \u00E9\n// omisso: PARCELA \u00DANICA (\u00E0 vista) em 30 dias contados da assinatura.\n//\n// O formato importa tanto quanto o prazo: \u00E9 o pagamento em parcela \u00FAnica que\n// cria exposi\u00E7\u00E3o de caixa quando recebemos do cliente de forma parcelada.\nexport const DEFAULT_SUPPLIER_PAYMENT_TERMS_DAYS = 30;\n\n// Forma curta, reaproveitada no prompt e na Nota de IA para que a descri\u00E7\u00E3o do\n// padr\u00E3o n\u00E3o se repita (e n\u00E3o divirja) em v\u00E1rios lugares.\nexport const DEFAULT_SUPPLIER_PAYMENT_TERMS_SHORT = `parcela \u00FAnica (\u00E0 vista) em ${DEFAULT_SUPPLIER_PAYMENT_TERMS_DAYS} dias ap\u00F3s a assinatura`;\n\n// Valor gravado em `paymentTermsSupplier` quando nem o usu\u00E1rio nem o contrato\n// informaram as condi\u00E7\u00F5es. O r\u00F3tulo \"(padr\u00E3o \u2014 n\u00E3o expl\u00EDcito no contrato)\" \u00E9\n// parte do texto de prop\u00F3sito: sem ele ningu\u00E9m consegue distinguir, olhando o\n// registro, uma cl\u00E1usula contratual de uma premissa nossa.\nexport const DEFAULT_SUPPLIER_PAYMENT_TERMS = `Parcela \u00FAnica (\u00E0 vista) em ${DEFAULT_SUPPLIER_PAYMENT_TERMS_DAYS} dias ap\u00F3s a assinatura do contrato (padr\u00E3o \u2014 n\u00E3o expl\u00EDcito no contrato)`;\n", "import { DEFAULT_SUPPLIER_PAYMENT_TERMS_SHORT } from 'src/constants/payment-terms';\nimport {\n  type AiFinding,\n  type AiReviewResult,\n  type FindingSeverity,\n} from 'src/types/ai-review-result';\nimport {\n  type PaymentMismatch,\n  type RiskLevelValue,\n} from 'src/types/contract-status';\n\nconst RISK_LABEL: Record<RiskLevelValue, string> = {\n  VERDE: '\uD83D\uDFE2 Verde (aceit\u00E1vel)',\n  AMARELO: '\uD83D\uDFE1 Amarelo (negociar)',\n  VERMELHO: '\uD83D\uDD34 Vermelho (escalar)',\n};\n\nconst SEVERITY_EMOJI: Record<FindingSeverity, string> = {\n  verde: '\uD83D\uDFE2',\n  amarelo: '\uD83D\uDFE1',\n  vermelho: '\uD83D\uDD34',\n};\n\nconst MISMATCH_LABEL: Record<PaymentMismatch, string> = {\n  MATCH: 'Alinhado',\n  MISMATCH: 'Descasamento de caixa',\n  UNKNOWN: 'Indeterminado',\n};\n\n// Builds the pt-br Markdown body for the AI-review Note attached to a Contract.\nexport const buildReviewNoteMarkdown = (\n  contractName: string | null | undefined,\n  review: AiReviewResult,\n): string => {\n  const lines: string[] = [];\n  const name = contractName?.trim() ? contractName.trim() : 'Contrato';\n\n  lines.push(`## An\u00E1lise de IA \u2014 ${name}`);\n  lines.push('');\n  lines.push(`**Risco geral:** ${RISK_LABEL[review.overallRisk]}`);\n  lines.push(\n    `**Condi\u00E7\u00F5es de pagamento:** ${MISMATCH_LABEL[review.paymentMismatch]}`,\n  );\n  lines.push('');\n  lines.push(`**Resumo:** ${review.summary}`);\n\n  lines.push('');\n\n  if (review.customerPaymentTerms) {\n    lines.push(`**Pagamento (cliente):** ${review.customerPaymentTerms}`);\n  }\n\n  // The supplier line is always emitted: when the contract is silent, the Note\n  // has to state out loud that the analysis ran on a presumed term.\n  lines.push(\n    review.supplierPaymentTerms\n      ? `**Pagamento (fornecedor):** ${review.supplierPaymentTerms}`\n      : `**Pagamento (fornecedor):** n\u00E3o expl\u00EDcito no contrato \u2014 aplicado o padr\u00E3o: ${DEFAULT_SUPPLIER_PAYMENT_TERMS_SHORT}.`,\n  );\n\n  lines.push('');\n  lines.push('### Achados por cl\u00E1usula');\n\n  if (review.findings.length === 0) {\n    lines.push('Nenhum achado relevante identificado.');\n  } else {\n    for (const finding of review.findings) {\n      const flag = finding.requiresManualReview ? ' \u2014 revisar manualmente' : '';\n      lines.push(\n        `- ${SEVERITY_EMOJI[finding.severity]} **${finding.clause}${flag}:** ${finding.issue}`,\n      );\n\n      if (finding.recommendation) {\n        lines.push(`  - _Recomenda\u00E7\u00E3o:_ ${finding.recommendation}`);\n      }\n    }\n  }\n\n  lines.push('');\n  lines.push(\n    '> An\u00E1lise automatizada de apoio. N\u00E3o constitui aconselhamento jur\u00EDdico; revise com um profissional habilitado.',\n  );\n\n  return lines.join('\\n');\n};\n\n// Builds the Markdown body for a review Task opened for a flagged clause.\nexport const buildFindingTaskMarkdown = (finding: AiFinding): string => {\n  const lines: string[] = [];\n\n  lines.push(\n    `**Cl\u00E1usula:** ${SEVERITY_EMOJI[finding.severity]} ${finding.clause}`,\n  );\n  lines.push('');\n  lines.push(`**Problema:** ${finding.issue}`);\n\n  if (finding.recommendation) {\n    lines.push('');\n    lines.push(`**Recomenda\u00E7\u00E3o:** ${finding.recommendation}`);\n  }\n\n  return lines.join('\\n');\n};\n", "import { isNull, isUndefined } from '@sniptt/guards';\n\nexport const isDefined = <T>(\n  value: T | null | undefined,\n): value is NonNullable<T> => !isUndefined(value) && !isNull(value);\n", "import { isDefined } from 'src/utils/is-defined';\n\n// The generated (Zeus) client is built from the workspace GraphQL introspection,\n// which does not reliably expose this app's own custom objects (Contract,\n// ApprovalDecision) \u2014 so client.query/mutation on them can fail client-side at\n// runtime with \"type Query does not have a field contracts\". The server has the\n// types, so we talk to it directly with a raw GraphQL request using the\n// application access token the function runs with. Standard objects can still use\n// the typed client; custom-object operations go through here.\nconst API_URL_ENV = 'TWENTY_API_URL';\nconst TOKEN_ENV_VARS = ['TWENTY_APP_ACCESS_TOKEN', 'TWENTY_API_KEY'] as const;\n\nconst isNonEmpty = (value: unknown): value is string =>\n  typeof value === 'string' && value.length > 0;\n\nconst getToken = (): string | undefined => {\n  for (const envVar of TOKEN_ENV_VARS) {\n    const value = process.env[envVar];\n\n    if (isNonEmpty(value)) {\n      return value;\n    }\n  }\n\n  return undefined;\n};\n\nexport const runCoreGraphql = async <TData>(\n  query: string,\n  variables?: Record<string, unknown>,\n): Promise<TData> => {\n  const apiUrl = process.env[API_URL_ENV]?.replace(/\\/$/, '');\n  const token = getToken();\n\n  if (!isNonEmpty(apiUrl) || !isDefined(token)) {\n    throw new Error(\n      'Contract Approval: missing API URL or access token in the function environment.',\n    );\n  }\n\n  const response = await fetch(`${apiUrl}/graphql`, {\n    method: 'POST',\n    headers: {\n      'content-type': 'application/json',\n      authorization: `Bearer ${token}`,\n    },\n    body: JSON.stringify({ query, ...(variables ? { variables } : {}) }),\n  });\n\n  const payload = (await response.json()) as { data?: TData; errors?: unknown };\n\n  if (payload.errors) {\n    throw new Error(\n      `Contract Approval GraphQL error: ${JSON.stringify(payload.errors).slice(0, 300)}`,\n    );\n  }\n\n  return payload.data as TData;\n};\n", "import { runCoreGraphql } from 'src/logic-functions/utils/run-core-graphql';\nimport { isDefined } from 'src/utils/is-defined';\n\n// Only tasks this app opened are closed; anything a person created by hand on\n// the contract is left alone.\nexport const REVIEW_TASK_TITLE_PREFIX = 'Revisar cl\u00E1usula:';\n\ntype TaskTargetsResult = {\n  taskTargets?: {\n    edges?: {\n      node?: { task?: { id?: string | null; title?: string | null; status?: string | null } | null };\n    }[];\n  };\n};\n\n// A re-review re-flags the clauses of the NEW version, so the previous round's\n// open tasks are stale \u2014 some point at clauses that were already fixed. Closing\n// them keeps the contract's task list showing one round at a time.\nexport const closePreviousReviewTasks = async ({\n  contractId,\n}: {\n  contractId: string;\n}): Promise<number> => {\n  const result = await runCoreGraphql<TaskTargetsResult>(\n    `query ContractTasks($filter: TaskTargetFilterInput) {\n      taskTargets(filter: $filter, first: 200) {\n        edges { node { task { id title status } } }\n      }\n    }`,\n    { filter: { targetContractId: { eq: contractId } } },\n  );\n\n  const tasks = (result.taskTargets?.edges ?? [])\n    .map((edge) => edge?.node?.task)\n    .filter(\n      (task): task is { id: string; title: string; status: string } =>\n        isDefined(task) &&\n        isDefined(task.id) &&\n        typeof task.title === 'string' &&\n        task.title.startsWith(REVIEW_TASK_TITLE_PREFIX) &&\n        task.status !== 'DONE',\n    );\n\n  let closed = 0;\n\n  for (const task of tasks) {\n    await runCoreGraphql(\n      `mutation CloseTask($id: UUID!, $data: TaskUpdateInput!) {\n        updateTask(id: $id, data: $data) { id }\n      }`,\n      { id: task.id, data: { status: 'DONE' } },\n    );\n    closed++;\n  }\n\n  return closed;\n};\n", "import { runCoreGraphql } from 'src/logic-functions/utils/run-core-graphql';\n\nexport type ApprovalDecisionData = Record<string, unknown>;\n\n// createApprovalDecision targets this app's custom object, which the generated\n// client can't reliably mutate, so use raw GraphQL against the server.\nexport const createApprovalDecision = async ({\n  data,\n}: {\n  data: ApprovalDecisionData;\n}): Promise<string | undefined> => {\n  const result = await runCoreGraphql<{\n    createApprovalDecision?: { id?: string };\n  }>(\n    `mutation CreateApprovalDecision($data: ApprovalDecisionCreateInput!) {\n      createApprovalDecision(data: $data) { id }\n    }`,\n    { data },\n  );\n\n  return result.createApprovalDecision?.id;\n};\n", "import { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { isDefined } from 'src/utils/is-defined';\n\n// Creates a Note with a Markdown body and links it to a custom Contract record\n// via a note target. Uses the loosely-typed mutation escape hatch (these core\n// objects are not in the app's generated client schema). Calls client.mutation\n// inline so the CoreApiClient `this` binding is preserved.\nexport const createContractNote = async ({\n  client,\n  contractId,\n  title,\n  markdown,\n}: {\n  client: CoreApiClient;\n  contractId: string;\n  title: string;\n  markdown: string;\n}): Promise<string | undefined> => {\n  const noteResult = (await (\n    client.mutation as (request: unknown) => Promise<unknown>\n  )({\n    createNote: {\n      __args: { data: { title, bodyV2: { markdown, blocknote: null } } },\n      id: true,\n    },\n  })) as { createNote?: { id?: string } };\n\n  const noteId = noteResult.createNote?.id;\n\n  if (!isDefined(noteId)) {\n    return undefined;\n  }\n\n  // The note target links to the Contract custom object via its morph-relation\n  // FK `targetContractId` (not `contractId`).\n  await (client.mutation as (request: unknown) => Promise<unknown>)({\n    createNoteTarget: {\n      __args: { data: { noteId, targetContractId: contractId } },\n      id: true,\n    },\n  });\n\n  return noteId;\n};\n", "import { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { isDefined } from 'src/utils/is-defined';\n\n// Creates a Task with a Markdown body and links it to a custom Contract record\n// via a task target, for a clause flagged as needing manual review. Calls\n// client.mutation inline so the CoreApiClient `this` binding is preserved.\nexport const createContractTask = async ({\n  client,\n  contractId,\n  title,\n  markdown,\n  assigneeId,\n}: {\n  client: CoreApiClient;\n  contractId: string;\n  title: string;\n  markdown: string;\n  assigneeId?: string;\n}): Promise<string | undefined> => {\n  const taskResult = (await (\n    client.mutation as (request: unknown) => Promise<unknown>\n  )({\n    createTask: {\n      __args: {\n        data: {\n          title,\n          bodyV2: { markdown, blocknote: null },\n          status: 'TODO',\n          ...(isDefined(assigneeId) ? { assigneeId } : {}),\n        },\n      },\n      id: true,\n    },\n  })) as { createTask?: { id?: string } };\n\n  const taskId = taskResult.createTask?.id;\n\n  if (!isDefined(taskId)) {\n    return undefined;\n  }\n\n  // The task target links to the Contract custom object via its morph-relation\n  // FK `targetContractId` (not `contractId`).\n  await (client.mutation as (request: unknown) => Promise<unknown>)({\n    createTaskTarget: {\n      __args: { data: { taskId, targetContractId: contractId } },\n      id: true,\n    },\n  });\n\n  return taskId;\n};\n", "export type DocumentFormat = 'pdf' | 'ooxml' | 'ole2' | 'rtf' | 'unknown';\n\nconst startsWith = (bytes: Buffer, signature: number[]): boolean =>\n  bytes.length >= signature.length &&\n  signature.every((byte, index) => bytes[index] === byte);\n\n// Sniff by magic bytes rather than by file extension: contracts routinely arrive\n// as a .doc that is really a .docx (or a PDF renamed by hand), and feeding the\n// wrong parser a legal document silently produces garbage analysis.\nexport const detectDocumentFormat = (bytes: Buffer): DocumentFormat => {\n  if (startsWith(bytes, [0x25, 0x50, 0x44, 0x46])) {\n    return 'pdf';\n  }\n\n  // Any OOXML container (.docx) is a zip; the caller checks it holds a Word part.\n  if (startsWith(bytes, [0x50, 0x4b, 0x03, 0x04])) {\n    return 'ooxml';\n  }\n\n  // OLE2/CFB compound file: Word 97-2003 .doc\n  if (\n    startsWith(bytes, [0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1])\n  ) {\n    return 'ole2';\n  }\n\n  if (startsWith(bytes, [0x7b, 0x5c, 0x72, 0x74, 0x66])) {\n    return 'rtf';\n  }\n\n  return 'unknown';\n};\n", "const END_OF_CHAIN = 0xfffffffe;\nconst FREE_SECTOR = 0xffffffff;\nconst MAX_CHAIN_LENGTH = 1 << 20; // guards against a corrupt/looping FAT\n\ntype DirectoryEntry = {\n  name: string;\n  type: number;\n  startSector: number;\n  size: number;\n};\n\n// Reader for the OLE2/CFB container that wraps a Word 97-2003 .doc. Only the\n// pieces needed to pull a named stream out are implemented (FAT, mini FAT and\n// the directory); nothing here writes or validates the whole structure.\nexport class CompoundFile {\n  private readonly sectorSize: number;\n  private readonly miniSectorSize: number;\n  private readonly miniStreamCutoff: number;\n  private readonly fat: number[];\n  private readonly miniFat: number[];\n  private readonly entries: DirectoryEntry[];\n  private readonly miniStream: Buffer;\n\n  private constructor(private readonly bytes: Buffer) {\n    this.sectorSize = 1 << bytes.readUInt16LE(0x1e);\n    this.miniSectorSize = 1 << bytes.readUInt16LE(0x20);\n    this.miniStreamCutoff = bytes.readUInt32LE(0x38);\n    this.fat = this.readFat();\n    this.entries = this.readDirectory();\n\n    const root = this.entries.find((entry) => entry.type === 5);\n\n    this.miniFat = this.readMiniFat();\n    this.miniStream =\n      root === undefined\n        ? Buffer.alloc(0)\n        : this.readFromFat(root.startSector, root.size);\n  }\n\n  static parse(bytes: Buffer): CompoundFile | undefined {\n    if (bytes.length < 512) {\n      return undefined;\n    }\n\n    try {\n      return new CompoundFile(bytes);\n    } catch {\n      return undefined;\n    }\n  }\n\n  private sector(id: number): Buffer {\n    const start = (id + 1) * this.sectorSize;\n\n    return this.bytes.subarray(start, start + this.sectorSize);\n  }\n\n  private readFat(): number[] {\n    const fatSectorIds: number[] = [];\n\n    for (let index = 0; index < 109; index++) {\n      const id = this.bytes.readUInt32LE(0x4c + index * 4);\n\n      if (id !== FREE_SECTOR) {\n        fatSectorIds.push(id);\n      }\n    }\n\n    // DIFAT continuation sectors: each holds (sectorSize/4 - 1) FAT ids plus a\n    // pointer to the next DIFAT sector in its last slot.\n    let difatSector = this.bytes.readUInt32LE(0x44);\n    const difatCount = this.bytes.readUInt32LE(0x48);\n    const perSector = this.sectorSize / 4 - 1;\n\n    for (\n      let index = 0;\n      index < difatCount && difatSector !== END_OF_CHAIN && difatSector !== FREE_SECTOR;\n      index++\n    ) {\n      const data = this.sector(difatSector);\n\n      for (let slot = 0; slot < perSector; slot++) {\n        const id = data.readUInt32LE(slot * 4);\n\n        if (id !== FREE_SECTOR) {\n          fatSectorIds.push(id);\n        }\n      }\n\n      difatSector = data.readUInt32LE(perSector * 4);\n    }\n\n    const fat: number[] = [];\n\n    for (const id of fatSectorIds) {\n      const data = this.sector(id);\n\n      for (let slot = 0; slot * 4 + 4 <= data.length; slot++) {\n        fat.push(data.readUInt32LE(slot * 4));\n      }\n    }\n\n    return fat;\n  }\n\n  private chain(start: number, fat: number[]): number[] {\n    const ids: number[] = [];\n    let current = start;\n\n    while (\n      current !== END_OF_CHAIN &&\n      current !== FREE_SECTOR &&\n      current < fat.length &&\n      ids.length < MAX_CHAIN_LENGTH\n    ) {\n      ids.push(current);\n      current = fat[current];\n    }\n\n    return ids;\n  }\n\n  private readFromFat(start: number, size: number): Buffer {\n    const parts = this.chain(start, this.fat).map((id) => this.sector(id));\n\n    return Buffer.concat(parts).subarray(0, size);\n  }\n\n  private readMiniFat(): number[] {\n    const start = this.bytes.readUInt32LE(0x3c);\n    const parts = this.chain(start, this.fat).map((id) => this.sector(id));\n    const data = Buffer.concat(parts);\n    const miniFat: number[] = [];\n\n    for (let slot = 0; slot * 4 + 4 <= data.length; slot++) {\n      miniFat.push(data.readUInt32LE(slot * 4));\n    }\n\n    return miniFat;\n  }\n\n  private readDirectory(): DirectoryEntry[] {\n    const start = this.bytes.readUInt32LE(0x30);\n    const parts = this.chain(start, this.fat).map((id) => this.sector(id));\n    const data = Buffer.concat(parts);\n    const entries: DirectoryEntry[] = [];\n\n    for (let offset = 0; offset + 128 <= data.length; offset += 128) {\n      const nameLength = data.readUInt16LE(offset + 0x40);\n      const type = data.readUInt8(offset + 0x42);\n\n      if (type === 0 || nameLength < 2) {\n        continue;\n      }\n\n      entries.push({\n        name: data\n          .subarray(offset, offset + Math.max(0, nameLength - 2))\n          .toString('utf16le'),\n        type,\n        startSector: data.readUInt32LE(offset + 0x74),\n        size: data.readUInt32LE(offset + 0x78),\n      });\n    }\n\n    return entries;\n  }\n\n  readStream(name: string): Buffer | undefined {\n    const entry = this.entries.find(\n      (candidate) => candidate.type === 2 && candidate.name === name,\n    );\n\n    if (entry === undefined) {\n      return undefined;\n    }\n\n    if (entry.size >= this.miniStreamCutoff) {\n      return this.readFromFat(entry.startSector, entry.size);\n    }\n\n    const parts = this.chain(entry.startSector, this.miniFat).map((id) => {\n      const start = id * this.miniSectorSize;\n\n      return this.miniStream.subarray(start, start + this.miniSectorSize);\n    });\n\n    return Buffer.concat(parts).subarray(0, entry.size);\n  }\n}\n", "const decodeEntities = (value: string): string =>\n  value\n    .replace(/&#x([0-9a-f]+);/gi, (_, hex: string) =>\n      String.fromCodePoint(Number.parseInt(hex, 16)),\n    )\n    .replace(/&#(\\d+);/g, (_, dec: string) =>\n      String.fromCodePoint(Number.parseInt(dec, 10)),\n    )\n    .replace(/&lt;/g, '<')\n    .replace(/&gt;/g, '>')\n    .replace(/&quot;/g, '\"')\n    .replace(/&apos;/g, \"'\")\n    .replace(/&amp;/g, '&');\n\nexport const normalizeExtractedText = (value: string): string =>\n  value\n    .replace(/\\r\\n?/g, '\\n')\n    // drop control characters that survive extraction, keeping tab and newline\n    .replace(/[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F]/g, '')\n    .replace(/\\u00A0/g, ' ')\n    .split('\\n')\n    .map((line) => line.replace(/[ \\t]+/g, ' ').trim())\n    .join('\\n')\n    .replace(/\\n{3,}/g, '\\n\\n')\n    .trim();\n\n// WordprocessingML carries the visible text in <w:t>, with structure expressed\n// by sibling tags. Turning paragraph/row ends into newlines keeps clause\n// boundaries intact, which the review prompt relies on to cite clauses.\nexport const wordXmlToText = (xml: string): string => {\n  const withBreaks = xml\n    .replace(/<w:tab\\b[^>]*\\/?>/g, '\\t')\n    .replace(/<w:br\\b[^>]*\\/?>/g, '\\n')\n    .replace(/<\\/w:p>/g, '\\n')\n    .replace(/<\\/w:tr>/g, '\\n')\n    .replace(/<\\/w:tc>/g, '\\t');\n\n  const textOnly = withBreaks.replace(/<[^>]*>/g, '');\n\n  return normalizeExtractedText(decodeEntities(textOnly));\n};\n", "import { CompoundFile } from 'src/logic-functions/utils/read-compound-file';\nimport { normalizeExtractedText } from 'src/logic-functions/utils/xml-to-text';\n\nconst WORD_MAGIC = 0xa5ec;\nconst FIB_FLAGS_OFFSET = 0x0a;\nconst FIB_FC_MIN_OFFSET = 0x18;\nconst FIB_FC_MAC_OFFSET = 0x1c;\nconst FIB_FC_CLX_OFFSET = 0x01a2;\nconst FIB_LCB_CLX_OFFSET = 0x01a6;\nconst FLAG_WHICH_TABLE_STREAM = 0x0200;\nconst PIECE_DESCRIPTOR_SIZE = 8;\n\n// Windows-1252 differs from latin1 only in 0x80-0x9F, which is exactly where\n// Word puts smart quotes and dashes \u2014 common in Brazilian contract text.\nconst CP1252_HIGH: Record<number, string> = {\n  0x80: '\u20AC', 0x82: '\u201A', 0x83: '\u0192', 0x84: '\u201E',\n  0x85: '\u2026', 0x86: '\u2020', 0x87: '\u2021', 0x88: '\u02C6',\n  0x89: '\u2030', 0x8a: '\u0160', 0x8b: '\u2039', 0x8c: '\u0152',\n  0x8e: '\u017D', 0x91: '\u2018', 0x92: '\u2019', 0x93: '\u201C',\n  0x94: '\u201D', 0x95: '\u2022', 0x96: '\u2013', 0x97: '\u2014',\n  0x98: '\u02DC', 0x99: '\u2122', 0x9a: '\u0161', 0x9b: '\u203A',\n  0x9c: '\u0153', 0x9e: '\u017E', 0x9f: '\u0178',\n};\n\nconst decodeCp1252 = (bytes: Buffer): string => {\n  let out = '';\n\n  for (const byte of bytes) {\n    out += byte >= 0x80 && byte <= 0x9f ? (CP1252_HIGH[byte] ?? '') : String.fromCharCode(byte);\n  }\n\n  return out;\n};\n\n// Word marks paragraph/cell ends with control characters, and wraps field\n// instructions (page numbers, TOC codes) in 0x13..0x14 \u2014 instructions are noise\n// for a clause review, the result after 0x14 is the visible text.\nconst cleanWordText = (value: string): string => {\n  let out = '';\n  let inFieldInstruction = false;\n\n  for (const char of value) {\n    const code = char.charCodeAt(0);\n\n    if (code === 0x13) {\n      inFieldInstruction = true;\n      continue;\n    }\n\n    if (code === 0x14 || code === 0x15) {\n      inFieldInstruction = false;\n      continue;\n    }\n\n    if (inFieldInstruction) {\n      continue;\n    }\n\n    if (code === 0x0d || code === 0x07 || code === 0x0b || code === 0x0c) {\n      out += '\\n';\n      continue;\n    }\n\n    if (code === 0x1e) {\n      out += '-';\n      continue;\n    }\n\n    if (code === 0x1f) {\n      continue;\n    }\n\n    out += char;\n  }\n\n  return out;\n};\n\ntype Piece = { offset: number; length: number; compressed: boolean };\n\n// The Clx in the table stream holds the piece table: where each run of text\n// lives in the WordDocument stream and whether it is CP1252 or UTF-16.\nconst readPieces = (clx: Buffer): Piece[] | undefined => {\n  let cursor = 0;\n\n  while (cursor < clx.length) {\n    const kind = clx.readUInt8(cursor);\n\n    if (kind === 1) {\n      if (cursor + 3 > clx.length) {\n        return undefined;\n      }\n\n      cursor += 3 + clx.readUInt16LE(cursor + 1);\n      continue;\n    }\n\n    if (kind !== 2 || cursor + 5 > clx.length) {\n      return undefined;\n    }\n\n    const lcb = clx.readUInt32LE(cursor + 1);\n    const start = cursor + 5;\n    const pieceCount = Math.floor((lcb - 4) / (4 + PIECE_DESCRIPTOR_SIZE));\n\n    if (pieceCount <= 0 || start + lcb > clx.length) {\n      return undefined;\n    }\n\n    const cpStart = start;\n    const pcdStart = start + (pieceCount + 1) * 4;\n    const pieces: Piece[] = [];\n\n    for (let index = 0; index < pieceCount; index++) {\n      const charCount =\n        clx.readUInt32LE(cpStart + (index + 1) * 4) -\n        clx.readUInt32LE(cpStart + index * 4);\n      const descriptor = pcdStart + index * PIECE_DESCRIPTOR_SIZE;\n      const raw = clx.readUInt32LE(descriptor + 2);\n      const compressed = (raw & 0x40000000) !== 0;\n      const offset = compressed ? (raw & 0x3fffffff) / 2 : raw & 0x3fffffff;\n\n      if (charCount > 0) {\n        pieces.push({ offset, length: charCount, compressed });\n      }\n    }\n\n    return pieces;\n  }\n\n  return undefined;\n};\n\n// A malformed .doc must degrade into \"could not extract\" rather than throw:\n// the caller turns that into an actionable message on the contract.\nexport const extractDocText = (bytes: Buffer): string | undefined => {\n  try {\n    return extractDocTextOrThrow(bytes);\n  } catch {\n    return undefined;\n  }\n};\n\nconst extractDocTextOrThrow = (bytes: Buffer): string | undefined => {\n  const file = CompoundFile.parse(bytes);\n\n  if (file === undefined) {\n    return undefined;\n  }\n\n  const wordDocument = file.readStream('WordDocument');\n\n  if (\n    wordDocument === undefined ||\n    wordDocument.length < FIB_LCB_CLX_OFFSET + 4 ||\n    wordDocument.readUInt16LE(0) !== WORD_MAGIC\n  ) {\n    return undefined;\n  }\n\n  const flags = wordDocument.readUInt16LE(FIB_FLAGS_OFFSET);\n  const tableStream = file.readStream(\n    (flags & FLAG_WHICH_TABLE_STREAM) !== 0 ? '1Table' : '0Table',\n  );\n\n  const fcClx = wordDocument.readUInt32LE(FIB_FC_CLX_OFFSET);\n  const lcbClx = wordDocument.readUInt32LE(FIB_LCB_CLX_OFFSET);\n\n  if (tableStream !== undefined && lcbClx > 0 && fcClx + lcbClx <= tableStream.length) {\n    const pieces = readPieces(tableStream.subarray(fcClx, fcClx + lcbClx));\n\n    if (pieces !== undefined && pieces.length > 0) {\n      const text = pieces\n        .map((piece) => {\n          const byteLength = piece.compressed ? piece.length : piece.length * 2;\n          const slice = wordDocument.subarray(\n            piece.offset,\n            piece.offset + byteLength,\n          );\n\n          return piece.compressed\n            ? decodeCp1252(slice)\n            : slice.toString('utf16le');\n        })\n        .join('');\n\n      const cleaned = normalizeExtractedText(cleanWordText(text));\n\n      if (cleaned !== '') {\n        return cleaned;\n      }\n    }\n  }\n\n  // Word 6/95 and files without a piece table keep the text in one run between\n  // fcMin and fcMac.\n  const fcMin = wordDocument.readUInt32LE(FIB_FC_MIN_OFFSET);\n  const fcMac = wordDocument.readUInt32LE(FIB_FC_MAC_OFFSET);\n\n  if (fcMac > fcMin && fcMac <= wordDocument.length) {\n    const cleaned = normalizeExtractedText(\n      cleanWordText(decodeCp1252(wordDocument.subarray(fcMin, fcMac))),\n    );\n\n    return cleaned === '' ? undefined : cleaned;\n  }\n\n  return undefined;\n};\n", "import { inflateRawSync } from 'node:zlib';\n\nconst EOCD_SIGNATURE = 0x06054b50;\nconst CENTRAL_DIRECTORY_SIGNATURE = 0x02014b50;\nconst LOCAL_HEADER_SIGNATURE = 0x04034b50;\nconst EOCD_MAX_SIZE = 65557; // 22-byte record + max 65535-byte comment\n\nconst findEndOfCentralDirectory = (bytes: Buffer): number | undefined => {\n  const from = Math.max(0, bytes.length - EOCD_MAX_SIZE);\n\n  for (let offset = bytes.length - 22; offset >= from; offset--) {\n    if (bytes.readUInt32LE(offset) === EOCD_SIGNATURE) {\n      return offset;\n    }\n  }\n\n  return undefined;\n};\n\n// Minimal zip reader: enough to pull one known entry out of an OOXML package.\n// Reads through the central directory (authoritative sizes) because local\n// headers may carry zeroes when the writer used a streaming data descriptor.\nexport const readZipEntry = (\n  bytes: Buffer,\n  entryName: string,\n): Buffer | undefined => {\n  const eocd = findEndOfCentralDirectory(bytes);\n\n  if (eocd === undefined) {\n    return undefined;\n  }\n\n  const entryCount = bytes.readUInt16LE(eocd + 10);\n  let cursor = bytes.readUInt32LE(eocd + 16);\n\n  for (let index = 0; index < entryCount; index++) {\n    if (\n      cursor + 46 > bytes.length ||\n      bytes.readUInt32LE(cursor) !== CENTRAL_DIRECTORY_SIGNATURE\n    ) {\n      return undefined;\n    }\n\n    const compressionMethod = bytes.readUInt16LE(cursor + 10);\n    const compressedSize = bytes.readUInt32LE(cursor + 20);\n    const nameLength = bytes.readUInt16LE(cursor + 28);\n    const extraLength = bytes.readUInt16LE(cursor + 30);\n    const commentLength = bytes.readUInt16LE(cursor + 32);\n    const localHeaderOffset = bytes.readUInt32LE(cursor + 42);\n    const name = bytes\n      .subarray(cursor + 46, cursor + 46 + nameLength)\n      .toString('utf8');\n\n    if (name === entryName) {\n      if (\n        localHeaderOffset + 30 > bytes.length ||\n        bytes.readUInt32LE(localHeaderOffset) !== LOCAL_HEADER_SIGNATURE\n      ) {\n        return undefined;\n      }\n\n      const localNameLength = bytes.readUInt16LE(localHeaderOffset + 26);\n      const localExtraLength = bytes.readUInt16LE(localHeaderOffset + 28);\n      const dataStart =\n        localHeaderOffset + 30 + localNameLength + localExtraLength;\n      const data = bytes.subarray(dataStart, dataStart + compressedSize);\n\n      if (compressionMethod === 0) {\n        return data;\n      }\n\n      if (compressionMethod === 8) {\n        try {\n          return inflateRawSync(data);\n        } catch {\n          return undefined;\n        }\n      }\n\n      return undefined;\n    }\n\n    cursor += 46 + nameLength + extraLength + commentLength;\n  }\n\n  return undefined;\n};\n", "import { readZipEntry } from 'src/logic-functions/utils/read-zip-entry';\nimport { wordXmlToText } from 'src/logic-functions/utils/xml-to-text';\n\nconst MAIN_DOCUMENT_PART = 'word/document.xml';\n\n// Contract text often continues in headers/footers (parties, foro) \u2014 read the\n// main part first so the body dominates, then append what the headers add.\nconst SECONDARY_PARTS = [\n  'word/header1.xml',\n  'word/header2.xml',\n  'word/header3.xml',\n  'word/footer1.xml',\n  'word/footer2.xml',\n  'word/footer3.xml',\n];\n\nexport const extractDocxText = (bytes: Buffer): string | undefined => {\n  const main = readZipEntry(bytes, MAIN_DOCUMENT_PART);\n\n  if (main === undefined) {\n    return undefined;\n  }\n\n  const parts = [wordXmlToText(main.toString('utf8'))];\n\n  for (const part of SECONDARY_PARTS) {\n    const entry = readZipEntry(bytes, part);\n\n    if (entry !== undefined) {\n      const text = wordXmlToText(entry.toString('utf8'));\n\n      if (text !== '') {\n        parts.push(text);\n      }\n    }\n  }\n\n  const combined = parts.filter((part) => part !== '').join('\\n\\n');\n\n  return combined === '' ? undefined : combined;\n};\n", "import { normalizeExtractedText } from 'src/logic-functions/utils/xml-to-text';\n\n// Groups that hold metadata or binary payloads rather than contract text.\nconst SKIPPED_GROUPS = new Set([\n  'fonttbl',\n  'colortbl',\n  'stylesheet',\n  'info',\n  'pict',\n  'object',\n  'themedata',\n  'colorschememapping',\n  'latentstyles',\n  'listtable',\n  'listoverridetable',\n  'rsidtbl',\n  'generator',\n  'datastore',\n  'xmlnstbl',\n]);\n\n// Removes whole groups (including nested braces) whose leading control word is\n// in SKIPPED_GROUPS. A non-greedy regex cannot do this: `{\\fonttbl{\\f0 X;}}`\n// would stop at the inner brace and leak `X;` into the contract text.\nconst stripSkippedGroups = (source: string): string => {\n  let out = '';\n\n  for (let index = 0; index < source.length; index++) {\n    if (source[index] !== '{') {\n      out += source[index];\n      continue;\n    }\n\n    // both `{\\fonttbl ...}` and the ignorable-destination form `{\\*\\themedata ...}`\n    const control = /^\\{\\\\(?:\\*\\\\)?([a-z]+)/i.exec(source.slice(index, index + 40));\n\n    if (control === null || !SKIPPED_GROUPS.has(control[1].toLowerCase())) {\n      out += source[index];\n      continue;\n    }\n\n    let depth = 0;\n\n    for (let scan = index; scan < source.length; scan++) {\n      const char = source[scan];\n\n      if (char === '\\\\') {\n        scan++; // an escaped brace is literal text, not nesting\n        continue;\n      }\n\n      if (char === '{') {\n        depth++;\n      } else if (char === '}') {\n        depth--;\n\n        if (depth === 0) {\n          index = scan;\n          break;\n        }\n      }\n\n      if (scan === source.length - 1) {\n        index = scan;\n      }\n    }\n  }\n\n  return out;\n};\n\n// Word \"Save as .doc\" sometimes produces RTF, and some ERPs export contracts as\n// RTF outright. Stripping control words is enough to recover the clause text.\nexport const extractRtfText = (bytes: Buffer): string | undefined => {\n  const source = stripSkippedGroups(bytes.toString('latin1'));\n\n  const text = source\n    .replace(/\\\\par[d]?\\b/g, '\\n')\n    .replace(/\\\\line\\b/g, '\\n')\n    .replace(/\\\\tab\\b/g, '\\t')\n    .replace(/\\\\'([0-9a-f]{2})/gi, (_, hex: string) =>\n      String.fromCharCode(Number.parseInt(hex, 16)),\n    )\n    .replace(/\\\\u(-?\\d+)\\s?\\??/g, (_, code: string) => {\n      const value = Number.parseInt(code, 10);\n\n      return String.fromCharCode(value < 0 ? value + 65536 : value);\n    })\n    // remaining control words: \\word, optionally with a numeric argument\n    .replace(/\\\\[a-z]+-?\\d*\\s?/gi, '')\n    .replace(/[{}]/g, '');\n\n  const normalized = normalizeExtractedText(text);\n\n  return normalized === '' ? undefined : normalized;\n};\n", "import { detectDocumentFormat } from 'src/logic-functions/utils/detect-document-format';\nimport { extractDocText } from 'src/logic-functions/utils/extract-doc-text';\nimport { extractDocxText } from 'src/logic-functions/utils/extract-docx-text';\nimport { extractRtfText } from 'src/logic-functions/utils/extract-rtf-text';\n\nexport type ExtractedDocument =\n  | { kind: 'pdf'; base64: string }\n  | { kind: 'text'; format: 'docx' | 'doc' | 'rtf'; text: string }\n  | { kind: 'unsupported'; reason: string };\n\n// A legal review on truncated or garbled text is worse than no review at all,\n// so extraction has to clear a floor before we spend a model call on it.\nexport const MIN_EXTRACTED_CHARS = 200;\n// Bounds the prompt: ~120k chars is far more than any contract we see and still\n// leaves room for the model's answer.\nexport const MAX_DOCUMENT_TEXT_CHARS = 120_000;\n\nconst READABLE_RATIO_FLOOR = 0.85;\n\n// Binary leftovers from a failed parse show up as a low share of characters that\n// belong in prose, which is what this measures.\nexport const looksLikeReadableText = (text: string): boolean => {\n  if (text.length < MIN_EXTRACTED_CHARS) {\n    return false;\n  }\n\n  const readable = [...text].filter((char) =>\n    /[\\p{L}\\p{N}\\p{P}\\p{Zs}\\n\\t]/u.test(char),\n  ).length;\n\n  return readable / text.length >= READABLE_RATIO_FLOOR;\n};\n\nconst truncate = (text: string): string =>\n  text.length > MAX_DOCUMENT_TEXT_CHARS\n    ? `${text.slice(0, MAX_DOCUMENT_TEXT_CHARS)}\\n\\n[texto truncado por limite de tamanho]`\n    : text;\n\nconst finish = (\n  format: 'docx' | 'doc' | 'rtf',\n  text: string | undefined,\n  label: string,\n): ExtractedDocument =>\n  text !== undefined && looksLikeReadableText(text)\n    ? { kind: 'text', format, text: truncate(text) }\n    : {\n        kind: 'unsupported',\n        reason: `N\u00E3o foi poss\u00EDvel extrair o texto do arquivo ${label} anexado. Converta o contrato para PDF ou .docx e reenvie.`,\n      };\n\nexport const extractDocument = (bytes: Buffer): ExtractedDocument => {\n  const format = detectDocumentFormat(bytes);\n\n  switch (format) {\n    case 'pdf':\n      return { kind: 'pdf', base64: bytes.toString('base64') };\n    case 'ooxml':\n      return finish('docx', extractDocxText(bytes), '.docx');\n    case 'ole2':\n      return finish('doc', extractDocText(bytes), '.doc');\n    case 'rtf':\n      return finish('rtf', extractRtfText(bytes), '.rtf');\n    default:\n      return {\n        kind: 'unsupported',\n        reason:\n          'O arquivo anexado n\u00E3o \u00E9 PDF, .docx, .doc nem .rtf. Converta o contrato para um desses formatos e reenvie.',\n      };\n  }\n};\n", "type FetchImpl = typeof fetch;\n\n// Cap the contract file to bound function memory and the LLM upload payload.\nexport const MAX_ATTACHMENT_BYTES = 15 * 1024 * 1024;\n\nexport class AttachmentFetchError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'AttachmentFetchError';\n  }\n}\n\n// Downloads a signed attachment URL and returns the raw bytes. Format detection\n// and text extraction happen on the caller side, from these bytes.\nexport const fetchAttachmentBytes = async ({\n  url,\n  fetchImpl = fetch,\n  maxBytes = MAX_ATTACHMENT_BYTES,\n}: {\n  url: string;\n  fetchImpl?: FetchImpl;\n  maxBytes?: number;\n}): Promise<Buffer> => {\n  let response: Response;\n\n  try {\n    response = await fetchImpl(url, { method: 'GET' });\n  } catch (error) {\n    throw new AttachmentFetchError(\n      `Failed to download contract file: ${\n        error instanceof Error ? error.message : String(error)\n      }`,\n    );\n  }\n\n  if (!response.ok) {\n    throw new AttachmentFetchError(\n      `Failed to download contract file (status ${response.status}).`,\n    );\n  }\n\n  const declaredLength = Number(response.headers?.get?.('content-length'));\n\n  if (Number.isFinite(declaredLength) && declaredLength > maxBytes) {\n    throw new AttachmentFetchError(\n      `Contract file is too large (${declaredLength} bytes > ${maxBytes}).`,\n    );\n  }\n\n  const arrayBuffer = await response.arrayBuffer();\n\n  if (arrayBuffer.byteLength > maxBytes) {\n    throw new AttachmentFetchError(\n      `Contract file is too large (${arrayBuffer.byteLength} bytes > ${maxBytes}).`,\n    );\n  }\n\n  return Buffer.from(arrayBuffer);\n};\n", "import { isNonEmptyString } from '@sniptt/guards';\n\n// Graceful: returns undefined when the key is not configured so the AI review\n// can degrade to a \"not configured\" summary instead of throwing.\nexport const getLlmApiKey = (): string | undefined => {\n  const apiKey = process.env.ANTHROPIC_API_KEY?.trim();\n\n  return isNonEmptyString(apiKey) ? apiKey : undefined;\n};\n", "import { isNonEmptyString } from '@sniptt/guards';\n\nimport { DEFAULT_LLM_MODEL } from 'src/constants/llm-model';\n\nexport const getLlmModel = (): string => {\n  const model = process.env.LLM_MODEL?.trim();\n\n  return isNonEmptyString(model) ? model : DEFAULT_LLM_MODEL;\n};\n", "// Default Anthropic model for the contract review. The `-latest` alias is a\n// stable, multimodal model that accepts PDF `document` content blocks. Override\n// per-workspace via the non-secret LLM_MODEL application variable.\nexport const DEFAULT_LLM_MODEL = 'claude-3-5-sonnet-latest';\n\nexport const ANTHROPIC_MESSAGES_URL = 'https://api.anthropic.com/v1/messages';\n\nexport const ANTHROPIC_API_VERSION = '2023-06-01';\n", "export const nowIso = (): string => new Date().toISOString();\n", "import { isNonEmptyString } from '@sniptt/guards';\n\nimport {\n  type AiFinding,\n  type AiReviewResult,\n  type FindingSeverity,\n} from 'src/types/ai-review-result';\nimport {\n  type PaymentMismatch,\n  type RiskLevelValue,\n} from 'src/types/contract-status';\nimport { isDefined } from 'src/utils/is-defined';\n\nconst SEVERITIES: readonly FindingSeverity[] = ['verde', 'amarelo', 'vermelho'];\n\n// The model answers in lowercase pt-br; map to the UPPER_CASE stored SELECT\n// values for the risk-level chip and the payment-mismatch chip.\nconst RISK_BY_LOWER: Record<string, RiskLevelValue> = {\n  verde: 'VERDE',\n  amarelo: 'AMARELO',\n  vermelho: 'VERMELHO',\n};\n\nconst MISMATCH_BY_LOWER: Record<string, PaymentMismatch> = {\n  unknown: 'UNKNOWN',\n  match: 'MATCH',\n  mismatch: 'MISMATCH',\n};\n\n// Pull the first balanced JSON object out of arbitrary model text, tolerating\n// ```json code fences and leading/trailing prose.\nconst extractJsonObject = (raw: string): string | undefined => {\n  const withoutFences = raw\n    .replace(/```json/gi, '```')\n    .replace(/```/g, '')\n    .trim();\n\n  const start = withoutFences.indexOf('{');\n\n  if (start < 0) {\n    return undefined;\n  }\n\n  let depth = 0;\n\n  for (let index = start; index < withoutFences.length; index++) {\n    const char = withoutFences[index];\n\n    if (char === '{') {\n      depth++;\n    } else if (char === '}') {\n      depth--;\n\n      if (depth === 0) {\n        return withoutFences.slice(start, index + 1);\n      }\n    }\n  }\n\n  return undefined;\n};\n\n// Best-effort repair of a JSON object truncated mid-generation (verbose models\n// hitting max_tokens): close any open string and brackets, dropping the last\n// partial token. Returns a candidate string to try parsing, or undefined.\nconst repairTruncatedJson = (raw: string): string | undefined => {\n  const text = raw.replace(/```json/gi, '```').replace(/```/g, '').trim();\n  const start = text.indexOf('{');\n\n  if (start < 0) {\n    return undefined;\n  }\n\n  const stack: string[] = [];\n  let inString = false;\n  let escaped = false;\n\n  for (let index = start; index < text.length; index++) {\n    const char = text[index];\n\n    if (inString) {\n      if (escaped) {\n        escaped = false;\n      } else if (char === '\\\\') {\n        escaped = true;\n      } else if (char === '\"') {\n        inString = false;\n      }\n      continue;\n    }\n\n    if (char === '\"') {\n      inString = true;\n    } else if (char === '{') {\n      stack.push('}');\n    } else if (char === '[') {\n      stack.push(']');\n    } else if (char === '}' || char === ']') {\n      stack.pop();\n    }\n  }\n\n  let repaired = text.slice(start);\n\n  if (inString) {\n    repaired += '\"';\n  }\n\n  // Drop a dangling comma or an incomplete trailing \"key\": fragment.\n  repaired = repaired.replace(/,\\s*\"[^\"]*\"?\\s*:?\\s*$/, '').replace(/,\\s*$/, '');\n\n  for (let index = stack.length - 1; index >= 0; index--) {\n    repaired += stack[index];\n  }\n\n  return repaired;\n};\n\nconst normalizeSeverity = (value: unknown): FindingSeverity => {\n  if (typeof value === 'string') {\n    const lowered = value.trim().toLowerCase();\n\n    if ((SEVERITIES as readonly string[]).includes(lowered)) {\n      return lowered as FindingSeverity;\n    }\n  }\n\n  // Unknown severity defaults to \"amarelo\" (needs attention), never \"verde\".\n  return 'amarelo';\n};\n\nconst normalizeRisk = (value: unknown): RiskLevelValue => {\n  if (typeof value === 'string') {\n    const mapped = RISK_BY_LOWER[value.trim().toLowerCase()];\n\n    if (isDefined(mapped)) {\n      return mapped;\n    }\n  }\n\n  return 'AMARELO';\n};\n\nconst normalizeMismatch = (value: unknown): PaymentMismatch => {\n  if (typeof value === 'string') {\n    const mapped = MISMATCH_BY_LOWER[value.trim().toLowerCase()];\n\n    if (isDefined(mapped)) {\n      return mapped;\n    }\n  }\n\n  return 'UNKNOWN';\n};\n\nconst normalizeFindings = (value: unknown): AiFinding[] => {\n  if (!Array.isArray(value)) {\n    return [];\n  }\n\n  return value\n    .map((entry): AiFinding | undefined => {\n      if (entry === null || typeof entry !== 'object') {\n        return undefined;\n      }\n\n      const record = entry as Record<string, unknown>;\n      const issue = typeof record.issue === 'string' ? record.issue.trim() : '';\n\n      if (!isNonEmptyString(issue)) {\n        return undefined;\n      }\n\n      const severity = normalizeSeverity(record.severity);\n\n      return {\n        clause:\n          typeof record.clause === 'string' && record.clause.trim() !== ''\n            ? record.clause.trim()\n            : 'Geral',\n        severity,\n        issue,\n        recommendation:\n          typeof record.recommendation === 'string'\n            ? record.recommendation.trim()\n            : '',\n        // Default vermelho to manual review even if the flag is missing.\n        requiresManualReview:\n          record.requiresManualReview === true || severity === 'vermelho',\n      };\n    })\n    .filter((finding): finding is AiFinding => isDefined(finding));\n};\n\nconst toNullableString = (value: unknown): string | null =>\n  typeof value === 'string' && value.trim() !== '' ? value.trim() : null;\n\nexport class AiReviewParseError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'AiReviewParseError';\n  }\n}\n\nconst tryParseObject = (candidate: string): unknown | undefined => {\n  try {\n    return JSON.parse(candidate);\n  } catch {\n    return undefined;\n  }\n};\n\nexport const parseAiReview = (raw: string): AiReviewResult => {\n  const jsonText = extractJsonObject(raw);\n\n  // Fall back to repairing a truncated object before giving up.\n  let parsed: unknown = isDefined(jsonText)\n    ? tryParseObject(jsonText)\n    : undefined;\n\n  if (parsed === undefined) {\n    const repaired = repairTruncatedJson(raw);\n    parsed = isDefined(repaired) ? tryParseObject(repaired) : undefined;\n  }\n\n  if (parsed === undefined) {\n    const snippet = raw.trim().slice(0, 200).replace(/\\s+/g, ' ');\n    throw new AiReviewParseError(\n      `No parseable JSON object in the model response (starts with: \"${snippet}\").`,\n    );\n  }\n\n  if (parsed === null || typeof parsed !== 'object') {\n    throw new AiReviewParseError('Model response JSON was not an object.');\n  }\n\n  const record = parsed as Record<string, unknown>;\n  const findings = normalizeFindings(record.findings);\n  const summary =\n    typeof record.summary === 'string' && record.summary.trim() !== ''\n      ? record.summary.trim()\n      : 'Contrato revisado.';\n\n  return {\n    overallRisk: normalizeRisk(record.overallRisk),\n    paymentMismatch: normalizeMismatch(record.paymentMismatch),\n    customerPaymentTerms: toNullableString(record.customerPaymentTerms),\n    supplierPaymentTerms: toNullableString(record.supplierPaymentTerms),\n    summary,\n    findings,\n  };\n};\n", "// A ordem importa: \"parcela \u00FAnica\" cont\u00E9m \"parcela\". Sem checar o pagamento \u00E0\n// vista primeiro, um pagamento \u00FAnico seria lido como parcelado.\nconst SINGLE_PAYMENT_PATTERNS = [\n  /parcela\\s+[\u00FAu]nica/i,\n  /pagamento\\s+[\u00FAu]nico/i,\n  /\\b[\u00E0a]\\s+vista\\b/i,\n  /\\bupfront\\b/i,\n  /lump\\s+sum/i,\n];\n\nconst INSTALLMENT_PATTERNS = [\n  /parcelad/i, // parcelado, parcelada, parcelados\n  /parcelas/i,\n  /mensal/i, // mensal, mensalmente, mensalidade\n  /mensais/i,\n  /trimestral/i,\n  /semestral/i,\n  /recorrente/i,\n  /\\b\\d+\\s*(?:x|vezes)\\b/i, // \"12x\", \"12 vezes\"\n  /monthly/i,\n  /installment/i,\n];\n\n// Heur\u00EDstica de apoio sobre texto livre em pt-br: o texto descreve pagamento\n// parcelado/recorrente? Usada apenas para ESCALAR um veredito indeterminado da\n// revis\u00E3o, nunca para rebaixar um veredito expl\u00EDcito \u2014 ver `ai-review-contract`.\nexport const paysInInstallments = (\n  terms: string | null | undefined,\n): boolean => {\n  if (typeof terms !== 'string' || terms.trim() === '') {\n    return false;\n  }\n\n  if (SINGLE_PAYMENT_PATTERNS.some((pattern) => pattern.test(terms))) {\n    return false;\n  }\n\n  return INSTALLMENT_PATTERNS.some((pattern) => pattern.test(terms));\n};\n", "import {\n  type AttachmentNode,\n  type ContractRecord,\n} from 'src/types/attachment-node';\nimport { runCoreGraphql } from 'src/logic-functions/utils/run-core-graphql';\nimport { isDefined } from 'src/utils/is-defined';\n\ntype ContractQueryResult = {\n  contracts?: {\n    edges?: {\n      node?: {\n        id?: string | null;\n        name?: string | null;\n        paymentTermsCustomer?: string | null;\n        paymentTermsSupplier?: string | null;\n        status?: string | null;\n        submittedAt?: string | null;\n        decidedAt?: string | null;\n        submittedById?: string | null;\n        approverId?: string | null;\n        aiPaymentTermsSnapshot?: string | null;\n        updatedBy?: { workspaceMemberId?: string | null; name?: string | null } | null;\n        attachments?: { edges?: { node?: AttachmentNode }[] };\n      };\n    }[];\n  };\n};\n\n// Reads a Contract plus its attachments. Contract is this app's custom object,\n// which the generated client can't reliably query, so use raw GraphQL. Custom\n// objects automatically receive an `attachments` relation, and the Attachment\n// `file` FILES field is returned with a signed, fetchable `url` on read.\nexport const readContract = async ({\n  contractId,\n}: {\n  contractId: string;\n}): Promise<ContractRecord | undefined> => {\n  const result = await runCoreGraphql<ContractQueryResult>(\n    `query ReadContract($filter: ContractFilterInput) {\n      contracts(filter: $filter, first: 1) {\n        edges {\n          node {\n            id\n            name\n            paymentTermsCustomer\n            paymentTermsSupplier\n            status\n            submittedAt\n            decidedAt\n            submittedById\n            approverId\n            aiPaymentTermsSnapshot\n            updatedBy { workspaceMemberId name }\n            attachments {\n              edges {\n                node {\n                  id\n                  name\n                  fullPath\n                  createdAt\n                  file { fileId label extension url }\n                }\n              }\n            }\n          }\n        }\n      }\n    }`,\n    { filter: { id: { eq: contractId } } },\n  );\n\n  const node = result.contracts?.edges?.[0]?.node;\n\n  if (!isDefined(node) || !isDefined(node.id)) {\n    return undefined;\n  }\n\n  const attachments = (node.attachments?.edges ?? [])\n    .map((edge) => edge?.node)\n    .filter((attachment): attachment is AttachmentNode => isDefined(attachment));\n\n  return {\n    id: node.id,\n    name: node.name ?? null,\n    paymentTermsCustomer: node.paymentTermsCustomer ?? null,\n    paymentTermsSupplier: node.paymentTermsSupplier ?? null,\n    status: node.status ?? null,\n    submittedAt: node.submittedAt ?? null,\n    decidedAt: node.decidedAt ?? null,\n    submittedById: node.submittedById ?? null,\n    approverId: node.approverId ?? null,\n    aiPaymentTermsSnapshot: node.aiPaymentTermsSnapshot ?? null,\n    lastEditorWorkspaceMemberId: node.updatedBy?.workspaceMemberId ?? null,\n    attachments,\n  };\n};\n", "import { isDefined } from 'src/utils/is-defined';\n\nexport type PaymentTermsSnapshot = {\n  customer: string | null;\n  supplier: string | null;\n};\n\nconst isBlank = (value: string | null | undefined): boolean =>\n  !isDefined(value) || value.trim() === '';\n\nexport const parsePaymentTermsSnapshot = (\n  raw: string | null,\n): PaymentTermsSnapshot => {\n  if (isBlank(raw)) {\n    return { customer: null, supplier: null };\n  }\n\n  try {\n    const parsed = JSON.parse(raw as string) as Partial<PaymentTermsSnapshot>;\n\n    return {\n      customer: typeof parsed.customer === 'string' ? parsed.customer : null,\n      supplier: typeof parsed.supplier === 'string' ? parsed.supplier : null,\n    };\n  } catch {\n    return { customer: null, supplier: null };\n  }\n};\n\nexport const serializePaymentTermsSnapshot = (\n  snapshot: PaymentTermsSnapshot,\n): string => JSON.stringify(snapshot);\n\n// Decides what a review may write into a payment-terms field.\n//\n// Empty field            -> write what the review extracted.\n// Field the review wrote -> overwrite; the previous value described the previous\n//                           version of the contract and is now stale.\n// Field a human typed    -> keep. The review reads it as an input (it goes in the\n//                           prompt), so silently replacing it would erase what\n//                           the person asserted about the deal.\nexport const resolvePaymentTerm = ({\n  current,\n  extracted,\n  previouslyWrittenByAi,\n}: {\n  current: string | null;\n  extracted: string | null;\n  previouslyWrittenByAi: string | null;\n}): string | undefined => {\n  if (isBlank(current)) {\n    return extracted ?? undefined;\n  }\n\n  const isOwnPreviousOutput =\n    isDefined(previouslyWrittenByAi) &&\n    current?.trim() === previouslyWrittenByAi.trim();\n\n  if (isOwnPreviousOutput && isDefined(extracted) && extracted.trim() !== '') {\n    return extracted;\n  }\n\n  return undefined;\n};\n", "import { DEFAULT_SUPPLIER_PAYMENT_TERMS_SHORT } from 'src/constants/payment-terms';\n\n// Playbook de revis\u00E3o de contratos da Excelium Tech (jurisdi\u00E7\u00E3o Brasil). O\n// modelo responde SEMPRE em portugu\u00EAs do Brasil, com JSON estruturado compacto\n// \u2014 a an\u00E1lise leg\u00EDvel (Nota) e as Tasks de revis\u00E3o s\u00E3o montadas no c\u00F3digo.\nexport const REVIEW_SYSTEM_PROMPT = [\n  'Voc\u00EA \u00E9 um assistente de revis\u00E3o de contratos do time jur\u00EDdico interno da Excelium Tech.',\n  'Responda SEMPRE em portugu\u00EAs do Brasil.',\n  'Jurisdi\u00E7\u00E3o prim\u00E1ria: Brasil. Base legal: C\u00F3digo Civil (Lei 10.406/2002), LGPD (Lei 13.709/2018) e CDC (Lei 8.078/1990) quando houver rela\u00E7\u00E3o de consumo.',\n  'Voc\u00EA auxilia o fluxo jur\u00EDdico, mas N\u00C3O fornece aconselhamento jur\u00EDdico; toda an\u00E1lise deve ser revisada por um profissional habilitado.',\n  'Leia o contrato inteiro antes de sinalizar problemas \u2014 as cl\u00E1usulas interagem.',\n  'Analise as cl\u00E1usulas relevantes: limita\u00E7\u00E3o de responsabilidade, indeniza\u00E7\u00E3o/indenidade, propriedade intelectual, prote\u00E7\u00E3o de dados (LGPD/APD), vig\u00EAncia e rescis\u00E3o, foro e lei aplic\u00E1vel, exclusividade, confidencialidade e SLAs.',\n  'Preste aten\u00E7\u00E3o especial \u00E0 consist\u00EAncia das condi\u00E7\u00F5es de pagamento entre o que o CLIENTE paga e o que pagamos ao FORNECEDOR: um descasamento de fluxo de caixa (ex.: cliente paga mensalmente enquanto o fornecedor \u00E9 pago em parcela \u00FAnica antecipada) \u00E9 achado de alta severidade.',\n  `Posi\u00E7\u00E3o padr\u00E3o da Excelium para pagamento ao fornecedor: ${DEFAULT_SUPPLIER_PAYMENT_TERMS_SHORT}. \u00C9 parcela \u00DANICA \u2014 nunca parcelada.`,\n  'Se o contrato for omisso quanto ao pagamento ao fornecedor, N\u00C3O invente cl\u00E1usula: retorne supplierPaymentTerms=null; ainda assim avalie o descasamento de caixa assumindo esse padr\u00E3o, em vez de responder \"unknown\".',\n  'REGRA CR\u00CDTICA de fluxo de caixa: se o CLIENTE paga de forma parcelada ou recorrente (mensal, trimestral, em N vezes) enquanto o FORNECEDOR \u00E9 pago em parcela \u00FAnica, h\u00E1 descasamento \u2014 recebemos ao longo do tempo mas desembolsamos de uma vez.',\n  'Nesse caso responda paymentMismatch=\"mismatch\" e inclua obrigatoriamente um achado da cl\u00E1usula de pagamento com severity=\"vermelho\" e requiresManualReview=true, mesmo que as condi\u00E7\u00F5es do fornecedor venham do padr\u00E3o e n\u00E3o de cl\u00E1usula expressa.',\n  'Classifique cada achado pela gravidade do desvio: \"verde\" = aceit\u00E1vel (alinhado \u00E0 posi\u00E7\u00E3o padr\u00E3o); \"amarelo\" = negociar (fora do padr\u00E3o, mas negoci\u00E1vel); \"vermelho\" = escalar (fora do limite aceit\u00E1vel ou risco material, exige advogado s\u00EAnior).',\n  'Marque requiresManualReview=true para todo achado vermelho e para amarelos que exijam decis\u00E3o humana.',\n  'Seja preciso e conservador. N\u00E3o invente cl\u00E1usulas que n\u00E3o existem.',\n  'Responda com APENAS um \u00FAnico objeto JSON compacto, sem prosa, sem cercas de c\u00F3digo, sem markdown.',\n].join(' ');\n\n// Como o contrato chegou ao modelo: PDF anexado, texto extra\u00EDdo de um Word/RTF,\n// ou nada al\u00E9m dos campos estruturados.\nexport type ReviewDocumentSource = 'pdf' | 'text' | 'none';\n\nexport type ReviewPromptContext = {\n  contractName?: string | null;\n  paymentTermsCustomer?: string | null;\n  paymentTermsSupplier?: string | null;\n  documentSource: ReviewDocumentSource;\n};\n\nconst JSON_SCHEMA_INSTRUCTIONS = [\n  'Retorne um objeto JSON com exatamente estas chaves (todo o conte\u00FAdo textual em portugu\u00EAs do Brasil):',\n  '{',\n  '  \"overallRisk\": \"verde\" | \"amarelo\" | \"vermelho\",   // risco geral do contrato',\n  '  \"paymentMismatch\": \"match\" | \"mismatch\" | \"unknown\",',\n  '  \"customerPaymentTerms\": string | null,   // como o cliente paga; <= 140 caracteres',\n  '  \"supplierPaymentTerms\": string | null,   // como pagamos o fornecedor; null se o contrato for omisso; <= 140 caracteres',\n  '  \"summary\": string,                        // resumo executivo em 1-2 frases; <= 220 caracteres',\n  '  \"findings\": [                             // no m\u00E1ximo 6 achados, mais graves primeiro',\n  '    {',\n  '      \"clause\": string,          // nome/tema da cl\u00E1usula (ex.: \"Limita\u00E7\u00E3o de responsabilidade\")',\n  '      \"severity\": \"verde\" | \"amarelo\" | \"vermelho\",',\n  '      \"issue\": string,           // o problema identificado, objetivo; <= 160 caracteres',\n  '      \"recommendation\": string,  // a\u00E7\u00E3o/reda\u00E7\u00E3o sugerida, objetiva; <= 160 caracteres',\n  '      \"requiresManualReview\": boolean',\n  '    }',\n  '  ]',\n  '}',\n  'Seja objetivo e telegr\u00E1fico em cada campo; respeite rigorosamente os limites de caracteres.',\n  'Defina overallRisk como o maior n\u00EDvel de risco entre os achados.',\n  'Defina paymentMismatch como \"mismatch\" quando as condi\u00E7\u00F5es de pagamento de cliente e fornecedor',\n  'gerarem descasamento de caixa, \"match\" quando alinhadas e \"unknown\" quando n\u00E3o for poss\u00EDvel determinar.',\n  `Quando SOMENTE o pagamento ao fornecedor for omisso, decida entre \"match\" e \"mismatch\" assumindo o padr\u00E3o de ${DEFAULT_SUPPLIER_PAYMENT_TERMS_SHORT};`,\n  'reserve \"unknown\" para os casos em que as condi\u00E7\u00F5es do CLIENTE tamb\u00E9m forem indeterminadas.',\n].join('\\n');\n\nexport const buildReviewUserText = (context: ReviewPromptContext): string => {\n  const lines: string[] = [];\n\n  if (context.documentSource === 'pdf') {\n    lines.push('O PDF anexado \u00E9 o contrato a revisar. Analise todo o texto.');\n  } else if (context.documentSource === 'text') {\n    lines.push(\n      'O texto dentro da tag <contrato> foi extra\u00EDdo do arquivo Word/RTF anexado e \u00E9 o contrato a revisar. Analise todo o texto.',\n      'A extra\u00E7\u00E3o preserva o texto das cl\u00E1usulas, mas perde formata\u00E7\u00E3o (negrito, tabelas, numera\u00E7\u00E3o autom\u00E1tica). N\u00E3o trate uma cl\u00E1usula como ausente s\u00F3 por causa disso.',\n    );\n  } else {\n    lines.push(\n      'Nenhum arquivo do contrato est\u00E1 dispon\u00EDvel. Analise apenas os campos estruturados abaixo.',\n    );\n  }\n\n  if (context.contractName) {\n    lines.push(`Nome do contrato: ${context.contractName}`);\n  }\n\n  if (context.paymentTermsCustomer) {\n    lines.push(`Condi\u00E7\u00F5es de pagamento do cliente (informado): ${context.paymentTermsCustomer}`);\n  }\n\n  if (context.paymentTermsSupplier) {\n    lines.push(`Condi\u00E7\u00F5es de pagamento do fornecedor (informado): ${context.paymentTermsSupplier}`);\n  } else {\n    lines.push(\n      `Condi\u00E7\u00F5es de pagamento do fornecedor: n\u00E3o informadas. Se o contrato tamb\u00E9m for omisso, assuma o padr\u00E3o da Excelium \u2014 ${DEFAULT_SUPPLIER_PAYMENT_TERMS_SHORT} \u2014 ao avaliar o descasamento de caixa.`,\n    );\n  }\n\n  lines.push('', JSON_SCHEMA_INSTRUCTIONS);\n\n  return lines.join('\\n');\n};\n", "import {\n  ANTHROPIC_API_VERSION,\n  ANTHROPIC_MESSAGES_URL,\n} from 'src/constants/llm-model';\nimport {\n  buildReviewUserText,\n  REVIEW_SYSTEM_PROMPT,\n  type ReviewPromptContext,\n} from 'src/logic-functions/utils/build-review-prompt';\nimport { isDefined } from 'src/utils/is-defined';\n\ntype FetchImpl = typeof fetch;\n\ntype AnthropicContentBlock =\n  | {\n      type: 'document';\n      source: { type: 'base64'; media_type: 'application/pdf'; data: string };\n    }\n  | { type: 'text'; text: string };\n\nexport type RequestLlmReviewParams = {\n  apiKey: string;\n  model: string;\n  pdfBase64?: string;\n  // Plain text extracted from a Word/RTF contract, when the source was not a PDF.\n  documentText?: string;\n  context: ReviewPromptContext;\n  maxRetries?: number;\n  fetchImpl?: FetchImpl;\n  // Injectable so retries do not actually sleep in unit tests.\n  sleep?: (ms: number) => Promise<void>;\n};\n\nexport class LlmRequestError extends Error {\n  constructor(\n    message: string,\n    readonly statusCode?: number,\n  ) {\n    super(message);\n    this.name = 'LlmRequestError';\n  }\n}\n\nconst defaultSleep = (ms: number): Promise<void> =>\n  new Promise((resolve) => setTimeout(resolve, ms));\n\nconst isRetryableStatus = (status: number): boolean =>\n  status === 429 || status >= 500;\n\n// Pull Anthropic's error message out of the response body so a 400/401 says why\n// (bad model, invalid key, etc.) instead of just a bare status code.\nconst readErrorDetail = async (response: Response): Promise<string> => {\n  try {\n    const body = await response.text();\n\n    if (!isDefined(body) || body.trim() === '') {\n      return '';\n    }\n\n    try {\n      const parsed = JSON.parse(body) as { error?: { message?: string } };\n      const message = parsed?.error?.message;\n\n      if (typeof message === 'string' && message.trim() !== '') {\n        return message.trim().slice(0, 300);\n      }\n    } catch {\n      // not JSON; fall through to the raw body\n    }\n\n    return body.trim().slice(0, 300);\n  } catch {\n    return '';\n  }\n};\n\nconst extractText = (payload: unknown): string => {\n  if (payload === null || typeof payload !== 'object') {\n    throw new LlmRequestError('Anthropic response was not an object.');\n  }\n\n  const content = (payload as { content?: unknown }).content;\n\n  if (!Array.isArray(content)) {\n    throw new LlmRequestError('Anthropic response had no content array.');\n  }\n\n  const text = content\n    .map((block) =>\n      block !== null &&\n      typeof block === 'object' &&\n      (block as { type?: unknown }).type === 'text' &&\n      typeof (block as { text?: unknown }).text === 'string'\n        ? (block as { text: string }).text\n        : '',\n    )\n    .join('')\n    .trim();\n\n  if (text === '') {\n    const blockTypes = content\n      .map((block) =>\n        block !== null && typeof block === 'object'\n          ? String((block as { type?: unknown }).type)\n          : 'unknown',\n      )\n      .join(',');\n    const stopReason = (payload as { stop_reason?: unknown }).stop_reason;\n\n    throw new LlmRequestError(\n      `Anthropic response had no text content (stop_reason=${String(\n        stopReason,\n      )}, blocks=[${blockTypes}]).`,\n    );\n  }\n\n  return text;\n};\n\n// Calls the Anthropic Messages API with the PDF as a document block (when\n// available) at low temperature, retrying transient failures with backoff.\n// Returns the raw model text (JSON) for parseAiReview to normalize.\nexport const requestLlmReview = async ({\n  apiKey,\n  model,\n  pdfBase64,\n  documentText,\n  context,\n  maxRetries = 3,\n  fetchImpl = fetch,\n  sleep = defaultSleep,\n}: RequestLlmReviewParams): Promise<string> => {\n  const content: AnthropicContentBlock[] = [];\n\n  if (isDefined(pdfBase64)) {\n    content.push({\n      type: 'document',\n      source: { type: 'base64', media_type: 'application/pdf', data: pdfBase64 },\n    });\n  } else if (isDefined(documentText)) {\n    // Word/RTF have no native document block, so the extracted text goes in\n    // delimited to keep it clearly separated from the instructions.\n    content.push({\n      type: 'text',\n      text: `<contrato>\\n${documentText}\\n</contrato>`,\n    });\n  }\n\n  content.push({ type: 'text', text: buildReviewUserText(context) });\n\n  // No `temperature`: newer Anthropic models reject it (\"temperature is\n  // deprecated for this model\"), and the JSON review does not need it.\n  const body = JSON.stringify({\n    model,\n    max_tokens: 8192,\n    system: REVIEW_SYSTEM_PROMPT,\n    messages: [{ role: 'user', content }],\n  });\n\n  let lastError: LlmRequestError | undefined;\n\n  for (let attempt = 0; attempt <= maxRetries; attempt++) {\n    let response: Response;\n\n    try {\n      response = await fetchImpl(ANTHROPIC_MESSAGES_URL, {\n        method: 'POST',\n        headers: {\n          'content-type': 'application/json',\n          'x-api-key': apiKey,\n          'anthropic-version': ANTHROPIC_API_VERSION,\n        },\n        body,\n      });\n    } catch (error) {\n      lastError = new LlmRequestError(\n        `Network error calling Anthropic: ${\n          error instanceof Error ? error.message : String(error)\n        }`,\n      );\n\n      if (attempt < maxRetries) {\n        await sleep(2 ** attempt * 500);\n        continue;\n      }\n\n      throw lastError;\n    }\n\n    if (response.ok) {\n      return extractText(await response.json());\n    }\n\n    const detail = await readErrorDetail(response);\n\n    lastError = new LlmRequestError(\n      `Anthropic request failed with status ${response.status}${\n        detail ? `: ${detail}` : '.'\n      }`,\n      response.status,\n    );\n\n    if (isRetryableStatus(response.status) && attempt < maxRetries) {\n      await sleep(2 ** attempt * 500);\n      continue;\n    }\n\n    throw lastError;\n  }\n\n  throw lastError ?? new LlmRequestError('Anthropic request failed.');\n};\n", "import { type AttachmentNode } from 'src/types/attachment-node';\nimport { isDefined } from 'src/utils/is-defined';\n\nexport type ResolvedContractAttachment = {\n  attachment: AttachmentNode;\n  url: string;\n};\n\nexport const REVIEWABLE_EXTENSIONS = ['pdf', 'docx', 'doc', 'rtf'] as const;\n\nconst normalize = (value: string | null | undefined): string =>\n  typeof value === 'string' ? value.trim().toLowerCase() : '';\n\nconst extensionOf = (value: string | null | undefined): string => {\n  const normalized = normalize(value);\n  const lastDot = normalized.lastIndexOf('.');\n\n  return lastDot === -1 ? '' : normalized.slice(lastDot + 1);\n};\n\nconst firstFile = (attachment: AttachmentNode) => attachment.file?.[0];\n\nconst attachmentUrl = (attachment: AttachmentNode): string | undefined => {\n  const url = firstFile(attachment)?.url;\n\n  return isDefined(url) && url.trim() !== '' ? url : undefined;\n};\n\nconst isReviewable = (attachment: AttachmentNode): boolean => {\n  const file = firstFile(attachment);\n  const candidates = [\n    extensionOf(attachment.name),\n    extensionOf(attachment.fullPath),\n    extensionOf(file?.label),\n    normalize(file?.extension).replace(/^\\./, ''),\n  ];\n\n  return candidates.some((candidate) =>\n    (REVIEWABLE_EXTENSIONS as readonly string[]).includes(candidate),\n  );\n};\n\nconst byNewestFirst = (a: AttachmentNode, b: AttachmentNode): number => {\n  const aTime = a.createdAt ? Date.parse(a.createdAt) : 0;\n  const bTime = b.createdAt ? Date.parse(b.createdAt) : 0;\n\n  return bTime - aTime;\n};\n\n// Picks the most-recent reviewable attachment (PDF, Word or RTF) that has a\n// fetchable signed URL. The extension only decides *which* file to read \u2014 the\n// real format is sniffed from the bytes after download, so a mislabeled file\n// still gets parsed correctly. Returns undefined when nothing looks reviewable,\n// and the caller falls through to the structured-fields-only review path.\nexport const selectContractAttachment = (\n  attachments: AttachmentNode[],\n): ResolvedContractAttachment | undefined => {\n  const candidate = attachments\n    .filter((attachment) => isDefined(attachmentUrl(attachment)))\n    .filter(isReviewable)\n    .sort(byNewestFirst)[0];\n\n  if (!isDefined(candidate)) {\n    return undefined;\n  }\n\n  const url = attachmentUrl(candidate);\n\n  if (!isDefined(url)) {\n    return undefined;\n  }\n\n  return { attachment: candidate, url };\n};\n", "import { runCoreGraphql } from 'src/logic-functions/utils/run-core-graphql';\n\nexport type ContractUpdateData = Record<string, unknown>;\n\n// updateContract targets this app's custom object, which the generated client\n// can't reliably mutate, so use raw GraphQL against the server.\nexport const updateContract = async ({\n  contractId,\n  data,\n}: {\n  contractId: string;\n  data: ContractUpdateData;\n}): Promise<void> => {\n  await runCoreGraphql(\n    `mutation UpdateContract($id: UUID!, $data: ContractUpdateInput!) {\n      updateContract(id: $id, data: $data) { id }\n    }`,\n    { id: contractId, data },\n  );\n};\n", "import { isUndefined } from '@sniptt/guards';\n\nexport const pruneUndefined = <TValue>(\n  record: Record<string, TValue | undefined>,\n): Record<string, TValue> => {\n  const pruned: Record<string, TValue> = {};\n\n  for (const [key, value] of Object.entries(record)) {\n    if (!isUndefined(value)) {\n      pruned[key] = value as TValue;\n    }\n  }\n\n  return pruned;\n};\n", "import { isObject } from '@sniptt/guards';\nimport { type RoutePayload } from 'twenty-sdk/define';\n\nimport { isDefined } from 'src/utils/is-defined';\n\n// A RoutePayload (HTTP route invocation) is detectable by its requestContext;\n// a workflow/tool invocation passes the input object directly.\nexport const isRoutePayload = <TBody>(\n  input: unknown,\n): input is RoutePayload<TBody> =>\n  isObject(input) && 'requestContext' in (input as Record<string, unknown>);\n\nexport const extractBody = <TBody>(\n  input: RoutePayload<TBody> | TBody,\n): TBody | undefined =>\n  isRoutePayload<TBody>(input) ? (input.body ?? undefined) : input;\n\nexport const extractUserWorkspaceId = (input: unknown): string | undefined => {\n  if (!isRoutePayload<unknown>(input)) {\n    return undefined;\n  }\n\n  const value = input.userWorkspaceId;\n\n  return isDefined(value) ? value : undefined;\n};\n\n// A database-event invocation carries `name` (e.g. \"contract.updated\") and a\n// top-level `recordId`. Detect it and return the record id so the same handler\n// can serve both the DB-event trigger and the HTTP route.\nexport const extractDatabaseEventRecordId = (\n  input: unknown,\n): string | undefined => {\n  if (!isObject(input)) {\n    return undefined;\n  }\n\n  const event = input as { name?: unknown; recordId?: unknown };\n\n  if (typeof event.name !== 'string' || !event.name.includes('.')) {\n    return undefined;\n  }\n\n  return typeof event.recordId === 'string' && event.recordId.trim() !== ''\n    ? event.recordId.trim()\n    : undefined;\n};\n\n// A workflow \"record\" input arrives as { id }, an HTTP body sends a plain\n// string. Normalize both to the record id.\nexport const normalizeRecordId = (value: unknown): string | undefined => {\n  if (typeof value === 'string' && value.trim() !== '') {\n    return value.trim();\n  }\n\n  if (isObject(value)) {\n    const id = (value as { id?: unknown }).id;\n\n    if (typeof id === 'string' && id.trim() !== '') {\n      return id.trim();\n    }\n  }\n\n  return undefined;\n};\n", "import { defineLogicFunction } from 'twenty-sdk/define';\n\nimport { LOGIC_FUNCTION_CONSTANTS, OBJECT_UNIVERSAL_IDENTIFIERS } from 'src/constants/universal-identifiers';\nimport { aiReviewContractCore } from 'src/logic-functions/handlers/ai-review-contract';\nimport {\n  extractBody,\n  extractDatabaseEventRecordId,\n  normalizeRecordId,\n} from 'src/logic-functions/utils/route-input';\nimport { type AiReviewInput, type AiReviewOutcome } from 'src/types/logic-function-io';\n\nconst handler = (input: unknown): Promise<AiReviewOutcome> => {\n  // Serves two triggers: the DATABASE_EVENT (contract.updated on status) and the\n  // HTTP route / manual exec ({ recordId } body).\n  const recordId =\n    extractDatabaseEventRecordId(input) ??\n    normalizeRecordId(extractBody<AiReviewInput>(input as never)?.recordId);\n\n  if (recordId === undefined) {\n    return Promise.resolve({\n      success: false,\n      recordId: '',\n      llmConfigured: false,\n      message: 'Missing recordId.',\n    });\n  }\n\n  return aiReviewContractCore({ input: { recordId } });\n};\n\nexport default defineLogicFunction({\n  universalIdentifier: LOGIC_FUNCTION_CONSTANTS.aiReview.universalIdentifier,\n  name: 'ai-review',\n  description:\n    \"Reviews a Contract's attached PDF with an LLM, writes structured findings and a payment-mismatch flag, and advances status to pending manager approval.\",\n  timeoutSeconds: 120,\n  handler,\n  // Runs automatically whenever a Contract's status changes \u2014 the handler only\n  // proceeds when it is PENDING_AI_REVIEW \u2014 so the review fires no matter how the\n  // contract got there (Submit command or a manual status change).\n  databaseEventTriggerSettings: {\n    eventName: 'contract.updated',\n    updatedFields: ['status'],\n  },\n  httpRouteTriggerSettings: {\n    path: LOGIC_FUNCTION_CONSTANTS.aiReview.path,\n    httpMethod: 'POST',\n    isAuthRequired: true,\n  },\n  workflowActionTriggerSettings: {\n    label: 'AI review contract',\n    icon: 'IconSparkles',\n    inputSchema: [\n      {\n        type: 'object',\n        properties: {\n          recordId: {\n            type: 'record',\n            objectUniversalIdentifier: OBJECT_UNIVERSAL_IDENTIFIERS.contract,\n            label: 'Contract',\n          },\n        },\n      },\n    ],\n    outputSchema: [\n      {\n        type: 'object',\n        properties: {\n          success: { type: 'boolean', label: 'Success' },\n          recordId: { type: 'string', label: 'Record Id' },\n          status: { type: 'string', label: 'Status' },\n          paymentMismatch: { type: 'string', label: 'Payment Mismatch' },\n          llmConfigured: { type: 'boolean', label: 'LLM Configured' },\n          message: { type: 'string', label: 'Message' },\n        },\n      },\n    ],\n  },\n});\n"],
  "mappings": "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",
  "names": ["isUndefined", "isNull", "isObject", "isNonEmptyString", "import_guards", "import_guards", "import_guards", "import_guards", "import_guards"]
}
