refactor: rename packages to @paperclipai and CLI binary to paperclipai

Rename all workspace packages from @paperclip/* to @paperclipai/* and
the CLI binary from `paperclip` to `paperclipai` in preparation for
npm publishing. Bump CLI version to 0.1.0 and add package metadata
(description, keywords, license, repository, files). Update all
imports, documentation, user-facing messages, and tests accordingly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dotta
2026-03-03 08:45:26 -06:00
parent 5a5549fc54
commit f60c1001ec
196 changed files with 501 additions and 490 deletions

View File

@@ -1,5 +1,5 @@
{
"name": "@paperclip/server",
"name": "@paperclipai/server",
"version": "0.0.1",
"private": true,
"type": "module",
@@ -11,12 +11,12 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@paperclip/adapter-claude-local": "workspace:*",
"@paperclip/adapter-codex-local": "workspace:*",
"@paperclip/adapter-openclaw": "workspace:*",
"@paperclip/adapter-utils": "workspace:*",
"@paperclip/db": "workspace:*",
"@paperclip/shared": "workspace:*",
"@paperclipai/adapter-claude-local": "workspace:*",
"@paperclipai/adapter-codex-local": "workspace:*",
"@paperclipai/adapter-openclaw": "workspace:*",
"@paperclipai/adapter-utils": "workspace:*",
"@paperclipai/db": "workspace:*",
"@paperclipai/shared": "workspace:*",
"@aws-sdk/client-s3": "^3.888.0",
"better-auth": "^1.3.8",
"detect-port": "^2.1.0",

View File

@@ -1,5 +1,5 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
import { models as codexFallbackModels } from "@paperclip/adapter-codex-local";
import { models as codexFallbackModels } from "@paperclipai/adapter-codex-local";
import { listAdapterModels } from "../adapters/index.js";
import { resetCodexModelsCacheForTests } from "../adapters/codex-models.js";

View File

@@ -1,6 +1,6 @@
import { describe, expect, it } from "vitest";
import { sessionCodec as claudeSessionCodec } from "@paperclip/adapter-claude-local/server";
import { sessionCodec as codexSessionCodec, isCodexUnknownSessionError } from "@paperclip/adapter-codex-local/server";
import { sessionCodec as claudeSessionCodec } from "@paperclipai/adapter-claude-local/server";
import { sessionCodec as codexSessionCodec, isCodexUnknownSessionError } from "@paperclipai/adapter-codex-local/server";
describe("adapter session codecs", () => {
it("normalizes claude session params with cwd", () => {

View File

@@ -1,5 +1,5 @@
import { afterEach, describe, expect, it } from "vitest";
import { testEnvironment } from "@paperclip/adapter-claude-local/server";
import { testEnvironment } from "@paperclipai/adapter-claude-local/server";
const ORIGINAL_ANTHROPIC = process.env.ANTHROPIC_API_KEY;

View File

@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { isClaudeMaxTurnsResult } from "@paperclip/adapter-claude-local/server";
import { isClaudeMaxTurnsResult } from "@paperclipai/adapter-claude-local/server";
describe("claude_local max-turn detection", () => {
it("detects max-turn exhaustion by subtype", () => {

View File

@@ -1,7 +1,7 @@
import { describe, expect, it, vi } from "vitest";
import { isCodexUnknownSessionError, parseCodexJsonl } from "@paperclip/adapter-codex-local/server";
import { parseCodexStdoutLine } from "@paperclip/adapter-codex-local/ui";
import { printCodexStreamEvent } from "@paperclip/adapter-codex-local/cli";
import { isCodexUnknownSessionError, parseCodexJsonl } from "@paperclipai/adapter-codex-local/server";
import { parseCodexStdoutLine } from "@paperclipai/adapter-codex-local/ui";
import { printCodexStreamEvent } from "@paperclipai/adapter-codex-local/cli";
describe("codex_local parser", () => {
it("extracts session, summary, usage, and terminal error message", () => {

View File

@@ -44,13 +44,13 @@ describe("privateHostnameGuard", () => {
const app = createApp({ enabled: true, allowedHostnames: ["some-other-host"] });
const res = await request(app).get("/api/health").set("Host", "dotta-macbook-pro:3100");
expect(res.status).toBe(403);
expect(res.body?.error).toContain("please run pnpm paperclip allowed-hostname dotta-macbook-pro");
expect(res.body?.error).toContain("please run pnpm paperclipai allowed-hostname dotta-macbook-pro");
});
it("blocks unknown hostnames on page routes with plain-text remediation command", async () => {
const app = createApp({ enabled: true, allowedHostnames: ["some-other-host"] });
const res = await request(app).get("/dashboard").set("Host", "dotta-macbook-pro:3100");
expect(res.status).toBe(403);
expect(res.text).toContain("please run pnpm paperclip allowed-hostname dotta-macbook-pro");
expect(res.text).toContain("please run pnpm paperclipai allowed-hostname dotta-macbook-pro");
});
});

View File

@@ -1,5 +1,5 @@
import type { AdapterModel } from "./types.js";
import { models as codexFallbackModels } from "@paperclip/adapter-codex-local";
import { models as codexFallbackModels } from "@paperclipai/adapter-codex-local";
import { readConfigFile } from "../config-file.js";
const OPENAI_MODELS_ENDPOINT = "https://api.openai.com/v1/models";

View File

@@ -13,5 +13,5 @@ export type {
UsageSummary,
AdapterAgent,
AdapterRuntime,
} from "@paperclip/adapter-utils";
} from "@paperclipai/adapter-utils";
export { runningProcesses } from "./utils.js";

View File

@@ -3,22 +3,22 @@ import {
execute as claudeExecute,
testEnvironment as claudeTestEnvironment,
sessionCodec as claudeSessionCodec,
} from "@paperclip/adapter-claude-local/server";
import { agentConfigurationDoc as claudeAgentConfigurationDoc, models as claudeModels } from "@paperclip/adapter-claude-local";
} from "@paperclipai/adapter-claude-local/server";
import { agentConfigurationDoc as claudeAgentConfigurationDoc, models as claudeModels } from "@paperclipai/adapter-claude-local";
import {
execute as codexExecute,
testEnvironment as codexTestEnvironment,
sessionCodec as codexSessionCodec,
} from "@paperclip/adapter-codex-local/server";
import { agentConfigurationDoc as codexAgentConfigurationDoc, models as codexModels } from "@paperclip/adapter-codex-local";
} from "@paperclipai/adapter-codex-local/server";
import { agentConfigurationDoc as codexAgentConfigurationDoc, models as codexModels } from "@paperclipai/adapter-codex-local";
import {
execute as openclawExecute,
testEnvironment as openclawTestEnvironment,
} from "@paperclip/adapter-openclaw/server";
} from "@paperclipai/adapter-openclaw/server";
import {
agentConfigurationDoc as openclawAgentConfigurationDoc,
models as openclawModels,
} from "@paperclip/adapter-openclaw";
} from "@paperclipai/adapter-openclaw";
import { listCodexModels } from "./codex-models.js";
import { processAdapter } from "./process/index.js";
import { httpAdapter } from "./http/index.js";

View File

@@ -16,4 +16,4 @@ export type {
AdapterSessionCodec,
AdapterModel,
ServerAdapterModule,
} from "@paperclip/adapter-utils";
} from "@paperclipai/adapter-utils";

View File

@@ -22,11 +22,11 @@ export {
ensurePathInEnv,
ensureAbsoluteDirectory,
ensureCommandResolvable,
} from "@paperclip/adapter-utils/server-utils";
} from "@paperclipai/adapter-utils/server-utils";
// Re-export runChildProcess with the server's pino logger wired in.
import { runChildProcess as _runChildProcess } from "@paperclip/adapter-utils/server-utils";
import type { RunProcessResult } from "@paperclip/adapter-utils/server-utils";
import { runChildProcess as _runChildProcess } from "@paperclipai/adapter-utils/server-utils";
import type { RunProcessResult } from "@paperclipai/adapter-utils/server-utils";
export async function runChildProcess(
runId: string,

View File

@@ -2,8 +2,8 @@ import express, { Router, type Request as ExpressRequest } from "express";
import path from "node:path";
import fs from "node:fs";
import { fileURLToPath } from "node:url";
import type { Db } from "@paperclip/db";
import type { DeploymentExposure, DeploymentMode } from "@paperclip/shared";
import type { Db } from "@paperclipai/db";
import type { DeploymentExposure, DeploymentMode } from "@paperclipai/shared";
import type { StorageService } from "./storage/types.js";
import { httpLogger, errorHandler } from "./middleware/index.js";
import { actorMiddleware } from "./middleware/auth.js";

View File

@@ -3,13 +3,13 @@ import type { IncomingHttpHeaders } from "node:http";
import { betterAuth } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { toNodeHandler } from "better-auth/node";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import {
authAccounts,
authSessions,
authUsers,
authVerifications,
} from "@paperclip/db";
} from "@paperclipai/db";
import type { Config } from "../config.js";
export type BetterAuthSessionUser = {

View File

@@ -1,8 +1,8 @@
import { randomBytes } from "node:crypto";
import { and, eq } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import { companies, companyMemberships, instanceUserRoles } from "@paperclip/db";
import type { DeploymentMode } from "@paperclip/shared";
import type { Db } from "@paperclipai/db";
import { companies, companyMemberships, instanceUserRoles } from "@paperclipai/db";
import type { DeploymentMode } from "@paperclipai/shared";
const LOCAL_BOARD_USER_ID = "local-board";
const CLAIM_TTL_MS = 1000 * 60 * 60 * 24;

View File

@@ -1,5 +1,5 @@
import fs from "node:fs";
import { paperclipConfigSchema, type PaperclipConfig } from "@paperclip/shared";
import { paperclipConfigSchema, type PaperclipConfig } from "@paperclipai/shared";
import { resolvePaperclipConfigPath } from "./paths.js";
export function readConfigFile(): PaperclipConfig | null {

View File

@@ -13,7 +13,7 @@ import {
type DeploymentMode,
type SecretProvider,
type StorageProvider,
} from "@paperclip/shared";
} from "@paperclipai/shared";
import {
resolveDefaultEmbeddedPostgresDir,
resolveDefaultSecretsKeyFilePath,

View File

@@ -15,7 +15,7 @@ import {
companies,
companyMemberships,
instanceUserRoles,
} from "@paperclip/db";
} from "@paperclipai/db";
import detectPort from "detect-port";
import { createApp } from "./app.js";
import { loadConfig } from "./config.js";

View File

@@ -1,10 +1,10 @@
import { createHash } from "node:crypto";
import type { Request, RequestHandler } from "express";
import { and, eq, isNull } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import { agentApiKeys, agents, companyMemberships, instanceUserRoles } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import { agentApiKeys, agents, companyMemberships, instanceUserRoles } from "@paperclipai/db";
import { verifyLocalAgentJwt } from "../agent-auth-jwt.js";
import type { DeploymentMode } from "@paperclip/shared";
import type { DeploymentMode } from "@paperclipai/shared";
import type { BetterAuthSessionResult } from "../auth/better-auth.js";
import { logger } from "./logger.js";

View File

@@ -45,7 +45,7 @@ export function resolvePrivateHostnameAllowSet(opts: { allowedHostnames: string[
function blockedHostnameMessage(hostname: string): string {
return (
`Hostname '${hostname}' is not allowed for this Paperclip instance. ` +
`If you want to allow this hostname, please run pnpm paperclip allowed-hostname ${hostname}`
`If you want to allow this hostname, please run pnpm paperclipai allowed-hostname ${hostname}`
);
}
@@ -68,7 +68,7 @@ export function privateHostnameGuard(opts: {
const wantsJson = req.path.startsWith("/api") || req.accepts(["json", "html", "text"]) === "json";
if (!hostname) {
const error = "Missing Host header. If you want to allow a hostname, run pnpm paperclip allowed-hostname <host>.";
const error = "Missing Host header. If you want to allow a hostname, run pnpm paperclipai allowed-hostname <host>.";
if (wantsJson) {
res.status(403).json({ error });
} else {

View File

@@ -2,9 +2,9 @@ import { createHash } from "node:crypto";
import type { IncomingMessage, Server as HttpServer } from "node:http";
import type { Duplex } from "node:stream";
import { and, eq, isNull } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import { agentApiKeys, companyMemberships, instanceUserRoles } from "@paperclip/db";
import type { DeploymentMode } from "@paperclip/shared";
import type { Db } from "@paperclipai/db";
import { agentApiKeys, companyMemberships, instanceUserRoles } from "@paperclipai/db";
import type { DeploymentMode } from "@paperclipai/shared";
import { WebSocket, WebSocketServer } from "ws";
import type { BetterAuthSessionResult } from "../auth/better-auth.js";
import { logger } from "../middleware/logger.js";

View File

@@ -5,13 +5,13 @@ import { fileURLToPath } from "node:url";
import { Router } from "express";
import type { Request } from "express";
import { and, eq, isNull, desc } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import {
agentApiKeys,
authUsers,
invites,
joinRequests,
} from "@paperclip/db";
} from "@paperclipai/db";
import {
acceptInviteSchema,
claimJoinRequestApiKeySchema,
@@ -20,8 +20,8 @@ import {
updateMemberPermissionsSchema,
updateUserCompanyAccessSchema,
PERMISSION_KEYS,
} from "@paperclip/shared";
import type { DeploymentExposure, DeploymentMode } from "@paperclip/shared";
} from "@paperclipai/shared";
import type { DeploymentExposure, DeploymentMode } from "@paperclipai/shared";
import { forbidden, conflict, notFound, unauthorized, badRequest } from "../errors.js";
import { validate } from "../middleware/validate.js";
import { accessService, agentService, logActivity } from "../services/index.js";
@@ -155,7 +155,7 @@ function buildJoinConnectivityDiagnostics(input: {
code: "openclaw_private_bind_not_allowed",
level: "warn",
message: `Paperclip bind host \"${bindHost}\" is not in allowed hostnames.`,
hint: `Run pnpm paperclip allowed-hostname ${bindHost}`,
hint: `Run pnpm paperclipai allowed-hostname ${bindHost}`,
});
}
if (callbackHost && !isLoopbackHost(callbackHost) && allowSet.size === 0) {
@@ -163,7 +163,7 @@ function buildJoinConnectivityDiagnostics(input: {
code: "openclaw_private_allowed_hostnames_empty",
level: "warn",
message: "No explicit allowed hostnames are configured for authenticated/private mode.",
hint: "Set one with pnpm paperclip allowed-hostname <host> when OpenClaw runs off-host.",
hint: "Set one with pnpm paperclipai allowed-hostname <host> when OpenClaw runs off-host.",
});
}
}
@@ -355,7 +355,7 @@ function buildInviteOnboardingManifest(
allowedHostnames: opts.allowedHostnames,
guidance:
opts.deploymentMode === "authenticated" && opts.deploymentExposure === "private"
? "If OpenClaw runs on another machine, ensure the Paperclip hostname is reachable and allowed via `pnpm paperclip allowed-hostname <host>`."
? "If OpenClaw runs on another machine, ensure the Paperclip hostname is reachable and allowed via `pnpm paperclipai allowed-hostname <host>`."
: "Ensure OpenClaw can reach this Paperclip API base URL for callbacks and claims.",
},
skill: {

View File

@@ -1,6 +1,6 @@
import { Router } from "express";
import { z } from "zod";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import { validate } from "../middleware/validate.js";
import { activityService } from "../services/activity.js";
import { assertBoard, assertCompanyAccess } from "./authz.js";

View File

@@ -1,8 +1,8 @@
import { Router, type Request } from "express";
import { randomUUID } from "node:crypto";
import path from "node:path";
import type { Db } from "@paperclip/db";
import { agents as agentsTable, companies, heartbeatRuns } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import { agents as agentsTable, companies, heartbeatRuns } from "@paperclipai/db";
import { and, desc, eq, inArray, not, sql } from "drizzle-orm";
import {
createAgentKeySchema,
@@ -15,7 +15,7 @@ import {
updateAgentInstructionsPathSchema,
wakeAgentSchema,
updateAgentSchema,
} from "@paperclip/shared";
} from "@paperclipai/shared";
import { validate } from "../middleware/validate.js";
import {
agentService,
@@ -31,7 +31,7 @@ import { conflict, forbidden, unprocessable } from "../errors.js";
import { assertBoard, assertCompanyAccess, getActorInfo } from "./authz.js";
import { findServerAdapter, listAdapterModels } from "../adapters/index.js";
import { redactEventPayload } from "../redaction.js";
import { runClaudeLogin } from "@paperclip/adapter-claude-local/server";
import { runClaudeLogin } from "@paperclipai/adapter-claude-local/server";
export function agentRoutes(db: Db) {
const DEFAULT_INSTRUCTIONS_PATH_KEYS: Record<string, string> = {

View File

@@ -1,12 +1,12 @@
import { Router } from "express";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import {
addApprovalCommentSchema,
createApprovalSchema,
requestApprovalRevisionSchema,
resolveApprovalSchema,
resubmitApprovalSchema,
} from "@paperclip/shared";
} from "@paperclipai/shared";
import { validate } from "../middleware/validate.js";
import { logger } from "../middleware/logger.js";
import {

View File

@@ -1,7 +1,7 @@
import { Router, type Request, type Response } from "express";
import multer from "multer";
import type { Db } from "@paperclip/db";
import { createAssetImageMetadataSchema } from "@paperclip/shared";
import type { Db } from "@paperclipai/db";
import { createAssetImageMetadataSchema } from "@paperclipai/shared";
import type { StorageService } from "../storage/types.js";
import { assetService, logActivity } from "../services/index.js";
import { assertCompanyAccess, getActorInfo } from "./authz.js";

View File

@@ -1,12 +1,12 @@
import { Router } from "express";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import {
companyPortabilityExportSchema,
companyPortabilityImportSchema,
companyPortabilityPreviewSchema,
createCompanySchema,
updateCompanySchema,
} from "@paperclip/shared";
} from "@paperclipai/shared";
import { forbidden } from "../errors.js";
import { validate } from "../middleware/validate.js";
import { accessService, companyPortabilityService, companyService, logActivity } from "../services/index.js";

View File

@@ -1,6 +1,6 @@
import { Router } from "express";
import type { Db } from "@paperclip/db";
import { createCostEventSchema, updateBudgetSchema } from "@paperclip/shared";
import type { Db } from "@paperclipai/db";
import { createCostEventSchema, updateBudgetSchema } from "@paperclipai/shared";
import { validate } from "../middleware/validate.js";
import { costService, companyService, agentService, logActivity } from "../services/index.js";
import { assertBoard, assertCompanyAccess, getActorInfo } from "./authz.js";

View File

@@ -1,5 +1,5 @@
import { Router } from "express";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import { dashboardService } from "../services/dashboard.js";
import { assertCompanyAccess } from "./authz.js";

View File

@@ -1,6 +1,6 @@
import { Router } from "express";
import type { Db } from "@paperclip/db";
import { createGoalSchema, updateGoalSchema } from "@paperclip/shared";
import type { Db } from "@paperclipai/db";
import { createGoalSchema, updateGoalSchema } from "@paperclipai/shared";
import { validate } from "../middleware/validate.js";
import { goalService, logActivity } from "../services/index.js";
import { assertCompanyAccess, getActorInfo } from "./authz.js";

View File

@@ -1,8 +1,8 @@
import { Router } from "express";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import { count, sql } from "drizzle-orm";
import { instanceUserRoles } from "@paperclip/db";
import type { DeploymentExposure, DeploymentMode } from "@paperclip/shared";
import { instanceUserRoles } from "@paperclipai/db";
import type { DeploymentExposure, DeploymentMode } from "@paperclipai/shared";
export function healthRoutes(
db?: Db,

View File

@@ -1,6 +1,6 @@
import { Router, type Request, type Response } from "express";
import multer from "multer";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import {
addIssueCommentSchema,
createIssueAttachmentMetadataSchema,
@@ -9,7 +9,7 @@ import {
createIssueSchema,
linkIssueApprovalSchema,
updateIssueSchema,
} from "@paperclip/shared";
} from "@paperclipai/shared";
import type { StorageService } from "../storage/types.js";
import { validate } from "../middleware/validate.js";
import {

View File

@@ -1,6 +1,6 @@
import { Router, type Request } from "express";
import type { Db } from "@paperclip/db";
import { AGENT_ICON_NAMES } from "@paperclip/shared";
import type { Db } from "@paperclipai/db";
import { AGENT_ICON_NAMES } from "@paperclipai/shared";
import { forbidden } from "../errors.js";
import { listServerAdapters } from "../adapters/index.js";
import { agentService } from "../services/agents.js";

View File

@@ -1,12 +1,12 @@
import { Router, type Request } from "express";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import {
createProjectSchema,
createProjectWorkspaceSchema,
isUuidLike,
updateProjectSchema,
updateProjectWorkspaceSchema,
} from "@paperclip/shared";
} from "@paperclipai/shared";
import { validate } from "../middleware/validate.js";
import { projectService, logActivity } from "../services/index.js";
import { conflict } from "../errors.js";

View File

@@ -1,12 +1,12 @@
import { Router } from "express";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import {
SECRET_PROVIDERS,
type SecretProvider,
createSecretSchema,
rotateSecretSchema,
updateSecretSchema,
} from "@paperclip/shared";
} from "@paperclipai/shared";
import { validate } from "../middleware/validate.js";
import { assertBoard, assertCompanyAccess } from "./authz.js";
import { logActivity, secretService } from "../services/index.js";

View File

@@ -1,7 +1,7 @@
import { Router } from "express";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import { and, eq, inArray, isNull, sql } from "drizzle-orm";
import { issues, joinRequests } from "@paperclip/db";
import { issues, joinRequests } from "@paperclipai/db";
import { sidebarBadgeService } from "../services/sidebar-badges.js";
import { accessService } from "../services/access.js";
import { assertCompanyAccess } from "./authz.js";

View File

@@ -1,4 +1,4 @@
import type { SecretProvider, SecretProviderDescriptor } from "@paperclip/shared";
import type { SecretProvider, SecretProviderDescriptor } from "@paperclipai/shared";
import { localEncryptedProvider } from "./local-encrypted-provider.js";
import {
awsSecretsManagerProvider,

View File

@@ -1,4 +1,4 @@
import type { SecretProvider, SecretProviderDescriptor } from "@paperclip/shared";
import type { SecretProvider, SecretProviderDescriptor } from "@paperclipai/shared";
export interface StoredSecretVersionMaterial {
[key: string]: unknown;

View File

@@ -1,11 +1,11 @@
import { and, eq, inArray, sql } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import {
companyMemberships,
instanceUserRoles,
principalPermissionGrants,
} from "@paperclip/db";
import type { PermissionKey, PrincipalType } from "@paperclip/shared";
} from "@paperclipai/db";
import type { PermissionKey, PrincipalType } from "@paperclipai/shared";
type MembershipRow = typeof companyMemberships.$inferSelect;
type GrantInput = {

View File

@@ -1,5 +1,5 @@
import type { Db } from "@paperclip/db";
import { activityLog } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import { activityLog } from "@paperclipai/db";
import { publishLiveEvent } from "./live-events.js";
import { sanitizeRecord } from "../redaction.js";

View File

@@ -1,6 +1,6 @@
import { and, desc, eq, isNull, or, sql } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import { activityLog, heartbeatRuns, issues } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import { activityLog, heartbeatRuns, issues } from "@paperclipai/db";
export interface ActivityFilters {
companyId: string;

View File

@@ -1,6 +1,6 @@
import { createHash, randomBytes } from "node:crypto";
import { and, desc, eq, inArray } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import {
agents,
agentConfigRevisions,
@@ -10,8 +10,8 @@ import {
agentWakeupRequests,
heartbeatRunEvents,
heartbeatRuns,
} from "@paperclip/db";
import { isUuidLike, normalizeAgentUrlKey } from "@paperclip/shared";
} from "@paperclipai/db";
import { isUuidLike, normalizeAgentUrlKey } from "@paperclipai/shared";
import { conflict, notFound, unprocessable } from "../errors.js";
import { normalizeAgentPermissions } from "./agent-permissions.js";
import { REDACTED_EVENT_VALUE, sanitizeRecord } from "../redaction.js";

View File

@@ -1,6 +1,6 @@
import { and, asc, eq } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import { approvalComments, approvals } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import { approvalComments, approvals } from "@paperclipai/db";
import { notFound, unprocessable } from "../errors.js";
import { agentService } from "./agents.js";

View File

@@ -1,6 +1,6 @@
import { eq } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import { assets } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import { assets } from "@paperclipai/db";
export function assetService(db: Db) {
return {

View File

@@ -1,5 +1,5 @@
import { eq, count } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import {
companies,
agents,
@@ -22,7 +22,7 @@ import {
invites,
principalPermissionGrants,
companyMemberships,
} from "@paperclip/db";
} from "@paperclipai/db";
export function companyService(db: Db) {
const ISSUE_PREFIX_FALLBACK = "CMP";

View File

@@ -1,6 +1,6 @@
import { promises as fs } from "node:fs";
import path from "node:path";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import type {
CompanyPortabilityAgentManifestEntry,
CompanyPortabilityCollisionStrategy,
@@ -13,8 +13,8 @@ import type {
CompanyPortabilityPreview,
CompanyPortabilityPreviewAgentPlan,
CompanyPortabilityPreviewResult,
} from "@paperclip/shared";
import { normalizeAgentUrlKey, portabilityManifestSchema } from "@paperclip/shared";
} from "@paperclipai/shared";
import { normalizeAgentUrlKey, portabilityManifestSchema } from "@paperclipai/shared";
import { notFound, unprocessable } from "../errors.js";
import { accessService } from "./access.js";
import { agentService } from "./agents.js";

View File

@@ -1,6 +1,6 @@
import { and, desc, eq, gte, isNotNull, lte, sql } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import { activityLog, agents, companies, costEvents, heartbeatRuns, issues, projects } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import { activityLog, agents, companies, costEvents, heartbeatRuns, issues, projects } from "@paperclipai/db";
import { notFound, unprocessable } from "../errors.js";
export interface CostDateRange {

View File

@@ -1,6 +1,6 @@
import { and, eq, gte, sql } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import { agents, approvals, companies, costEvents, issues } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import { agents, approvals, companies, costEvents, issues } from "@paperclipai/db";
import { notFound } from "../errors.js";
export function dashboardService(db: Db) {

View File

@@ -1,6 +1,6 @@
import { eq } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import { goals } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import { goals } from "@paperclipai/db";
export function goalService(db: Db) {
return {

View File

@@ -1,6 +1,6 @@
import fs from "node:fs/promises";
import { and, asc, desc, eq, gt, inArray, sql } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import {
agents,
agentRuntimeState,
@@ -11,7 +11,7 @@ import {
costEvents,
issues,
projectWorkspaces,
} from "@paperclip/db";
} from "@paperclipai/db";
import { conflict, notFound } from "../errors.js";
import { logger } from "../middleware/logger.js";
import { publishLiveEvent } from "./live-events.js";

View File

@@ -1,6 +1,6 @@
import { and, desc, eq, inArray } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import { approvals, issueApprovals, issues } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import { approvals, issueApprovals, issues } from "@paperclipai/db";
import { notFound, unprocessable } from "../errors.js";
import { redactEventPayload } from "../redaction.js";

View File

@@ -1,5 +1,5 @@
import { and, asc, desc, eq, inArray, isNull, or, sql } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import {
agents,
assets,
@@ -14,8 +14,8 @@ import {
labels,
projectWorkspaces,
projects,
} from "@paperclip/db";
import { extractProjectMentionIds } from "@paperclip/shared";
} from "@paperclipai/db";
import { extractProjectMentionIds } from "@paperclipai/shared";
import { conflict, notFound, unprocessable } from "../errors.js";
const ALL_ISSUE_STATUSES = ["backlog", "todo", "in_progress", "in_review", "blocked", "done", "cancelled"];

View File

@@ -1,5 +1,5 @@
import { EventEmitter } from "node:events";
import type { LiveEvent, LiveEventType } from "@paperclip/shared";
import type { LiveEvent, LiveEventType } from "@paperclipai/shared";
type LiveEventPayload = Record<string, unknown>;
type LiveEventListener = (event: LiveEvent) => void;

View File

@@ -1,6 +1,6 @@
import { and, asc, desc, eq, inArray } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import { projects, projectGoals, goals, projectWorkspaces } from "@paperclip/db";
import type { Db } from "@paperclipai/db";
import { projects, projectGoals, goals, projectWorkspaces } from "@paperclipai/db";
import {
PROJECT_COLORS,
deriveProjectUrlKey,
@@ -8,7 +8,7 @@ import {
normalizeProjectUrlKey,
type ProjectGoalRef,
type ProjectWorkspace,
} from "@paperclip/shared";
} from "@paperclipai/shared";
type ProjectRow = typeof projects.$inferSelect;
type ProjectWorkspaceRow = typeof projectWorkspaces.$inferSelect;

View File

@@ -1,8 +1,8 @@
import { and, desc, eq } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import { companySecrets, companySecretVersions } from "@paperclip/db";
import type { AgentEnvConfig, EnvBinding, SecretProvider } from "@paperclip/shared";
import { envBindingSchema } from "@paperclip/shared";
import type { Db } from "@paperclipai/db";
import { companySecrets, companySecretVersions } from "@paperclipai/db";
import type { AgentEnvConfig, EnvBinding, SecretProvider } from "@paperclipai/shared";
import { envBindingSchema } from "@paperclipai/shared";
import { conflict, notFound, unprocessable } from "../errors.js";
import { getSecretProvider, listSecretProviders } from "../secrets/provider-registry.js";

View File

@@ -1,7 +1,7 @@
import { and, desc, eq, inArray, not, sql } from "drizzle-orm";
import type { Db } from "@paperclip/db";
import { agents, approvals, heartbeatRuns } from "@paperclip/db";
import type { SidebarBadges } from "@paperclip/shared";
import type { Db } from "@paperclipai/db";
import { agents, approvals, heartbeatRuns } from "@paperclipai/db";
import type { SidebarBadges } from "@paperclipai/shared";
const ACTIONABLE_APPROVAL_STATUSES = ["pending", "revision_requested"];
const FAILED_HEARTBEAT_STATUSES = ["failed", "timed_out"];

View File

@@ -1,6 +1,6 @@
import { existsSync, readFileSync } from "node:fs";
import { resolvePaperclipConfigPath, resolvePaperclipEnvPath } from "./paths.js";
import type { DeploymentExposure, DeploymentMode } from "@paperclip/shared";
import type { DeploymentExposure, DeploymentMode } from "@paperclipai/shared";
import { parse as parseEnvFileContents } from "dotenv";
@@ -88,7 +88,7 @@ function resolveAgentJwtSecretStatus(
return {
status: "warn",
message: "missing (run `pnpm paperclip onboard`)",
message: "missing (run `pnpm paperclipai onboard`)",
};
}

View File

@@ -1,4 +1,4 @@
import type { StorageProvider as StorageProviderId } from "@paperclip/shared";
import type { StorageProvider as StorageProviderId } from "@paperclipai/shared";
import type { Readable } from "node:stream";
export interface PutObjectInput {