feat: add auth/access foundation - deps, DB schema, shared types, and config
Add Better Auth, drizzle-orm, @dnd-kit, and remark-gfm dependencies. Introduce DB schema for auth tables (user, session, account, verification), company memberships, instance user roles, permission grants, invites, and join requests. Add assigneeUserId to issues. Extend shared config schema with deployment mode/exposure/auth settings, add access types and validators, and wire up new API path constants. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -19,6 +19,7 @@
|
|||||||
"@paperclip/db": "workspace:*",
|
"@paperclip/db": "workspace:*",
|
||||||
"@paperclip/server": "workspace:*",
|
"@paperclip/server": "workspace:*",
|
||||||
"@paperclip/shared": "workspace:*",
|
"@paperclip/shared": "workspace:*",
|
||||||
|
"drizzle-orm": "0.38.4",
|
||||||
"dotenv": "^17.0.1",
|
"dotenv": "^17.0.1",
|
||||||
"commander": "^13.1.0",
|
"commander": "^13.1.0",
|
||||||
"picocolors": "^1.1.1"
|
"picocolors": "^1.1.1"
|
||||||
|
|||||||
135
packages/db/src/migrations/0014_many_mikhail_rasputin.sql
Normal file
135
packages/db/src/migrations/0014_many_mikhail_rasputin.sql
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
CREATE TABLE "account" (
|
||||||
|
"id" text PRIMARY KEY NOT NULL,
|
||||||
|
"account_id" text NOT NULL,
|
||||||
|
"provider_id" text NOT NULL,
|
||||||
|
"user_id" text NOT NULL,
|
||||||
|
"access_token" text,
|
||||||
|
"refresh_token" text,
|
||||||
|
"id_token" text,
|
||||||
|
"access_token_expires_at" timestamp with time zone,
|
||||||
|
"refresh_token_expires_at" timestamp with time zone,
|
||||||
|
"scope" text,
|
||||||
|
"password" text,
|
||||||
|
"created_at" timestamp with time zone NOT NULL,
|
||||||
|
"updated_at" timestamp with time zone NOT NULL
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE TABLE "session" (
|
||||||
|
"id" text PRIMARY KEY NOT NULL,
|
||||||
|
"expires_at" timestamp with time zone NOT NULL,
|
||||||
|
"token" text NOT NULL,
|
||||||
|
"created_at" timestamp with time zone NOT NULL,
|
||||||
|
"updated_at" timestamp with time zone NOT NULL,
|
||||||
|
"ip_address" text,
|
||||||
|
"user_agent" text,
|
||||||
|
"user_id" text NOT NULL
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE TABLE "user" (
|
||||||
|
"id" text PRIMARY KEY NOT NULL,
|
||||||
|
"name" text NOT NULL,
|
||||||
|
"email" text NOT NULL,
|
||||||
|
"email_verified" boolean DEFAULT false NOT NULL,
|
||||||
|
"image" text,
|
||||||
|
"created_at" timestamp with time zone NOT NULL,
|
||||||
|
"updated_at" timestamp with time zone NOT NULL
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE TABLE "verification" (
|
||||||
|
"id" text PRIMARY KEY NOT NULL,
|
||||||
|
"identifier" text NOT NULL,
|
||||||
|
"value" text NOT NULL,
|
||||||
|
"expires_at" timestamp with time zone NOT NULL,
|
||||||
|
"created_at" timestamp with time zone,
|
||||||
|
"updated_at" timestamp with time zone
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE TABLE "company_memberships" (
|
||||||
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
||||||
|
"company_id" uuid NOT NULL,
|
||||||
|
"principal_type" text NOT NULL,
|
||||||
|
"principal_id" text NOT NULL,
|
||||||
|
"status" text DEFAULT 'active' NOT NULL,
|
||||||
|
"membership_role" text,
|
||||||
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||||
|
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE TABLE "instance_user_roles" (
|
||||||
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
||||||
|
"user_id" text NOT NULL,
|
||||||
|
"role" text DEFAULT 'instance_admin' NOT NULL,
|
||||||
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||||
|
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE TABLE "invites" (
|
||||||
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
||||||
|
"company_id" uuid,
|
||||||
|
"invite_type" text DEFAULT 'company_join' NOT NULL,
|
||||||
|
"token_hash" text NOT NULL,
|
||||||
|
"allowed_join_types" text DEFAULT 'both' NOT NULL,
|
||||||
|
"defaults_payload" jsonb,
|
||||||
|
"expires_at" timestamp with time zone NOT NULL,
|
||||||
|
"invited_by_user_id" text,
|
||||||
|
"revoked_at" timestamp with time zone,
|
||||||
|
"accepted_at" timestamp with time zone,
|
||||||
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||||
|
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE TABLE "join_requests" (
|
||||||
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
||||||
|
"invite_id" uuid NOT NULL,
|
||||||
|
"company_id" uuid NOT NULL,
|
||||||
|
"request_type" text NOT NULL,
|
||||||
|
"status" text DEFAULT 'pending_approval' NOT NULL,
|
||||||
|
"request_ip" text NOT NULL,
|
||||||
|
"requesting_user_id" text,
|
||||||
|
"request_email_snapshot" text,
|
||||||
|
"agent_name" text,
|
||||||
|
"adapter_type" text,
|
||||||
|
"capabilities" text,
|
||||||
|
"agent_defaults_payload" jsonb,
|
||||||
|
"created_agent_id" uuid,
|
||||||
|
"approved_by_user_id" text,
|
||||||
|
"approved_at" timestamp with time zone,
|
||||||
|
"rejected_by_user_id" text,
|
||||||
|
"rejected_at" timestamp with time zone,
|
||||||
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||||
|
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE TABLE "principal_permission_grants" (
|
||||||
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
||||||
|
"company_id" uuid NOT NULL,
|
||||||
|
"principal_type" text NOT NULL,
|
||||||
|
"principal_id" text NOT NULL,
|
||||||
|
"permission_key" text NOT NULL,
|
||||||
|
"scope" jsonb,
|
||||||
|
"granted_by_user_id" text,
|
||||||
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||||
|
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
ALTER TABLE "issues" ADD COLUMN "assignee_user_id" text;--> statement-breakpoint
|
||||||
|
ALTER TABLE "account" ADD CONSTRAINT "account_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
||||||
|
ALTER TABLE "session" ADD CONSTRAINT "session_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
||||||
|
ALTER TABLE "company_memberships" ADD CONSTRAINT "company_memberships_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
||||||
|
ALTER TABLE "invites" ADD CONSTRAINT "invites_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
||||||
|
ALTER TABLE "join_requests" ADD CONSTRAINT "join_requests_invite_id_invites_id_fk" FOREIGN KEY ("invite_id") REFERENCES "public"."invites"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
||||||
|
ALTER TABLE "join_requests" ADD CONSTRAINT "join_requests_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
||||||
|
ALTER TABLE "join_requests" ADD CONSTRAINT "join_requests_created_agent_id_agents_id_fk" FOREIGN KEY ("created_agent_id") REFERENCES "public"."agents"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
||||||
|
ALTER TABLE "principal_permission_grants" ADD CONSTRAINT "principal_permission_grants_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
||||||
|
CREATE UNIQUE INDEX "company_memberships_company_principal_unique_idx" ON "company_memberships" USING btree ("company_id","principal_type","principal_id");--> statement-breakpoint
|
||||||
|
CREATE INDEX "company_memberships_principal_status_idx" ON "company_memberships" USING btree ("principal_type","principal_id","status");--> statement-breakpoint
|
||||||
|
CREATE INDEX "company_memberships_company_status_idx" ON "company_memberships" USING btree ("company_id","status");--> statement-breakpoint
|
||||||
|
CREATE UNIQUE INDEX "instance_user_roles_user_role_unique_idx" ON "instance_user_roles" USING btree ("user_id","role");--> statement-breakpoint
|
||||||
|
CREATE INDEX "instance_user_roles_role_idx" ON "instance_user_roles" USING btree ("role");--> statement-breakpoint
|
||||||
|
CREATE UNIQUE INDEX "invites_token_hash_unique_idx" ON "invites" USING btree ("token_hash");--> statement-breakpoint
|
||||||
|
CREATE INDEX "invites_company_invite_state_idx" ON "invites" USING btree ("company_id","invite_type","revoked_at","expires_at");--> statement-breakpoint
|
||||||
|
CREATE UNIQUE INDEX "join_requests_invite_unique_idx" ON "join_requests" USING btree ("invite_id");--> statement-breakpoint
|
||||||
|
CREATE INDEX "join_requests_company_status_type_created_idx" ON "join_requests" USING btree ("company_id","status","request_type","created_at");--> statement-breakpoint
|
||||||
|
CREATE UNIQUE INDEX "principal_permission_grants_unique_idx" ON "principal_permission_grants" USING btree ("company_id","principal_type","principal_id","permission_key");--> statement-breakpoint
|
||||||
|
CREATE INDEX "principal_permission_grants_company_permission_idx" ON "principal_permission_grants" USING btree ("company_id","permission_key");--> statement-breakpoint
|
||||||
|
CREATE INDEX "issues_company_assignee_user_status_idx" ON "issues" USING btree ("company_id","assignee_user_id","status");
|
||||||
5187
packages/db/src/migrations/meta/0014_snapshot.json
Normal file
5187
packages/db/src/migrations/meta/0014_snapshot.json
Normal file
File diff suppressed because it is too large
Load Diff
47
packages/db/src/schema/auth.ts
Normal file
47
packages/db/src/schema/auth.ts
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
import { pgTable, text, timestamp, boolean } from "drizzle-orm/pg-core";
|
||||||
|
|
||||||
|
export const authUsers = pgTable("user", {
|
||||||
|
id: text("id").primaryKey(),
|
||||||
|
name: text("name").notNull(),
|
||||||
|
email: text("email").notNull(),
|
||||||
|
emailVerified: boolean("email_verified").notNull().default(false),
|
||||||
|
image: text("image"),
|
||||||
|
createdAt: timestamp("created_at", { withTimezone: true }).notNull(),
|
||||||
|
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const authSessions = pgTable("session", {
|
||||||
|
id: text("id").primaryKey(),
|
||||||
|
expiresAt: timestamp("expires_at", { withTimezone: true }).notNull(),
|
||||||
|
token: text("token").notNull(),
|
||||||
|
createdAt: timestamp("created_at", { withTimezone: true }).notNull(),
|
||||||
|
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull(),
|
||||||
|
ipAddress: text("ip_address"),
|
||||||
|
userAgent: text("user_agent"),
|
||||||
|
userId: text("user_id").notNull().references(() => authUsers.id, { onDelete: "cascade" }),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const authAccounts = pgTable("account", {
|
||||||
|
id: text("id").primaryKey(),
|
||||||
|
accountId: text("account_id").notNull(),
|
||||||
|
providerId: text("provider_id").notNull(),
|
||||||
|
userId: text("user_id").notNull().references(() => authUsers.id, { onDelete: "cascade" }),
|
||||||
|
accessToken: text("access_token"),
|
||||||
|
refreshToken: text("refresh_token"),
|
||||||
|
idToken: text("id_token"),
|
||||||
|
accessTokenExpiresAt: timestamp("access_token_expires_at", { withTimezone: true }),
|
||||||
|
refreshTokenExpiresAt: timestamp("refresh_token_expires_at", { withTimezone: true }),
|
||||||
|
scope: text("scope"),
|
||||||
|
password: text("password"),
|
||||||
|
createdAt: timestamp("created_at", { withTimezone: true }).notNull(),
|
||||||
|
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const authVerifications = pgTable("verification", {
|
||||||
|
id: text("id").primaryKey(),
|
||||||
|
identifier: text("identifier").notNull(),
|
||||||
|
value: text("value").notNull(),
|
||||||
|
expiresAt: timestamp("expires_at", { withTimezone: true }).notNull(),
|
||||||
|
createdAt: timestamp("created_at", { withTimezone: true }),
|
||||||
|
updatedAt: timestamp("updated_at", { withTimezone: true }),
|
||||||
|
});
|
||||||
29
packages/db/src/schema/company_memberships.ts
Normal file
29
packages/db/src/schema/company_memberships.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import { pgTable, uuid, text, timestamp, uniqueIndex, index } from "drizzle-orm/pg-core";
|
||||||
|
import { companies } from "./companies.js";
|
||||||
|
|
||||||
|
export const companyMemberships = pgTable(
|
||||||
|
"company_memberships",
|
||||||
|
{
|
||||||
|
id: uuid("id").primaryKey().defaultRandom(),
|
||||||
|
companyId: uuid("company_id").notNull().references(() => companies.id),
|
||||||
|
principalType: text("principal_type").notNull(),
|
||||||
|
principalId: text("principal_id").notNull(),
|
||||||
|
status: text("status").notNull().default("active"),
|
||||||
|
membershipRole: text("membership_role"),
|
||||||
|
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
||||||
|
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
|
||||||
|
},
|
||||||
|
(table) => ({
|
||||||
|
companyPrincipalUniqueIdx: uniqueIndex("company_memberships_company_principal_unique_idx").on(
|
||||||
|
table.companyId,
|
||||||
|
table.principalType,
|
||||||
|
table.principalId,
|
||||||
|
),
|
||||||
|
principalStatusIdx: index("company_memberships_principal_status_idx").on(
|
||||||
|
table.principalType,
|
||||||
|
table.principalId,
|
||||||
|
table.status,
|
||||||
|
),
|
||||||
|
companyStatusIdx: index("company_memberships_company_status_idx").on(table.companyId, table.status),
|
||||||
|
}),
|
||||||
|
);
|
||||||
@@ -1,5 +1,11 @@
|
|||||||
export { companies } from "./companies.js";
|
export { companies } from "./companies.js";
|
||||||
|
export { authUsers, authSessions, authAccounts, authVerifications } from "./auth.js";
|
||||||
|
export { instanceUserRoles } from "./instance_user_roles.js";
|
||||||
export { agents } from "./agents.js";
|
export { agents } from "./agents.js";
|
||||||
|
export { companyMemberships } from "./company_memberships.js";
|
||||||
|
export { principalPermissionGrants } from "./principal_permission_grants.js";
|
||||||
|
export { invites } from "./invites.js";
|
||||||
|
export { joinRequests } from "./join_requests.js";
|
||||||
export { agentConfigRevisions } from "./agent_config_revisions.js";
|
export { agentConfigRevisions } from "./agent_config_revisions.js";
|
||||||
export { agentApiKeys } from "./agent_api_keys.js";
|
export { agentApiKeys } from "./agent_api_keys.js";
|
||||||
export { agentRuntimeState } from "./agent_runtime_state.js";
|
export { agentRuntimeState } from "./agent_runtime_state.js";
|
||||||
|
|||||||
16
packages/db/src/schema/instance_user_roles.ts
Normal file
16
packages/db/src/schema/instance_user_roles.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import { pgTable, uuid, text, timestamp, uniqueIndex, index } from "drizzle-orm/pg-core";
|
||||||
|
|
||||||
|
export const instanceUserRoles = pgTable(
|
||||||
|
"instance_user_roles",
|
||||||
|
{
|
||||||
|
id: uuid("id").primaryKey().defaultRandom(),
|
||||||
|
userId: text("user_id").notNull(),
|
||||||
|
role: text("role").notNull().default("instance_admin"),
|
||||||
|
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
||||||
|
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
|
||||||
|
},
|
||||||
|
(table) => ({
|
||||||
|
userRoleUniqueIdx: uniqueIndex("instance_user_roles_user_role_unique_idx").on(table.userId, table.role),
|
||||||
|
roleIdx: index("instance_user_roles_role_idx").on(table.role),
|
||||||
|
}),
|
||||||
|
);
|
||||||
29
packages/db/src/schema/invites.ts
Normal file
29
packages/db/src/schema/invites.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import { pgTable, uuid, text, timestamp, jsonb, index, uniqueIndex } from "drizzle-orm/pg-core";
|
||||||
|
import { companies } from "./companies.js";
|
||||||
|
|
||||||
|
export const invites = pgTable(
|
||||||
|
"invites",
|
||||||
|
{
|
||||||
|
id: uuid("id").primaryKey().defaultRandom(),
|
||||||
|
companyId: uuid("company_id").references(() => companies.id),
|
||||||
|
inviteType: text("invite_type").notNull().default("company_join"),
|
||||||
|
tokenHash: text("token_hash").notNull(),
|
||||||
|
allowedJoinTypes: text("allowed_join_types").notNull().default("both"),
|
||||||
|
defaultsPayload: jsonb("defaults_payload").$type<Record<string, unknown> | null>(),
|
||||||
|
expiresAt: timestamp("expires_at", { withTimezone: true }).notNull(),
|
||||||
|
invitedByUserId: text("invited_by_user_id"),
|
||||||
|
revokedAt: timestamp("revoked_at", { withTimezone: true }),
|
||||||
|
acceptedAt: timestamp("accepted_at", { withTimezone: true }),
|
||||||
|
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
||||||
|
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
|
||||||
|
},
|
||||||
|
(table) => ({
|
||||||
|
tokenHashUniqueIdx: uniqueIndex("invites_token_hash_unique_idx").on(table.tokenHash),
|
||||||
|
companyInviteStateIdx: index("invites_company_invite_state_idx").on(
|
||||||
|
table.companyId,
|
||||||
|
table.inviteType,
|
||||||
|
table.revokedAt,
|
||||||
|
table.expiresAt,
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
);
|
||||||
@@ -27,6 +27,7 @@ export const issues = pgTable(
|
|||||||
status: text("status").notNull().default("backlog"),
|
status: text("status").notNull().default("backlog"),
|
||||||
priority: text("priority").notNull().default("medium"),
|
priority: text("priority").notNull().default("medium"),
|
||||||
assigneeAgentId: uuid("assignee_agent_id").references(() => agents.id),
|
assigneeAgentId: uuid("assignee_agent_id").references(() => agents.id),
|
||||||
|
assigneeUserId: text("assignee_user_id"),
|
||||||
checkoutRunId: uuid("checkout_run_id").references(() => heartbeatRuns.id, { onDelete: "set null" }),
|
checkoutRunId: uuid("checkout_run_id").references(() => heartbeatRuns.id, { onDelete: "set null" }),
|
||||||
executionRunId: uuid("execution_run_id").references(() => heartbeatRuns.id, { onDelete: "set null" }),
|
executionRunId: uuid("execution_run_id").references(() => heartbeatRuns.id, { onDelete: "set null" }),
|
||||||
executionAgentNameKey: text("execution_agent_name_key"),
|
executionAgentNameKey: text("execution_agent_name_key"),
|
||||||
@@ -51,6 +52,11 @@ export const issues = pgTable(
|
|||||||
table.assigneeAgentId,
|
table.assigneeAgentId,
|
||||||
table.status,
|
table.status,
|
||||||
),
|
),
|
||||||
|
assigneeUserStatusIdx: index("issues_company_assignee_user_status_idx").on(
|
||||||
|
table.companyId,
|
||||||
|
table.assigneeUserId,
|
||||||
|
table.status,
|
||||||
|
),
|
||||||
parentIdx: index("issues_company_parent_idx").on(table.companyId, table.parentId),
|
parentIdx: index("issues_company_parent_idx").on(table.companyId, table.parentId),
|
||||||
projectIdx: index("issues_company_project_idx").on(table.companyId, table.projectId),
|
projectIdx: index("issues_company_project_idx").on(table.companyId, table.projectId),
|
||||||
identifierIdx: uniqueIndex("issues_company_identifier_idx").on(table.companyId, table.identifier),
|
identifierIdx: uniqueIndex("issues_company_identifier_idx").on(table.companyId, table.identifier),
|
||||||
|
|||||||
38
packages/db/src/schema/join_requests.ts
Normal file
38
packages/db/src/schema/join_requests.ts
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import { pgTable, uuid, text, timestamp, jsonb, index, uniqueIndex } from "drizzle-orm/pg-core";
|
||||||
|
import { companies } from "./companies.js";
|
||||||
|
import { invites } from "./invites.js";
|
||||||
|
import { agents } from "./agents.js";
|
||||||
|
|
||||||
|
export const joinRequests = pgTable(
|
||||||
|
"join_requests",
|
||||||
|
{
|
||||||
|
id: uuid("id").primaryKey().defaultRandom(),
|
||||||
|
inviteId: uuid("invite_id").notNull().references(() => invites.id),
|
||||||
|
companyId: uuid("company_id").notNull().references(() => companies.id),
|
||||||
|
requestType: text("request_type").notNull(),
|
||||||
|
status: text("status").notNull().default("pending_approval"),
|
||||||
|
requestIp: text("request_ip").notNull(),
|
||||||
|
requestingUserId: text("requesting_user_id"),
|
||||||
|
requestEmailSnapshot: text("request_email_snapshot"),
|
||||||
|
agentName: text("agent_name"),
|
||||||
|
adapterType: text("adapter_type"),
|
||||||
|
capabilities: text("capabilities"),
|
||||||
|
agentDefaultsPayload: jsonb("agent_defaults_payload").$type<Record<string, unknown> | null>(),
|
||||||
|
createdAgentId: uuid("created_agent_id").references(() => agents.id),
|
||||||
|
approvedByUserId: text("approved_by_user_id"),
|
||||||
|
approvedAt: timestamp("approved_at", { withTimezone: true }),
|
||||||
|
rejectedByUserId: text("rejected_by_user_id"),
|
||||||
|
rejectedAt: timestamp("rejected_at", { withTimezone: true }),
|
||||||
|
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
||||||
|
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
|
||||||
|
},
|
||||||
|
(table) => ({
|
||||||
|
inviteUniqueIdx: uniqueIndex("join_requests_invite_unique_idx").on(table.inviteId),
|
||||||
|
companyStatusTypeCreatedIdx: index("join_requests_company_status_type_created_idx").on(
|
||||||
|
table.companyId,
|
||||||
|
table.status,
|
||||||
|
table.requestType,
|
||||||
|
table.createdAt,
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
);
|
||||||
29
packages/db/src/schema/principal_permission_grants.ts
Normal file
29
packages/db/src/schema/principal_permission_grants.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import { pgTable, uuid, text, timestamp, jsonb, uniqueIndex, index } from "drizzle-orm/pg-core";
|
||||||
|
import { companies } from "./companies.js";
|
||||||
|
|
||||||
|
export const principalPermissionGrants = pgTable(
|
||||||
|
"principal_permission_grants",
|
||||||
|
{
|
||||||
|
id: uuid("id").primaryKey().defaultRandom(),
|
||||||
|
companyId: uuid("company_id").notNull().references(() => companies.id),
|
||||||
|
principalType: text("principal_type").notNull(),
|
||||||
|
principalId: text("principal_id").notNull(),
|
||||||
|
permissionKey: text("permission_key").notNull(),
|
||||||
|
scope: jsonb("scope").$type<Record<string, unknown> | null>(),
|
||||||
|
grantedByUserId: text("granted_by_user_id"),
|
||||||
|
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
||||||
|
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
|
||||||
|
},
|
||||||
|
(table) => ({
|
||||||
|
uniqueGrantIdx: uniqueIndex("principal_permission_grants_unique_idx").on(
|
||||||
|
table.companyId,
|
||||||
|
table.principalType,
|
||||||
|
table.principalId,
|
||||||
|
table.permissionKey,
|
||||||
|
),
|
||||||
|
companyPermissionIdx: index("principal_permission_grants_company_permission_idx").on(
|
||||||
|
table.companyId,
|
||||||
|
table.permissionKey,
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
);
|
||||||
@@ -13,4 +13,8 @@ export const API = {
|
|||||||
activity: `${API_PREFIX}/activity`,
|
activity: `${API_PREFIX}/activity`,
|
||||||
dashboard: `${API_PREFIX}/dashboard`,
|
dashboard: `${API_PREFIX}/dashboard`,
|
||||||
sidebarBadges: `${API_PREFIX}/sidebar-badges`,
|
sidebarBadges: `${API_PREFIX}/sidebar-badges`,
|
||||||
|
invites: `${API_PREFIX}/invites`,
|
||||||
|
joinRequests: `${API_PREFIX}/join-requests`,
|
||||||
|
members: `${API_PREFIX}/members`,
|
||||||
|
admin: `${API_PREFIX}/admin`,
|
||||||
} as const;
|
} as const;
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import { SECRET_PROVIDERS, STORAGE_PROVIDERS } from "./constants.js";
|
import {
|
||||||
|
AUTH_BASE_URL_MODES,
|
||||||
|
DEPLOYMENT_EXPOSURES,
|
||||||
|
DEPLOYMENT_MODES,
|
||||||
|
SECRET_PROVIDERS,
|
||||||
|
STORAGE_PROVIDERS,
|
||||||
|
} from "./constants.js";
|
||||||
|
|
||||||
export const configMetaSchema = z.object({
|
export const configMetaSchema = z.object({
|
||||||
version: z.literal(1),
|
version: z.literal(1),
|
||||||
@@ -25,10 +31,18 @@ export const loggingConfigSchema = z.object({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export const serverConfigSchema = z.object({
|
export const serverConfigSchema = z.object({
|
||||||
|
deploymentMode: z.enum(DEPLOYMENT_MODES).default("local_trusted"),
|
||||||
|
exposure: z.enum(DEPLOYMENT_EXPOSURES).default("private"),
|
||||||
|
host: z.string().default("127.0.0.1"),
|
||||||
port: z.number().int().min(1).max(65535).default(3100),
|
port: z.number().int().min(1).max(65535).default(3100),
|
||||||
serveUi: z.boolean().default(true),
|
serveUi: z.boolean().default(true),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const authConfigSchema = z.object({
|
||||||
|
baseUrlMode: z.enum(AUTH_BASE_URL_MODES).default("auto"),
|
||||||
|
publicBaseUrl: z.string().url().optional(),
|
||||||
|
});
|
||||||
|
|
||||||
export const storageLocalDiskConfigSchema = z.object({
|
export const storageLocalDiskConfigSchema = z.object({
|
||||||
baseDir: z.string().default("~/.paperclip/instances/default/data/storage"),
|
baseDir: z.string().default("~/.paperclip/instances/default/data/storage"),
|
||||||
});
|
});
|
||||||
@@ -66,32 +80,72 @@ export const secretsConfigSchema = z.object({
|
|||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
export const paperclipConfigSchema = z.object({
|
export const paperclipConfigSchema = z
|
||||||
$meta: configMetaSchema,
|
.object({
|
||||||
llm: llmConfigSchema.optional(),
|
$meta: configMetaSchema,
|
||||||
database: databaseConfigSchema,
|
llm: llmConfigSchema.optional(),
|
||||||
logging: loggingConfigSchema,
|
database: databaseConfigSchema,
|
||||||
server: serverConfigSchema,
|
logging: loggingConfigSchema,
|
||||||
storage: storageConfigSchema.default({
|
server: serverConfigSchema,
|
||||||
provider: "local_disk",
|
auth: authConfigSchema.default({
|
||||||
localDisk: {
|
baseUrlMode: "auto",
|
||||||
baseDir: "~/.paperclip/instances/default/data/storage",
|
}),
|
||||||
},
|
storage: storageConfigSchema.default({
|
||||||
s3: {
|
provider: "local_disk",
|
||||||
bucket: "paperclip",
|
localDisk: {
|
||||||
region: "us-east-1",
|
baseDir: "~/.paperclip/instances/default/data/storage",
|
||||||
prefix: "",
|
},
|
||||||
forcePathStyle: false,
|
s3: {
|
||||||
},
|
bucket: "paperclip",
|
||||||
}),
|
region: "us-east-1",
|
||||||
secrets: secretsConfigSchema.default({
|
prefix: "",
|
||||||
provider: "local_encrypted",
|
forcePathStyle: false,
|
||||||
strictMode: false,
|
},
|
||||||
localEncrypted: {
|
}),
|
||||||
keyFilePath: "~/.paperclip/instances/default/secrets/master.key",
|
secrets: secretsConfigSchema.default({
|
||||||
},
|
provider: "local_encrypted",
|
||||||
}),
|
strictMode: false,
|
||||||
});
|
localEncrypted: {
|
||||||
|
keyFilePath: "~/.paperclip/instances/default/secrets/master.key",
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
.superRefine((value, ctx) => {
|
||||||
|
if (value.server.deploymentMode === "local_trusted") {
|
||||||
|
if (value.server.exposure !== "private") {
|
||||||
|
ctx.addIssue({
|
||||||
|
code: z.ZodIssueCode.custom,
|
||||||
|
message: "server.exposure must be private when deploymentMode is local_trusted",
|
||||||
|
path: ["server", "exposure"],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value.auth.baseUrlMode === "explicit" && !value.auth.publicBaseUrl) {
|
||||||
|
ctx.addIssue({
|
||||||
|
code: z.ZodIssueCode.custom,
|
||||||
|
message: "auth.publicBaseUrl is required when auth.baseUrlMode is explicit",
|
||||||
|
path: ["auth", "publicBaseUrl"],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value.server.exposure === "public" && value.auth.baseUrlMode !== "explicit") {
|
||||||
|
ctx.addIssue({
|
||||||
|
code: z.ZodIssueCode.custom,
|
||||||
|
message: "auth.baseUrlMode must be explicit when deploymentMode=authenticated and exposure=public",
|
||||||
|
path: ["auth", "baseUrlMode"],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value.server.exposure === "public" && !value.auth.publicBaseUrl) {
|
||||||
|
ctx.addIssue({
|
||||||
|
code: z.ZodIssueCode.custom,
|
||||||
|
message: "auth.publicBaseUrl is required when deploymentMode=authenticated and exposure=public",
|
||||||
|
path: ["auth", "publicBaseUrl"],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
export type PaperclipConfig = z.infer<typeof paperclipConfigSchema>;
|
export type PaperclipConfig = z.infer<typeof paperclipConfigSchema>;
|
||||||
export type LlmConfig = z.infer<typeof llmConfigSchema>;
|
export type LlmConfig = z.infer<typeof llmConfigSchema>;
|
||||||
@@ -103,4 +157,5 @@ export type StorageLocalDiskConfig = z.infer<typeof storageLocalDiskConfigSchema
|
|||||||
export type StorageS3Config = z.infer<typeof storageS3ConfigSchema>;
|
export type StorageS3Config = z.infer<typeof storageS3ConfigSchema>;
|
||||||
export type SecretsConfig = z.infer<typeof secretsConfigSchema>;
|
export type SecretsConfig = z.infer<typeof secretsConfigSchema>;
|
||||||
export type SecretsLocalEncryptedConfig = z.infer<typeof secretsLocalEncryptedConfigSchema>;
|
export type SecretsLocalEncryptedConfig = z.infer<typeof secretsLocalEncryptedConfigSchema>;
|
||||||
|
export type AuthConfig = z.infer<typeof authConfigSchema>;
|
||||||
export type ConfigMeta = z.infer<typeof configMetaSchema>;
|
export type ConfigMeta = z.infer<typeof configMetaSchema>;
|
||||||
|
|||||||
78
packages/shared/src/types/access.ts
Normal file
78
packages/shared/src/types/access.ts
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
import type {
|
||||||
|
InstanceUserRole,
|
||||||
|
InviteJoinType,
|
||||||
|
InviteType,
|
||||||
|
JoinRequestStatus,
|
||||||
|
JoinRequestType,
|
||||||
|
MembershipStatus,
|
||||||
|
PermissionKey,
|
||||||
|
PrincipalType,
|
||||||
|
} from "../constants.js";
|
||||||
|
|
||||||
|
export interface CompanyMembership {
|
||||||
|
id: string;
|
||||||
|
companyId: string;
|
||||||
|
principalType: PrincipalType;
|
||||||
|
principalId: string;
|
||||||
|
status: MembershipStatus;
|
||||||
|
membershipRole: string | null;
|
||||||
|
createdAt: Date;
|
||||||
|
updatedAt: Date;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PrincipalPermissionGrant {
|
||||||
|
id: string;
|
||||||
|
companyId: string;
|
||||||
|
principalType: PrincipalType;
|
||||||
|
principalId: string;
|
||||||
|
permissionKey: PermissionKey;
|
||||||
|
scope: Record<string, unknown> | null;
|
||||||
|
grantedByUserId: string | null;
|
||||||
|
createdAt: Date;
|
||||||
|
updatedAt: Date;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Invite {
|
||||||
|
id: string;
|
||||||
|
companyId: string | null;
|
||||||
|
inviteType: InviteType;
|
||||||
|
tokenHash: string;
|
||||||
|
allowedJoinTypes: InviteJoinType;
|
||||||
|
defaultsPayload: Record<string, unknown> | null;
|
||||||
|
expiresAt: Date;
|
||||||
|
invitedByUserId: string | null;
|
||||||
|
revokedAt: Date | null;
|
||||||
|
acceptedAt: Date | null;
|
||||||
|
createdAt: Date;
|
||||||
|
updatedAt: Date;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface JoinRequest {
|
||||||
|
id: string;
|
||||||
|
inviteId: string;
|
||||||
|
companyId: string;
|
||||||
|
requestType: JoinRequestType;
|
||||||
|
status: JoinRequestStatus;
|
||||||
|
requestIp: string;
|
||||||
|
requestingUserId: string | null;
|
||||||
|
requestEmailSnapshot: string | null;
|
||||||
|
agentName: string | null;
|
||||||
|
adapterType: string | null;
|
||||||
|
capabilities: string | null;
|
||||||
|
agentDefaultsPayload: Record<string, unknown> | null;
|
||||||
|
createdAgentId: string | null;
|
||||||
|
approvedByUserId: string | null;
|
||||||
|
approvedAt: Date | null;
|
||||||
|
rejectedByUserId: string | null;
|
||||||
|
rejectedAt: Date | null;
|
||||||
|
createdAt: Date;
|
||||||
|
updatedAt: Date;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface InstanceUserRoleGrant {
|
||||||
|
id: string;
|
||||||
|
userId: string;
|
||||||
|
role: InstanceUserRole;
|
||||||
|
createdAt: Date;
|
||||||
|
updatedAt: Date;
|
||||||
|
}
|
||||||
@@ -43,3 +43,10 @@ export type { LiveEvent } from "./live.js";
|
|||||||
export type { DashboardSummary } from "./dashboard.js";
|
export type { DashboardSummary } from "./dashboard.js";
|
||||||
export type { ActivityEvent } from "./activity.js";
|
export type { ActivityEvent } from "./activity.js";
|
||||||
export type { SidebarBadges } from "./sidebar-badges.js";
|
export type { SidebarBadges } from "./sidebar-badges.js";
|
||||||
|
export type {
|
||||||
|
CompanyMembership,
|
||||||
|
PrincipalPermissionGrant,
|
||||||
|
Invite,
|
||||||
|
JoinRequest,
|
||||||
|
InstanceUserRoleGrant,
|
||||||
|
} from "./access.js";
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ export interface IssueAncestor {
|
|||||||
status: string;
|
status: string;
|
||||||
priority: string;
|
priority: string;
|
||||||
assigneeAgentId: string | null;
|
assigneeAgentId: string | null;
|
||||||
|
assigneeUserId: string | null;
|
||||||
projectId: string | null;
|
projectId: string | null;
|
||||||
goalId: string | null;
|
goalId: string | null;
|
||||||
project: IssueAncestorProject | null;
|
project: IssueAncestorProject | null;
|
||||||
@@ -42,6 +43,7 @@ export interface Issue {
|
|||||||
status: IssueStatus;
|
status: IssueStatus;
|
||||||
priority: IssuePriority;
|
priority: IssuePriority;
|
||||||
assigneeAgentId: string | null;
|
assigneeAgentId: string | null;
|
||||||
|
assigneeUserId: string | null;
|
||||||
checkoutRunId: string | null;
|
checkoutRunId: string | null;
|
||||||
executionRunId: string | null;
|
executionRunId: string | null;
|
||||||
executionAgentNameKey: string | null;
|
executionAgentNameKey: string | null;
|
||||||
|
|||||||
@@ -2,4 +2,5 @@ export interface SidebarBadges {
|
|||||||
inbox: number;
|
inbox: number;
|
||||||
approvals: number;
|
approvals: number;
|
||||||
failedRuns: number;
|
failedRuns: number;
|
||||||
|
joinRequests: number;
|
||||||
}
|
}
|
||||||
|
|||||||
49
packages/shared/src/validators/access.ts
Normal file
49
packages/shared/src/validators/access.ts
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
import { z } from "zod";
|
||||||
|
import {
|
||||||
|
INVITE_JOIN_TYPES,
|
||||||
|
JOIN_REQUEST_STATUSES,
|
||||||
|
JOIN_REQUEST_TYPES,
|
||||||
|
PERMISSION_KEYS,
|
||||||
|
} from "../constants.js";
|
||||||
|
|
||||||
|
export const createCompanyInviteSchema = z.object({
|
||||||
|
allowedJoinTypes: z.enum(INVITE_JOIN_TYPES).default("both"),
|
||||||
|
expiresInHours: z.number().int().min(1).max(24 * 30).optional().default(72),
|
||||||
|
defaultsPayload: z.record(z.string(), z.unknown()).optional().nullable(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type CreateCompanyInvite = z.infer<typeof createCompanyInviteSchema>;
|
||||||
|
|
||||||
|
export const acceptInviteSchema = z.object({
|
||||||
|
requestType: z.enum(JOIN_REQUEST_TYPES),
|
||||||
|
agentName: z.string().min(1).max(120).optional(),
|
||||||
|
adapterType: z.string().min(1).max(120).optional(),
|
||||||
|
capabilities: z.string().max(4000).optional().nullable(),
|
||||||
|
agentDefaultsPayload: z.record(z.string(), z.unknown()).optional().nullable(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type AcceptInvite = z.infer<typeof acceptInviteSchema>;
|
||||||
|
|
||||||
|
export const listJoinRequestsQuerySchema = z.object({
|
||||||
|
status: z.enum(JOIN_REQUEST_STATUSES).optional(),
|
||||||
|
requestType: z.enum(JOIN_REQUEST_TYPES).optional(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type ListJoinRequestsQuery = z.infer<typeof listJoinRequestsQuerySchema>;
|
||||||
|
|
||||||
|
export const updateMemberPermissionsSchema = z.object({
|
||||||
|
grants: z.array(
|
||||||
|
z.object({
|
||||||
|
permissionKey: z.enum(PERMISSION_KEYS),
|
||||||
|
scope: z.record(z.string(), z.unknown()).optional().nullable(),
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type UpdateMemberPermissions = z.infer<typeof updateMemberPermissionsSchema>;
|
||||||
|
|
||||||
|
export const updateUserCompanyAccessSchema = z.object({
|
||||||
|
companyIds: z.array(z.string().uuid()).default([]),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type UpdateUserCompanyAccess = z.infer<typeof updateUserCompanyAccessSchema>;
|
||||||
@@ -91,3 +91,16 @@ export {
|
|||||||
createAssetImageMetadataSchema,
|
createAssetImageMetadataSchema,
|
||||||
type CreateAssetImageMetadata,
|
type CreateAssetImageMetadata,
|
||||||
} from "./asset.js";
|
} from "./asset.js";
|
||||||
|
|
||||||
|
export {
|
||||||
|
createCompanyInviteSchema,
|
||||||
|
acceptInviteSchema,
|
||||||
|
listJoinRequestsQuerySchema,
|
||||||
|
updateMemberPermissionsSchema,
|
||||||
|
updateUserCompanyAccessSchema,
|
||||||
|
type CreateCompanyInvite,
|
||||||
|
type AcceptInvite,
|
||||||
|
type ListJoinRequestsQuery,
|
||||||
|
type UpdateMemberPermissions,
|
||||||
|
type UpdateUserCompanyAccess,
|
||||||
|
} from "./access.js";
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ export const createIssueSchema = z.object({
|
|||||||
status: z.enum(ISSUE_STATUSES).optional().default("backlog"),
|
status: z.enum(ISSUE_STATUSES).optional().default("backlog"),
|
||||||
priority: z.enum(ISSUE_PRIORITIES).optional().default("medium"),
|
priority: z.enum(ISSUE_PRIORITIES).optional().default("medium"),
|
||||||
assigneeAgentId: z.string().uuid().optional().nullable(),
|
assigneeAgentId: z.string().uuid().optional().nullable(),
|
||||||
|
assigneeUserId: z.string().optional().nullable(),
|
||||||
requestDepth: z.number().int().nonnegative().optional().default(0),
|
requestDepth: z.number().int().nonnegative().optional().default(0),
|
||||||
billingCode: z.string().optional().nullable(),
|
billingCode: z.string().optional().nullable(),
|
||||||
});
|
});
|
||||||
|
|||||||
381
pnpm-lock.yaml
generated
381
pnpm-lock.yaml
generated
@@ -44,6 +44,9 @@ importers:
|
|||||||
dotenv:
|
dotenv:
|
||||||
specifier: ^17.0.1
|
specifier: ^17.0.1
|
||||||
version: 17.3.1
|
version: 17.3.1
|
||||||
|
drizzle-orm:
|
||||||
|
specifier: 0.38.4
|
||||||
|
version: 0.38.4(@electric-sql/pglite@0.3.15)(@types/react@19.2.14)(kysely@0.28.11)(pg@8.18.0)(postgres@3.4.8)(react@19.2.4)
|
||||||
picocolors:
|
picocolors:
|
||||||
specifier: ^1.1.1
|
specifier: ^1.1.1
|
||||||
version: 1.1.1
|
version: 1.1.1
|
||||||
@@ -97,7 +100,7 @@ importers:
|
|||||||
version: link:../shared
|
version: link:../shared
|
||||||
drizzle-orm:
|
drizzle-orm:
|
||||||
specifier: ^0.38.4
|
specifier: ^0.38.4
|
||||||
version: 0.38.4(@electric-sql/pglite@0.3.15)(@types/react@19.2.14)(pg@8.18.0)(postgres@3.4.8)(react@19.2.4)
|
version: 0.38.4(@electric-sql/pglite@0.3.15)(@types/react@19.2.14)(kysely@0.28.11)(pg@8.18.0)(postgres@3.4.8)(react@19.2.4)
|
||||||
postgres:
|
postgres:
|
||||||
specifier: ^3.4.5
|
specifier: ^3.4.5
|
||||||
version: 3.4.8
|
version: 3.4.8
|
||||||
@@ -145,6 +148,9 @@ importers:
|
|||||||
'@paperclip/shared':
|
'@paperclip/shared':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../packages/shared
|
version: link:../packages/shared
|
||||||
|
better-auth:
|
||||||
|
specifier: ^1.3.8
|
||||||
|
version: 1.4.18(drizzle-kit@0.31.9)(drizzle-orm@0.38.4(@electric-sql/pglite@0.3.15)(@types/react@19.2.14)(kysely@0.28.11)(pg@8.18.0)(postgres@3.4.8)(react@19.2.4))(pg@8.18.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))
|
||||||
detect-port:
|
detect-port:
|
||||||
specifier: ^2.1.0
|
specifier: ^2.1.0
|
||||||
version: 2.1.0
|
version: 2.1.0
|
||||||
@@ -153,7 +159,7 @@ importers:
|
|||||||
version: 17.3.1
|
version: 17.3.1
|
||||||
drizzle-orm:
|
drizzle-orm:
|
||||||
specifier: ^0.38.4
|
specifier: ^0.38.4
|
||||||
version: 0.38.4(@electric-sql/pglite@0.3.15)(@types/react@19.2.14)(pg@8.18.0)(postgres@3.4.8)(react@19.2.4)
|
version: 0.38.4(@electric-sql/pglite@0.3.15)(@types/react@19.2.14)(kysely@0.28.11)(pg@8.18.0)(postgres@3.4.8)(react@19.2.4)
|
||||||
express:
|
express:
|
||||||
specifier: ^5.1.0
|
specifier: ^5.1.0
|
||||||
version: 5.2.1
|
version: 5.2.1
|
||||||
@@ -210,6 +216,15 @@ importers:
|
|||||||
|
|
||||||
ui:
|
ui:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
'@dnd-kit/core':
|
||||||
|
specifier: ^6.3.1
|
||||||
|
version: 6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
||||||
|
'@dnd-kit/sortable':
|
||||||
|
specifier: ^10.0.0
|
||||||
|
version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
|
||||||
|
'@dnd-kit/utilities':
|
||||||
|
specifier: ^3.2.2
|
||||||
|
version: 3.2.2(react@19.2.4)
|
||||||
'@mdxeditor/editor':
|
'@mdxeditor/editor':
|
||||||
specifier: ^3.52.4
|
specifier: ^3.52.4
|
||||||
version: 3.52.4(@codemirror/language@6.12.1)(@lezer/highlight@1.2.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(yjs@13.6.29)
|
version: 3.52.4(@codemirror/language@6.12.1)(@lezer/highlight@1.2.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(yjs@13.6.29)
|
||||||
@@ -261,6 +276,9 @@ importers:
|
|||||||
react-router-dom:
|
react-router-dom:
|
||||||
specifier: ^7.1.5
|
specifier: ^7.1.5
|
||||||
version: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
version: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
||||||
|
remark-gfm:
|
||||||
|
specifier: ^4.0.1
|
||||||
|
version: 4.0.1
|
||||||
tailwind-merge:
|
tailwind-merge:
|
||||||
specifier: ^3.4.1
|
specifier: ^3.4.1
|
||||||
version: 3.4.1
|
version: 3.4.1
|
||||||
@@ -549,6 +567,27 @@ packages:
|
|||||||
resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
|
resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
|
'@better-auth/core@1.4.18':
|
||||||
|
resolution: {integrity: sha512-q+awYgC7nkLEBdx2sW0iJjkzgSHlIxGnOpsN1r/O1+a4m7osJNHtfK2mKJSL1I+GfNyIlxJF8WvD/NLuYMpmcg==}
|
||||||
|
peerDependencies:
|
||||||
|
'@better-auth/utils': 0.3.0
|
||||||
|
'@better-fetch/fetch': 1.1.21
|
||||||
|
better-call: 1.1.8
|
||||||
|
jose: ^6.1.0
|
||||||
|
kysely: ^0.28.5
|
||||||
|
nanostores: ^1.0.1
|
||||||
|
|
||||||
|
'@better-auth/telemetry@1.4.18':
|
||||||
|
resolution: {integrity: sha512-e5rDF8S4j3Um/0LIVATL2in9dL4lfO2fr2v1Wio4qTMRbfxqnUDTa+6SZtwdeJrbc4O+a3c+IyIpjG9Q/6GpfQ==}
|
||||||
|
peerDependencies:
|
||||||
|
'@better-auth/core': 1.4.18
|
||||||
|
|
||||||
|
'@better-auth/utils@0.3.0':
|
||||||
|
resolution: {integrity: sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw==}
|
||||||
|
|
||||||
|
'@better-fetch/fetch@1.1.21':
|
||||||
|
resolution: {integrity: sha512-/ImESw0sskqlVR94jB+5+Pxjf+xBwDZF/N5+y2/q4EqD7IARUTSpPfIo8uf39SYpCxyOCtbyYpUrZ3F/k0zT4A==}
|
||||||
|
|
||||||
'@clack/core@0.4.2':
|
'@clack/core@0.4.2':
|
||||||
resolution: {integrity: sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg==}
|
resolution: {integrity: sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg==}
|
||||||
|
|
||||||
@@ -660,6 +699,28 @@ packages:
|
|||||||
react: ^16.8.0 || ^17 || ^18 || ^19
|
react: ^16.8.0 || ^17 || ^18 || ^19
|
||||||
react-dom: ^16.8.0 || ^17 || ^18 || ^19
|
react-dom: ^16.8.0 || ^17 || ^18 || ^19
|
||||||
|
|
||||||
|
'@dnd-kit/accessibility@3.1.1':
|
||||||
|
resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==}
|
||||||
|
peerDependencies:
|
||||||
|
react: '>=16.8.0'
|
||||||
|
|
||||||
|
'@dnd-kit/core@6.3.1':
|
||||||
|
resolution: {integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==}
|
||||||
|
peerDependencies:
|
||||||
|
react: '>=16.8.0'
|
||||||
|
react-dom: '>=16.8.0'
|
||||||
|
|
||||||
|
'@dnd-kit/sortable@10.0.0':
|
||||||
|
resolution: {integrity: sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==}
|
||||||
|
peerDependencies:
|
||||||
|
'@dnd-kit/core': ^6.3.0
|
||||||
|
react: '>=16.8.0'
|
||||||
|
|
||||||
|
'@dnd-kit/utilities@3.2.2':
|
||||||
|
resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==}
|
||||||
|
peerDependencies:
|
||||||
|
react: '>=16.8.0'
|
||||||
|
|
||||||
'@drizzle-team/brocli@0.10.2':
|
'@drizzle-team/brocli@0.10.2':
|
||||||
resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==}
|
resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==}
|
||||||
|
|
||||||
@@ -1342,10 +1403,18 @@ packages:
|
|||||||
react: '>= 18 || >= 19'
|
react: '>= 18 || >= 19'
|
||||||
react-dom: '>= 18 || >= 19'
|
react-dom: '>= 18 || >= 19'
|
||||||
|
|
||||||
|
'@noble/ciphers@2.1.1':
|
||||||
|
resolution: {integrity: sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==}
|
||||||
|
engines: {node: '>= 20.19.0'}
|
||||||
|
|
||||||
'@noble/hashes@1.8.0':
|
'@noble/hashes@1.8.0':
|
||||||
resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==}
|
resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==}
|
||||||
engines: {node: ^14.21.3 || >=16}
|
engines: {node: ^14.21.3 || >=16}
|
||||||
|
|
||||||
|
'@noble/hashes@2.0.1':
|
||||||
|
resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==}
|
||||||
|
engines: {node: '>= 20.19.0'}
|
||||||
|
|
||||||
'@open-draft/deferred-promise@2.2.0':
|
'@open-draft/deferred-promise@2.2.0':
|
||||||
resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==}
|
resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==}
|
||||||
|
|
||||||
@@ -2416,6 +2485,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==}
|
resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==}
|
||||||
engines: {node: '>=18.0.0'}
|
engines: {node: '>=18.0.0'}
|
||||||
|
|
||||||
|
'@standard-schema/spec@1.1.0':
|
||||||
|
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
|
||||||
|
|
||||||
'@stitches/core@1.2.8':
|
'@stitches/core@1.2.8':
|
||||||
resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==}
|
resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==}
|
||||||
|
|
||||||
@@ -2717,6 +2789,76 @@ packages:
|
|||||||
resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==}
|
resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
better-auth@1.4.18:
|
||||||
|
resolution: {integrity: sha512-bnyifLWBPcYVltH3RhS7CM62MoelEqC6Q+GnZwfiDWNfepXoQZBjEvn4urcERC7NTKgKq5zNBM8rvPvRBa6xcg==}
|
||||||
|
peerDependencies:
|
||||||
|
'@lynx-js/react': '*'
|
||||||
|
'@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0
|
||||||
|
'@sveltejs/kit': ^2.0.0
|
||||||
|
'@tanstack/react-start': ^1.0.0
|
||||||
|
'@tanstack/solid-start': ^1.0.0
|
||||||
|
better-sqlite3: ^12.0.0
|
||||||
|
drizzle-kit: '>=0.31.4'
|
||||||
|
drizzle-orm: '>=0.41.0'
|
||||||
|
mongodb: ^6.0.0 || ^7.0.0
|
||||||
|
mysql2: ^3.0.0
|
||||||
|
next: ^14.0.0 || ^15.0.0 || ^16.0.0
|
||||||
|
pg: ^8.0.0
|
||||||
|
prisma: ^5.0.0 || ^6.0.0 || ^7.0.0
|
||||||
|
react: ^18.0.0 || ^19.0.0
|
||||||
|
react-dom: ^18.0.0 || ^19.0.0
|
||||||
|
solid-js: ^1.0.0
|
||||||
|
svelte: ^4.0.0 || ^5.0.0
|
||||||
|
vitest: ^2.0.0 || ^3.0.0 || ^4.0.0
|
||||||
|
vue: ^3.0.0
|
||||||
|
peerDependenciesMeta:
|
||||||
|
'@lynx-js/react':
|
||||||
|
optional: true
|
||||||
|
'@prisma/client':
|
||||||
|
optional: true
|
||||||
|
'@sveltejs/kit':
|
||||||
|
optional: true
|
||||||
|
'@tanstack/react-start':
|
||||||
|
optional: true
|
||||||
|
'@tanstack/solid-start':
|
||||||
|
optional: true
|
||||||
|
better-sqlite3:
|
||||||
|
optional: true
|
||||||
|
drizzle-kit:
|
||||||
|
optional: true
|
||||||
|
drizzle-orm:
|
||||||
|
optional: true
|
||||||
|
mongodb:
|
||||||
|
optional: true
|
||||||
|
mysql2:
|
||||||
|
optional: true
|
||||||
|
next:
|
||||||
|
optional: true
|
||||||
|
pg:
|
||||||
|
optional: true
|
||||||
|
prisma:
|
||||||
|
optional: true
|
||||||
|
react:
|
||||||
|
optional: true
|
||||||
|
react-dom:
|
||||||
|
optional: true
|
||||||
|
solid-js:
|
||||||
|
optional: true
|
||||||
|
svelte:
|
||||||
|
optional: true
|
||||||
|
vitest:
|
||||||
|
optional: true
|
||||||
|
vue:
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
better-call@1.1.8:
|
||||||
|
resolution: {integrity: sha512-XMQ2rs6FNXasGNfMjzbyroSwKwYbZ/T3IxruSS6U2MJRsSYh3wYtG3o6H00ZlKZ/C/UPOAD97tqgQJNsxyeTXw==}
|
||||||
|
peerDependencies:
|
||||||
|
zod: ^4.0.0
|
||||||
|
peerDependenciesMeta:
|
||||||
|
zod:
|
||||||
|
optional: true
|
||||||
|
|
||||||
body-parser@2.2.2:
|
body-parser@2.2.2:
|
||||||
resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==}
|
resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
@@ -2895,6 +3037,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
|
resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
|
defu@6.1.4:
|
||||||
|
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
|
||||||
|
|
||||||
delayed-stream@1.0.0:
|
delayed-stream@1.0.0:
|
||||||
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
|
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
|
||||||
engines: {node: '>=0.4.0'}
|
engines: {node: '>=0.4.0'}
|
||||||
@@ -3320,6 +3465,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
|
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
jose@6.1.3:
|
||||||
|
resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==}
|
||||||
|
|
||||||
joycon@3.1.1:
|
joycon@3.1.1:
|
||||||
resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
|
resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
@@ -3348,6 +3496,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
|
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
|
kysely@0.28.11:
|
||||||
|
resolution: {integrity: sha512-zpGIFg0HuoC893rIjYX1BETkVWdDnzTzF5e0kWXJFg5lE0k1/LfNWBejrcnOFu8Q2Rfq/hTDTU7XLUM8QOrpzg==}
|
||||||
|
engines: {node: '>=20.0.0'}
|
||||||
|
|
||||||
lexical@0.35.0:
|
lexical@0.35.0:
|
||||||
resolution: {integrity: sha512-3VuV8xXhh5xJA6tzvfDvE0YBCMkIZUmxtRilJQDDdCgJCc+eut6qAv2qbN+pbqvarqcQqPN1UF+8YvsjmyOZpw==}
|
resolution: {integrity: sha512-3VuV8xXhh5xJA6tzvfDvE0YBCMkIZUmxtRilJQDDdCgJCc+eut6qAv2qbN+pbqvarqcQqPN1UF+8YvsjmyOZpw==}
|
||||||
|
|
||||||
@@ -3461,12 +3613,21 @@ packages:
|
|||||||
mdast-util-directive@3.1.0:
|
mdast-util-directive@3.1.0:
|
||||||
resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==}
|
resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==}
|
||||||
|
|
||||||
|
mdast-util-find-and-replace@3.0.2:
|
||||||
|
resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==}
|
||||||
|
|
||||||
mdast-util-from-markdown@2.0.2:
|
mdast-util-from-markdown@2.0.2:
|
||||||
resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==}
|
resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==}
|
||||||
|
|
||||||
mdast-util-frontmatter@2.0.1:
|
mdast-util-frontmatter@2.0.1:
|
||||||
resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==}
|
resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==}
|
||||||
|
|
||||||
|
mdast-util-gfm-autolink-literal@2.0.1:
|
||||||
|
resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
|
||||||
|
|
||||||
|
mdast-util-gfm-footnote@2.1.0:
|
||||||
|
resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==}
|
||||||
|
|
||||||
mdast-util-gfm-strikethrough@2.0.0:
|
mdast-util-gfm-strikethrough@2.0.0:
|
||||||
resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
|
resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
|
||||||
|
|
||||||
@@ -3476,6 +3637,9 @@ packages:
|
|||||||
mdast-util-gfm-task-list-item@2.0.0:
|
mdast-util-gfm-task-list-item@2.0.0:
|
||||||
resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
|
resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
|
||||||
|
|
||||||
|
mdast-util-gfm@3.1.0:
|
||||||
|
resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==}
|
||||||
|
|
||||||
mdast-util-highlight-mark@1.2.2:
|
mdast-util-highlight-mark@1.2.2:
|
||||||
resolution: {integrity: sha512-OYumVoytj+B9YgwzBhBcYUCLYHIPvJtAvwnMyKhUXbfUFuER5S+FDZyu9fadUxm2TCT5fRYK3jQXh2ioWAxrMw==}
|
resolution: {integrity: sha512-OYumVoytj+B9YgwzBhBcYUCLYHIPvJtAvwnMyKhUXbfUFuER5S+FDZyu9fadUxm2TCT5fRYK3jQXh2ioWAxrMw==}
|
||||||
|
|
||||||
@@ -3528,15 +3692,27 @@ packages:
|
|||||||
micromark-extension-frontmatter@2.0.0:
|
micromark-extension-frontmatter@2.0.0:
|
||||||
resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==}
|
resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==}
|
||||||
|
|
||||||
|
micromark-extension-gfm-autolink-literal@2.1.0:
|
||||||
|
resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
|
||||||
|
|
||||||
|
micromark-extension-gfm-footnote@2.1.0:
|
||||||
|
resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
|
||||||
|
|
||||||
micromark-extension-gfm-strikethrough@2.1.0:
|
micromark-extension-gfm-strikethrough@2.1.0:
|
||||||
resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
|
resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
|
||||||
|
|
||||||
micromark-extension-gfm-table@2.1.1:
|
micromark-extension-gfm-table@2.1.1:
|
||||||
resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==}
|
resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==}
|
||||||
|
|
||||||
|
micromark-extension-gfm-tagfilter@2.0.0:
|
||||||
|
resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
|
||||||
|
|
||||||
micromark-extension-gfm-task-list-item@2.1.0:
|
micromark-extension-gfm-task-list-item@2.1.0:
|
||||||
resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
|
resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
|
||||||
|
|
||||||
|
micromark-extension-gfm@3.0.0:
|
||||||
|
resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
|
||||||
|
|
||||||
micromark-extension-highlight-mark@1.2.0:
|
micromark-extension-highlight-mark@1.2.0:
|
||||||
resolution: {integrity: sha512-huGtbd/9kQsMk8u7nrVMaS5qH/47yDG6ZADggo5Owz5JoY8wdfQjfuy118/QiYNCvdFuFDbzT0A7K7Hp2cBsXA==}
|
resolution: {integrity: sha512-huGtbd/9kQsMk8u7nrVMaS5qH/47yDG6ZADggo5Owz5JoY8wdfQjfuy118/QiYNCvdFuFDbzT0A7K7Hp2cBsXA==}
|
||||||
|
|
||||||
@@ -3665,6 +3841,10 @@ packages:
|
|||||||
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
nanostores@1.1.0:
|
||||||
|
resolution: {integrity: sha512-yJBmDJr18xy47dbNVlHcgdPrulSn1nhSE6Ns9vTG+Nx9VPT6iV1MD6aQFp/t52zpf82FhLLTXAXr30NuCnxvwA==}
|
||||||
|
engines: {node: ^20.0.0 || >=22.0.0}
|
||||||
|
|
||||||
negotiator@1.0.0:
|
negotiator@1.0.0:
|
||||||
resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
|
resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
@@ -3946,12 +4126,18 @@ packages:
|
|||||||
resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
|
resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
|
||||||
engines: {node: '>= 12.13.0'}
|
engines: {node: '>= 12.13.0'}
|
||||||
|
|
||||||
|
remark-gfm@4.0.1:
|
||||||
|
resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==}
|
||||||
|
|
||||||
remark-parse@11.0.0:
|
remark-parse@11.0.0:
|
||||||
resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
|
resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
|
||||||
|
|
||||||
remark-rehype@11.1.2:
|
remark-rehype@11.1.2:
|
||||||
resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==}
|
resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==}
|
||||||
|
|
||||||
|
remark-stringify@11.0.0:
|
||||||
|
resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
|
||||||
|
|
||||||
resolve-pkg-maps@1.0.0:
|
resolve-pkg-maps@1.0.0:
|
||||||
resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
|
resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
|
||||||
|
|
||||||
@@ -3960,6 +4146,9 @@ packages:
|
|||||||
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
|
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
rou3@0.7.12:
|
||||||
|
resolution: {integrity: sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==}
|
||||||
|
|
||||||
router@2.2.0:
|
router@2.2.0:
|
||||||
resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
|
resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
|
||||||
engines: {node: '>= 18'}
|
engines: {node: '>= 18'}
|
||||||
@@ -4406,6 +4595,9 @@ packages:
|
|||||||
zod@3.25.76:
|
zod@3.25.76:
|
||||||
resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
|
resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
|
||||||
|
|
||||||
|
zod@4.3.6:
|
||||||
|
resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
|
||||||
|
|
||||||
zwitch@2.0.4:
|
zwitch@2.0.4:
|
||||||
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
|
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
|
||||||
|
|
||||||
@@ -5018,6 +5210,27 @@ snapshots:
|
|||||||
'@babel/helper-string-parser': 7.27.1
|
'@babel/helper-string-parser': 7.27.1
|
||||||
'@babel/helper-validator-identifier': 7.28.5
|
'@babel/helper-validator-identifier': 7.28.5
|
||||||
|
|
||||||
|
'@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@3.25.76))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0)':
|
||||||
|
dependencies:
|
||||||
|
'@better-auth/utils': 0.3.0
|
||||||
|
'@better-fetch/fetch': 1.1.21
|
||||||
|
'@standard-schema/spec': 1.1.0
|
||||||
|
better-call: 1.1.8(zod@4.3.6)
|
||||||
|
jose: 6.1.3
|
||||||
|
kysely: 0.28.11
|
||||||
|
nanostores: 1.1.0
|
||||||
|
zod: 4.3.6
|
||||||
|
|
||||||
|
'@better-auth/telemetry@1.4.18(@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@3.25.76))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0))':
|
||||||
|
dependencies:
|
||||||
|
'@better-auth/core': 1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@3.25.76))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0)
|
||||||
|
'@better-auth/utils': 0.3.0
|
||||||
|
'@better-fetch/fetch': 1.1.21
|
||||||
|
|
||||||
|
'@better-auth/utils@0.3.0': {}
|
||||||
|
|
||||||
|
'@better-fetch/fetch@1.1.21': {}
|
||||||
|
|
||||||
'@clack/core@0.4.2':
|
'@clack/core@0.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
picocolors: 1.1.1
|
picocolors: 1.1.1
|
||||||
@@ -5323,6 +5536,31 @@ snapshots:
|
|||||||
react-dom: 19.2.4(react@19.2.4)
|
react-dom: 19.2.4(react@19.2.4)
|
||||||
react-is: 17.0.2
|
react-is: 17.0.2
|
||||||
|
|
||||||
|
'@dnd-kit/accessibility@3.1.1(react@19.2.4)':
|
||||||
|
dependencies:
|
||||||
|
react: 19.2.4
|
||||||
|
tslib: 2.8.1
|
||||||
|
|
||||||
|
'@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
|
||||||
|
dependencies:
|
||||||
|
'@dnd-kit/accessibility': 3.1.1(react@19.2.4)
|
||||||
|
'@dnd-kit/utilities': 3.2.2(react@19.2.4)
|
||||||
|
react: 19.2.4
|
||||||
|
react-dom: 19.2.4(react@19.2.4)
|
||||||
|
tslib: 2.8.1
|
||||||
|
|
||||||
|
'@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)':
|
||||||
|
dependencies:
|
||||||
|
'@dnd-kit/core': 6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
||||||
|
'@dnd-kit/utilities': 3.2.2(react@19.2.4)
|
||||||
|
react: 19.2.4
|
||||||
|
tslib: 2.8.1
|
||||||
|
|
||||||
|
'@dnd-kit/utilities@3.2.2(react@19.2.4)':
|
||||||
|
dependencies:
|
||||||
|
react: 19.2.4
|
||||||
|
tslib: 2.8.1
|
||||||
|
|
||||||
'@drizzle-team/brocli@0.10.2': {}
|
'@drizzle-team/brocli@0.10.2': {}
|
||||||
|
|
||||||
'@electric-sql/pglite@0.3.15':
|
'@electric-sql/pglite@0.3.15':
|
||||||
@@ -5942,8 +6180,12 @@ snapshots:
|
|||||||
react: 19.2.4
|
react: 19.2.4
|
||||||
react-dom: 19.2.4(react@19.2.4)
|
react-dom: 19.2.4(react@19.2.4)
|
||||||
|
|
||||||
|
'@noble/ciphers@2.1.1': {}
|
||||||
|
|
||||||
'@noble/hashes@1.8.0': {}
|
'@noble/hashes@1.8.0': {}
|
||||||
|
|
||||||
|
'@noble/hashes@2.0.1': {}
|
||||||
|
|
||||||
'@open-draft/deferred-promise@2.2.0': {}
|
'@open-draft/deferred-promise@2.2.0': {}
|
||||||
|
|
||||||
'@paralleldrive/cuid2@2.3.1':
|
'@paralleldrive/cuid2@2.3.1':
|
||||||
@@ -7137,6 +7379,8 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
|
|
||||||
|
'@standard-schema/spec@1.1.0': {}
|
||||||
|
|
||||||
'@stitches/core@1.2.8': {}
|
'@stitches/core@1.2.8': {}
|
||||||
|
|
||||||
'@tailwindcss/node@4.1.18':
|
'@tailwindcss/node@4.1.18':
|
||||||
@@ -7440,6 +7684,37 @@ snapshots:
|
|||||||
|
|
||||||
baseline-browser-mapping@2.9.19: {}
|
baseline-browser-mapping@2.9.19: {}
|
||||||
|
|
||||||
|
better-auth@1.4.18(drizzle-kit@0.31.9)(drizzle-orm@0.38.4(@electric-sql/pglite@0.3.15)(@types/react@19.2.14)(kysely@0.28.11)(pg@8.18.0)(postgres@3.4.8)(react@19.2.4))(pg@8.18.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)):
|
||||||
|
dependencies:
|
||||||
|
'@better-auth/core': 1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@3.25.76))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0)
|
||||||
|
'@better-auth/telemetry': 1.4.18(@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@3.25.76))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0))
|
||||||
|
'@better-auth/utils': 0.3.0
|
||||||
|
'@better-fetch/fetch': 1.1.21
|
||||||
|
'@noble/ciphers': 2.1.1
|
||||||
|
'@noble/hashes': 2.0.1
|
||||||
|
better-call: 1.1.8(zod@4.3.6)
|
||||||
|
defu: 6.1.4
|
||||||
|
jose: 6.1.3
|
||||||
|
kysely: 0.28.11
|
||||||
|
nanostores: 1.1.0
|
||||||
|
zod: 4.3.6
|
||||||
|
optionalDependencies:
|
||||||
|
drizzle-kit: 0.31.9
|
||||||
|
drizzle-orm: 0.38.4(@electric-sql/pglite@0.3.15)(@types/react@19.2.14)(kysely@0.28.11)(pg@8.18.0)(postgres@3.4.8)(react@19.2.4)
|
||||||
|
pg: 8.18.0
|
||||||
|
react: 19.2.4
|
||||||
|
react-dom: 19.2.4(react@19.2.4)
|
||||||
|
vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)
|
||||||
|
|
||||||
|
better-call@1.1.8(zod@4.3.6):
|
||||||
|
dependencies:
|
||||||
|
'@better-auth/utils': 0.3.0
|
||||||
|
'@better-fetch/fetch': 1.1.21
|
||||||
|
rou3: 0.7.12
|
||||||
|
set-cookie-parser: 2.7.2
|
||||||
|
optionalDependencies:
|
||||||
|
zod: 4.3.6
|
||||||
|
|
||||||
body-parser@2.2.2:
|
body-parser@2.2.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
bytes: 3.1.2
|
bytes: 3.1.2
|
||||||
@@ -7608,6 +7883,8 @@ snapshots:
|
|||||||
|
|
||||||
deep-eql@5.0.2: {}
|
deep-eql@5.0.2: {}
|
||||||
|
|
||||||
|
defu@6.1.4: {}
|
||||||
|
|
||||||
delayed-stream@1.0.0: {}
|
delayed-stream@1.0.0: {}
|
||||||
|
|
||||||
depd@2.0.0: {}
|
depd@2.0.0: {}
|
||||||
@@ -7655,10 +7932,11 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
drizzle-orm@0.38.4(@electric-sql/pglite@0.3.15)(@types/react@19.2.14)(pg@8.18.0)(postgres@3.4.8)(react@19.2.4):
|
drizzle-orm@0.38.4(@electric-sql/pglite@0.3.15)(@types/react@19.2.14)(kysely@0.28.11)(pg@8.18.0)(postgres@3.4.8)(react@19.2.4):
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@electric-sql/pglite': 0.3.15
|
'@electric-sql/pglite': 0.3.15
|
||||||
'@types/react': 19.2.14
|
'@types/react': 19.2.14
|
||||||
|
kysely: 0.28.11
|
||||||
pg: 8.18.0
|
pg: 8.18.0
|
||||||
postgres: 3.4.8
|
postgres: 3.4.8
|
||||||
react: 19.2.4
|
react: 19.2.4
|
||||||
@@ -8063,6 +8341,8 @@ snapshots:
|
|||||||
|
|
||||||
jiti@2.6.1: {}
|
jiti@2.6.1: {}
|
||||||
|
|
||||||
|
jose@6.1.3: {}
|
||||||
|
|
||||||
joycon@3.1.1: {}
|
joycon@3.1.1: {}
|
||||||
|
|
||||||
js-tokens@4.0.0: {}
|
js-tokens@4.0.0: {}
|
||||||
@@ -8079,6 +8359,8 @@ snapshots:
|
|||||||
|
|
||||||
kleur@4.1.5: {}
|
kleur@4.1.5: {}
|
||||||
|
|
||||||
|
kysely@0.28.11: {}
|
||||||
|
|
||||||
lexical@0.35.0: {}
|
lexical@0.35.0: {}
|
||||||
|
|
||||||
lib0@0.2.117:
|
lib0@0.2.117:
|
||||||
@@ -8174,6 +8456,13 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
mdast-util-find-and-replace@3.0.2:
|
||||||
|
dependencies:
|
||||||
|
'@types/mdast': 4.0.4
|
||||||
|
escape-string-regexp: 5.0.0
|
||||||
|
unist-util-is: 6.0.1
|
||||||
|
unist-util-visit-parents: 6.0.2
|
||||||
|
|
||||||
mdast-util-from-markdown@2.0.2:
|
mdast-util-from-markdown@2.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/mdast': 4.0.4
|
'@types/mdast': 4.0.4
|
||||||
@@ -8202,6 +8491,24 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
mdast-util-gfm-autolink-literal@2.0.1:
|
||||||
|
dependencies:
|
||||||
|
'@types/mdast': 4.0.4
|
||||||
|
ccount: 2.0.1
|
||||||
|
devlop: 1.1.0
|
||||||
|
mdast-util-find-and-replace: 3.0.2
|
||||||
|
micromark-util-character: 2.1.1
|
||||||
|
|
||||||
|
mdast-util-gfm-footnote@2.1.0:
|
||||||
|
dependencies:
|
||||||
|
'@types/mdast': 4.0.4
|
||||||
|
devlop: 1.1.0
|
||||||
|
mdast-util-from-markdown: 2.0.2
|
||||||
|
mdast-util-to-markdown: 2.1.2
|
||||||
|
micromark-util-normalize-identifier: 2.0.1
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
mdast-util-gfm-strikethrough@2.0.0:
|
mdast-util-gfm-strikethrough@2.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/mdast': 4.0.4
|
'@types/mdast': 4.0.4
|
||||||
@@ -8229,6 +8536,18 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
mdast-util-gfm@3.1.0:
|
||||||
|
dependencies:
|
||||||
|
mdast-util-from-markdown: 2.0.2
|
||||||
|
mdast-util-gfm-autolink-literal: 2.0.1
|
||||||
|
mdast-util-gfm-footnote: 2.1.0
|
||||||
|
mdast-util-gfm-strikethrough: 2.0.0
|
||||||
|
mdast-util-gfm-table: 2.0.0
|
||||||
|
mdast-util-gfm-task-list-item: 2.0.0
|
||||||
|
mdast-util-to-markdown: 2.1.2
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
mdast-util-highlight-mark@1.2.2:
|
mdast-util-highlight-mark@1.2.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
micromark-extension-highlight-mark: 1.2.0
|
micromark-extension-highlight-mark: 1.2.0
|
||||||
@@ -8359,6 +8678,24 @@ snapshots:
|
|||||||
micromark-util-symbol: 2.0.1
|
micromark-util-symbol: 2.0.1
|
||||||
micromark-util-types: 2.0.2
|
micromark-util-types: 2.0.2
|
||||||
|
|
||||||
|
micromark-extension-gfm-autolink-literal@2.1.0:
|
||||||
|
dependencies:
|
||||||
|
micromark-util-character: 2.1.1
|
||||||
|
micromark-util-sanitize-uri: 2.0.1
|
||||||
|
micromark-util-symbol: 2.0.1
|
||||||
|
micromark-util-types: 2.0.2
|
||||||
|
|
||||||
|
micromark-extension-gfm-footnote@2.1.0:
|
||||||
|
dependencies:
|
||||||
|
devlop: 1.1.0
|
||||||
|
micromark-core-commonmark: 2.0.3
|
||||||
|
micromark-factory-space: 2.0.1
|
||||||
|
micromark-util-character: 2.1.1
|
||||||
|
micromark-util-normalize-identifier: 2.0.1
|
||||||
|
micromark-util-sanitize-uri: 2.0.1
|
||||||
|
micromark-util-symbol: 2.0.1
|
||||||
|
micromark-util-types: 2.0.2
|
||||||
|
|
||||||
micromark-extension-gfm-strikethrough@2.1.0:
|
micromark-extension-gfm-strikethrough@2.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
devlop: 1.1.0
|
devlop: 1.1.0
|
||||||
@@ -8376,6 +8713,10 @@ snapshots:
|
|||||||
micromark-util-symbol: 2.0.1
|
micromark-util-symbol: 2.0.1
|
||||||
micromark-util-types: 2.0.2
|
micromark-util-types: 2.0.2
|
||||||
|
|
||||||
|
micromark-extension-gfm-tagfilter@2.0.0:
|
||||||
|
dependencies:
|
||||||
|
micromark-util-types: 2.0.2
|
||||||
|
|
||||||
micromark-extension-gfm-task-list-item@2.1.0:
|
micromark-extension-gfm-task-list-item@2.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
devlop: 1.1.0
|
devlop: 1.1.0
|
||||||
@@ -8384,6 +8725,17 @@ snapshots:
|
|||||||
micromark-util-symbol: 2.0.1
|
micromark-util-symbol: 2.0.1
|
||||||
micromark-util-types: 2.0.2
|
micromark-util-types: 2.0.2
|
||||||
|
|
||||||
|
micromark-extension-gfm@3.0.0:
|
||||||
|
dependencies:
|
||||||
|
micromark-extension-gfm-autolink-literal: 2.1.0
|
||||||
|
micromark-extension-gfm-footnote: 2.1.0
|
||||||
|
micromark-extension-gfm-strikethrough: 2.1.0
|
||||||
|
micromark-extension-gfm-table: 2.1.1
|
||||||
|
micromark-extension-gfm-tagfilter: 2.0.0
|
||||||
|
micromark-extension-gfm-task-list-item: 2.1.0
|
||||||
|
micromark-util-combine-extensions: 2.0.1
|
||||||
|
micromark-util-types: 2.0.2
|
||||||
|
|
||||||
micromark-extension-highlight-mark@1.2.0:
|
micromark-extension-highlight-mark@1.2.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
micromark-util-chunked: 2.0.1
|
micromark-util-chunked: 2.0.1
|
||||||
@@ -8616,6 +8968,8 @@ snapshots:
|
|||||||
|
|
||||||
nanoid@3.3.11: {}
|
nanoid@3.3.11: {}
|
||||||
|
|
||||||
|
nanostores@1.1.0: {}
|
||||||
|
|
||||||
negotiator@1.0.0: {}
|
negotiator@1.0.0: {}
|
||||||
|
|
||||||
next-tick@1.1.0: {}
|
next-tick@1.1.0: {}
|
||||||
@@ -8969,6 +9323,17 @@ snapshots:
|
|||||||
|
|
||||||
real-require@0.2.0: {}
|
real-require@0.2.0: {}
|
||||||
|
|
||||||
|
remark-gfm@4.0.1:
|
||||||
|
dependencies:
|
||||||
|
'@types/mdast': 4.0.4
|
||||||
|
mdast-util-gfm: 3.1.0
|
||||||
|
micromark-extension-gfm: 3.0.0
|
||||||
|
remark-parse: 11.0.0
|
||||||
|
remark-stringify: 11.0.0
|
||||||
|
unified: 11.0.5
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
remark-parse@11.0.0:
|
remark-parse@11.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/mdast': 4.0.4
|
'@types/mdast': 4.0.4
|
||||||
@@ -8986,6 +9351,12 @@ snapshots:
|
|||||||
unified: 11.0.5
|
unified: 11.0.5
|
||||||
vfile: 6.0.3
|
vfile: 6.0.3
|
||||||
|
|
||||||
|
remark-stringify@11.0.0:
|
||||||
|
dependencies:
|
||||||
|
'@types/mdast': 4.0.4
|
||||||
|
mdast-util-to-markdown: 2.1.2
|
||||||
|
unified: 11.0.5
|
||||||
|
|
||||||
resolve-pkg-maps@1.0.0: {}
|
resolve-pkg-maps@1.0.0: {}
|
||||||
|
|
||||||
rollup@4.57.1:
|
rollup@4.57.1:
|
||||||
@@ -9019,6 +9390,8 @@ snapshots:
|
|||||||
'@rollup/rollup-win32-x64-msvc': 4.57.1
|
'@rollup/rollup-win32-x64-msvc': 4.57.1
|
||||||
fsevents: 2.3.3
|
fsevents: 2.3.3
|
||||||
|
|
||||||
|
rou3@0.7.12: {}
|
||||||
|
|
||||||
router@2.2.0:
|
router@2.2.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
@@ -9455,4 +9828,6 @@ snapshots:
|
|||||||
|
|
||||||
zod@3.25.76: {}
|
zod@3.25.76: {}
|
||||||
|
|
||||||
|
zod@4.3.6: {}
|
||||||
|
|
||||||
zwitch@2.0.4: {}
|
zwitch@2.0.4: {}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
"@paperclip/db": "workspace:*",
|
"@paperclip/db": "workspace:*",
|
||||||
"@paperclip/shared": "workspace:*",
|
"@paperclip/shared": "workspace:*",
|
||||||
"@aws-sdk/client-s3": "^3.888.0",
|
"@aws-sdk/client-s3": "^3.888.0",
|
||||||
|
"better-auth": "^1.3.8",
|
||||||
"detect-port": "^2.1.0",
|
"detect-port": "^2.1.0",
|
||||||
"dotenv": "^17.0.1",
|
"dotenv": "^17.0.1",
|
||||||
"drizzle-orm": "^0.38.4",
|
"drizzle-orm": "^0.38.4",
|
||||||
|
|||||||
@@ -10,6 +10,9 @@
|
|||||||
"typecheck": "tsc -b"
|
"typecheck": "tsc -b"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@dnd-kit/core": "^6.3.1",
|
||||||
|
"@dnd-kit/sortable": "^10.0.0",
|
||||||
|
"@dnd-kit/utilities": "^3.2.2",
|
||||||
"@mdxeditor/editor": "^3.52.4",
|
"@mdxeditor/editor": "^3.52.4",
|
||||||
"@paperclip/adapter-claude-local": "workspace:*",
|
"@paperclip/adapter-claude-local": "workspace:*",
|
||||||
"@paperclip/adapter-codex-local": "workspace:*",
|
"@paperclip/adapter-codex-local": "workspace:*",
|
||||||
@@ -27,6 +30,7 @@
|
|||||||
"react-dom": "^19.0.0",
|
"react-dom": "^19.0.0",
|
||||||
"react-markdown": "^10.1.0",
|
"react-markdown": "^10.1.0",
|
||||||
"react-router-dom": "^7.1.5",
|
"react-router-dom": "^7.1.5",
|
||||||
|
"remark-gfm": "^4.0.1",
|
||||||
"tailwind-merge": "^3.4.1"
|
"tailwind-merge": "^3.4.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
Reference in New Issue
Block a user