Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion packages/docs/src/pages/index.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -1169,9 +1169,11 @@
font-size: 0.8rem;
color: rgba(0, 255, 255, 0.8);
margin-bottom: 0.75rem;
display: inline-flex;
/* display: inline-flex; */
align-items: center;
gap: 0.35rem;
text-align: center;
justify-content: center;
}

.sectionHeading {
Expand Down
10 changes: 4 additions & 6 deletions packages/docs/src/pages/jlinc-partnership.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ function PartnershipHero() {
<ThreeJsScene className={styles.threeJsCanvas} />
</div>
<div className={styles.heroContent}>
<div className={styles.heroEyebrow}>Strategic Partnership Announcement</div>
<h1 className={styles.heroTitle}>Cryptographically-Verifiable AI Collaboration</h1>
<p className={styles.heroSubtitle} style={{ fontSize: '1.3rem', maxWidth: '800px', margin: '0 auto' }}>
Answer Agents × JLINC brings immutable data provenance to AI agent workflows—finally enabling trustworthy AI adoption in
Expand Down Expand Up @@ -1287,21 +1286,20 @@ export default function JLINCPartnership(): JSX.Element {
}}
/>
<PartnershipHero />
<UsingAnswerAgentAISubmenu />
<main>
<VisionSection />
<ProblemSection />
<SolutionSection />
<ComparisonSection />
<BenefitsSection />
<IndustryUseCases />
<TechnicalArchitecture />
{/* <TechnicalArchitecture /> */}
<AboutJLINCSection />
<ImplementationRoadmap />
<PartnershipVisionSection />
{/* <ImplementationRoadmap /> */}
{/* <PartnershipVisionSection /> */}
<FAQSection />
<DemoCTASection />
<CoFooter />
{/* <CoFooter /> */}
</main>
</Layout>
</div>
Expand Down
4 changes: 2 additions & 2 deletions packages/docs/src/theme/Layout/styles.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@
}

/* Push everything down to account for the fixed banner */
:global(body) {
padding-top: 54px !important;
:global(.navbar) {
top: 54px !important;
}
Comment on lines 82 to 85

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep body content offset when fixed webinar banner is shown

Previously the layout applied padding-top: 54px to the body to push all content below the fixed webinar banner. The change now only offsets .navbar, so the main content still starts at the top of the viewport while the banner remains fixed at top: 0, leaving the first ~54 px of content hidden under the banner when it is active. Consider preserving the body offset (or adding equivalent margin to the main wrapper) so the banner doesn’t obscure page content.

Useful? React with 👍 / 👎.


/* Remove padding for webinar pages and hide navbar */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,15 @@ export class AddUniqueConstraintDefaultChatflows1753000000001 implements Migrati
name = 'AddUniqueConstraintDefaultChatflows1753000000001'

public async up(queryRunner: QueryRunner): Promise<void> {
// NOTE: Before running this migration, you should manually clean up duplicate chatflows
// using the SQL scripts provided:
// 1. Run 1-analyze-duplicate-chatflows.sql to see duplicates
// 2. Run 2-generate-cleanup-statements.sql to get DELETE statements
// 3. Manually execute the DELETE statements after reviewing them
// 4. Then run this migration to add the unique constraint

// Check if there are any remaining duplicates before adding the constraint
// Automatically clean up duplicate chatflows, keeping the most recently updated one

// First, check if there are any duplicates
const duplicateCheck = await queryRunner.query(`
SELECT COUNT(*) as duplicate_count
FROM (
SELECT "userId", "parentChatflowId"
FROM "chat_flow"
WHERE "parentChatflowId" IS NOT NULL
WHERE "parentChatflowId" IS NOT NULL
AND "deletedDate" IS NULL
GROUP BY "userId", "parentChatflowId"
HAVING COUNT(*) > 1
Expand All @@ -27,21 +22,40 @@ export class AddUniqueConstraintDefaultChatflows1753000000001 implements Migrati
const duplicateCount = parseInt(duplicateCheck[0]?.duplicate_count || '0')

if (duplicateCount > 0) {
throw new Error(
`Cannot add unique constraint: ${duplicateCount} duplicate chatflow groups still exist. ` +
`Please run the manual cleanup scripts first:\n` +
`1. 1-analyze-duplicate-chatflows.sql\n` +
`2. 2-generate-cleanup-statements.sql\n` +
`3. Manually execute the DELETE statements\n` +
`4. Then re-run this migration`
)
console.log(`Found ${duplicateCount} duplicate chatflow groups. Cleaning up automatically...`)

// Delete duplicate chatflows, keeping only the most recently updated one for each group
const deleteResult = await queryRunner.query(`
DELETE FROM "chat_flow"
WHERE id IN (
SELECT cf.id
FROM "chat_flow" cf
INNER JOIN (
SELECT
"userId",
"parentChatflowId",
MAX("updatedDate") as max_updated_date
FROM "chat_flow"
WHERE "parentChatflowId" IS NOT NULL
AND "deletedDate" IS NULL
GROUP BY "userId", "parentChatflowId"
HAVING COUNT(*) > 1
) duplicates
ON cf."userId" = duplicates."userId"
AND cf."parentChatflowId" = duplicates."parentChatflowId"
WHERE cf."deletedDate" IS NULL
AND cf."updatedDate" < duplicates.max_updated_date
)
Comment on lines +27 to +48

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Ensure duplicate cleanup handles rows with identical updatedDate

The new automatic cleanup deletes duplicates only when updatedDate is strictly less than the group’s MAX(updatedDate). If two or more chatflows in the same (userId, parentChatflowId) group have the exact same updatedDate (for example, cloned records saved in the same transaction), none of them satisfy < max_updated_date, so duplicates remain and the subsequent unique index creation will fail with a constraint violation. Consider deleting all but one record per group using a deterministic tie breaker (e.g., ROW_NUMBER over updatedDate DESC, id DESC) or re-checking for duplicates after the delete before adding the index.

Useful? React with 👍 / 👎.

`)

console.log(`Deleted ${deleteResult[1]} duplicate chatflow records`)
}

// Add the unique constraint
// This prevents multiple default chatflows from the same template for the same user
await queryRunner.query(`
CREATE UNIQUE INDEX "idx_unique_user_parent_chatflow"
ON "chat_flow" ("userId", "parentChatflowId")
CREATE UNIQUE INDEX "idx_unique_user_parent_chatflow"
ON "chat_flow" ("userId", "parentChatflowId")
WHERE "parentChatflowId" IS NOT NULL AND "deletedDate" IS NULL
`)
}
Expand Down
Loading