@paperclipai/server 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/codex-models.d.ts +4 -0
- package/dist/adapters/codex-models.d.ts.map +1 -0
- package/dist/adapters/codex-models.js +98 -0
- package/dist/adapters/codex-models.js.map +1 -0
- package/dist/adapters/http/execute.d.ts +3 -0
- package/dist/adapters/http/execute.d.ts.map +1 -0
- package/dist/adapters/http/execute.js +39 -0
- package/dist/adapters/http/execute.js.map +1 -0
- package/dist/adapters/http/index.d.ts +3 -0
- package/dist/adapters/http/index.d.ts.map +1 -0
- package/dist/adapters/http/index.js +20 -0
- package/dist/adapters/http/index.js.map +1 -0
- package/dist/adapters/http/test.d.ts +3 -0
- package/dist/adapters/http/test.d.ts.map +1 -0
- package/dist/adapters/http/test.js +106 -0
- package/dist/adapters/http/test.js.map +1 -0
- package/dist/adapters/index.d.ts +4 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +3 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/process/execute.d.ts +3 -0
- package/dist/adapters/process/execute.d.ts.map +1 -0
- package/dist/adapters/process/execute.js +63 -0
- package/dist/adapters/process/execute.js.map +1 -0
- package/dist/adapters/process/index.d.ts +3 -0
- package/dist/adapters/process/index.d.ts.map +1 -0
- package/dist/adapters/process/index.js +23 -0
- package/dist/adapters/process/index.js.map +1 -0
- package/dist/adapters/process/test.d.ts +3 -0
- package/dist/adapters/process/test.d.ts.map +1 -0
- package/dist/adapters/process/test.js +77 -0
- package/dist/adapters/process/test.js.map +1 -0
- package/dist/adapters/registry.d.ts +9 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +63 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/types.d.ts +2 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/utils.d.ts +10 -0
- package/dist/adapters/utils.d.ts.map +1 -0
- package/dist/adapters/utils.js +14 -0
- package/dist/adapters/utils.js.map +1 -0
- package/dist/agent-auth-jwt.d.ts +14 -0
- package/dist/agent-auth-jwt.d.ts.map +1 -0
- package/dist/agent-auth-jwt.js +117 -0
- package/dist/agent-auth-jwt.js.map +1 -0
- package/dist/app.d.ts +20 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +127 -0
- package/dist/app.js.map +1 -0
- package/dist/auth/better-auth.d.ts +23 -0
- package/dist/auth/better-auth.d.ts.map +1 -0
- package/dist/auth/better-auth.js +80 -0
- package/dist/auth/better-auth.js.map +1 -0
- package/dist/board-claim.d.ts +23 -0
- package/dist/board-claim.d.ts.map +1 -0
- package/dist/board-claim.js +115 -0
- package/dist/board-claim.js.map +1 -0
- package/dist/config-file.d.ts +3 -0
- package/dist/config-file.d.ts.map +1 -0
- package/dist/config-file.js +16 -0
- package/dist/config-file.js.map +1 -0
- package/dist/config.d.ts +33 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +114 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +12 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +28 -0
- package/dist/errors.js.map +1 -0
- package/dist/home-paths.d.ts +11 -0
- package/dist/home-paths.d.ts.map +1 -0
- package/dist/home-paths.js +54 -0
- package/dist/home-paths.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +439 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +12 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +124 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/board-mutation-guard.d.ts +3 -0
- package/dist/middleware/board-mutation-guard.d.ts.map +1 -0
- package/dist/middleware/board-mutation-guard.js +60 -0
- package/dist/middleware/board-mutation-guard.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +3 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +22 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/index.d.ts +4 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +4 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/logger.d.ts +4 -0
- package/dist/middleware/logger.d.ts.map +1 -0
- package/dist/middleware/logger.js +37 -0
- package/dist/middleware/logger.js.map +1 -0
- package/dist/middleware/private-hostname-guard.d.ts +11 -0
- package/dist/middleware/private-hostname-guard.d.ts.map +1 -0
- package/dist/middleware/private-hostname-guard.js +78 -0
- package/dist/middleware/private-hostname-guard.js.map +1 -0
- package/dist/middleware/validate.d.ts +4 -0
- package/dist/middleware/validate.d.ts.map +1 -0
- package/dist/middleware/validate.js +7 -0
- package/dist/middleware/validate.js.map +1 -0
- package/dist/paths.d.ts +3 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +31 -0
- package/dist/paths.js.map +1 -0
- package/dist/realtime/live-events-ws.d.ts +10 -0
- package/dist/realtime/live-events-ws.d.ts.map +1 -0
- package/dist/realtime/live-events-ws.js +185 -0
- package/dist/realtime/live-events-ws.js.map +1 -0
- package/dist/redaction.d.ts +4 -0
- package/dist/redaction.d.ts.map +1 -0
- package/dist/redaction.js +63 -0
- package/dist/redaction.js.map +1 -0
- package/dist/routes/access.d.ts +9 -0
- package/dist/routes/access.d.ts.map +1 -0
- package/dist/routes/access.js +887 -0
- package/dist/routes/access.js.map +1 -0
- package/dist/routes/activity.d.ts +3 -0
- package/dist/routes/activity.d.ts.map +1 -0
- package/dist/routes/activity.js +87 -0
- package/dist/routes/activity.js.map +1 -0
- package/dist/routes/agents.d.ts +3 -0
- package/dist/routes/agents.d.ts.map +1 -0
- package/dist/routes/agents.js +1132 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/approvals.d.ts +3 -0
- package/dist/routes/approvals.d.ts.map +1 -0
- package/dist/routes/approvals.js +271 -0
- package/dist/routes/approvals.js.map +1 -0
- package/dist/routes/assets.d.ts +4 -0
- package/dist/routes/assets.d.ts.map +1 -0
- package/dist/routes/assets.js +138 -0
- package/dist/routes/assets.js.map +1 -0
- package/dist/routes/authz.d.ts +15 -0
- package/dist/routes/authz.d.ts.map +1 -0
- package/dist/routes/authz.js +40 -0
- package/dist/routes/authz.js.map +1 -0
- package/dist/routes/companies.d.ts +3 -0
- package/dist/routes/companies.d.ts.map +1 -0
- package/dist/routes/companies.js +159 -0
- package/dist/routes/companies.js.map +1 -0
- package/dist/routes/costs.d.ts +3 -0
- package/dist/routes/costs.d.ts.map +1 -0
- package/dist/routes/costs.js +113 -0
- package/dist/routes/costs.js.map +1 -0
- package/dist/routes/dashboard.d.ts +3 -0
- package/dist/routes/dashboard.d.ts.map +1 -0
- package/dist/routes/dashboard.js +15 -0
- package/dist/routes/dashboard.js.map +1 -0
- package/dist/routes/goals.d.ts +3 -0
- package/dist/routes/goals.d.ts.map +1 -0
- package/dist/routes/goals.js +95 -0
- package/dist/routes/goals.js.map +1 -0
- package/dist/routes/health.d.ts +9 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +38 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/index.d.ts +15 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +15 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/issues.d.ts +4 -0
- package/dist/routes/issues.d.ts.map +1 -0
- package/dist/routes/issues.js +973 -0
- package/dist/routes/issues.js.map +1 -0
- package/dist/routes/llms.d.ts +3 -0
- package/dist/routes/llms.d.ts.map +1 -0
- package/dist/routes/llms.js +78 -0
- package/dist/routes/llms.js.map +1 -0
- package/dist/routes/projects.d.ts +3 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +253 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/secrets.d.ts +3 -0
- package/dist/routes/secrets.d.ts.map +1 -0
- package/dist/routes/secrets.js +128 -0
- package/dist/routes/secrets.js.map +1 -0
- package/dist/routes/sidebar-badges.d.ts +3 -0
- package/dist/routes/sidebar-badges.d.ts.map +1 -0
- package/dist/routes/sidebar-badges.js +47 -0
- package/dist/routes/sidebar-badges.js.map +1 -0
- package/dist/secrets/external-stub-providers.d.ts +5 -0
- package/dist/secrets/external-stub-providers.d.ts.map +1 -0
- package/dist/secrets/external-stub-providers.js +21 -0
- package/dist/secrets/external-stub-providers.js.map +1 -0
- package/dist/secrets/local-encrypted-provider.d.ts +3 -0
- package/dist/secrets/local-encrypted-provider.d.ts.map +1 -0
- package/dist/secrets/local-encrypted-provider.js +116 -0
- package/dist/secrets/local-encrypted-provider.js.map +1 -0
- package/dist/secrets/provider-registry.d.ts +5 -0
- package/dist/secrets/provider-registry.d.ts.map +1 -0
- package/dist/secrets/provider-registry.js +20 -0
- package/dist/secrets/provider-registry.js.map +1 -0
- package/dist/secrets/types.d.ts +21 -0
- package/dist/secrets/types.d.ts.map +1 -0
- package/dist/secrets/types.js +2 -0
- package/dist/secrets/types.js.map +1 -0
- package/dist/services/access.d.ts +81 -0
- package/dist/services/access.d.ts.map +1 -0
- package/dist/services/access.js +187 -0
- package/dist/services/access.js.map +1 -0
- package/dist/services/activity-log.d.ts +14 -0
- package/dist/services/activity-log.d.ts.map +1 -0
- package/dist/services/activity-log.js +32 -0
- package/dist/services/activity-log.js.map +1 -0
- package/dist/services/activity.d.ts +764 -0
- package/dist/services/activity.d.ts.map +1 -0
- package/dist/services/activity.js +105 -0
- package/dist/services/activity.js.map +1 -0
- package/dist/services/agent-permissions.d.ts +6 -0
- package/dist/services/agent-permissions.d.ts.map +1 -0
- package/dist/services/agent-permissions.js +18 -0
- package/dist/services/agent-permissions.js.map +1 -0
- package/dist/services/agents.d.ts +1494 -0
- package/dist/services/agents.d.ts.map +1 -0
- package/dist/services/agents.js +454 -0
- package/dist/services/agents.js.map +1 -0
- package/dist/services/approvals.d.ts +540 -0
- package/dist/services/approvals.d.ts.map +1 -0
- package/dist/services/approvals.js +173 -0
- package/dist/services/approvals.js.map +1 -0
- package/dist/services/assets.d.ts +33 -0
- package/dist/services/assets.d.ts.map +1 -0
- package/dist/services/assets.js +17 -0
- package/dist/services/assets.js.map +1 -0
- package/dist/services/companies.d.ts +503 -0
- package/dist/services/companies.d.ts.map +1 -0
- package/dist/services/companies.js +120 -0
- package/dist/services/companies.js.map +1 -0
- package/dist/services/company-portability.d.ts +8 -0
- package/dist/services/company-portability.d.ts.map +1 -0
- package/dist/services/company-portability.js +851 -0
- package/dist/services/company-portability.js.map +1 -0
- package/dist/services/costs.d.ts +50 -0
- package/dist/services/costs.d.ts.map +1 -0
- package/dist/services/costs.js +166 -0
- package/dist/services/costs.js.map +1 -0
- package/dist/services/dashboard.d.ts +21 -0
- package/dist/services/dashboard.d.ts.map +1 -0
- package/dist/services/dashboard.js +96 -0
- package/dist/services/dashboard.js.map +1 -0
- package/dist/services/goals.d.ts +407 -0
- package/dist/services/goals.d.ts.map +1 -0
- package/dist/services/goals.js +29 -0
- package/dist/services/goals.js.map +1 -0
- package/dist/services/heartbeat.d.ts +1666 -0
- package/dist/services/heartbeat.d.ts.map +1 -0
- package/dist/services/heartbeat.js +1752 -0
- package/dist/services/heartbeat.js.map +1 -0
- package/dist/services/index.d.ts +20 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +20 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/issue-approvals.d.ts +56 -0
- package/dist/services/issue-approvals.d.ts.map +1 -0
- package/dist/services/issue-approvals.js +153 -0
- package/dist/services/issue-approvals.js.map +1 -0
- package/dist/services/issues.d.ts +756 -0
- package/dist/services/issues.d.ts.map +1 -0
- package/dist/services/issues.js +917 -0
- package/dist/services/issues.js.map +1 -0
- package/dist/services/live-events.d.ts +12 -0
- package/dist/services/live-events.d.ts.map +1 -0
- package/dist/services/live-events.js +24 -0
- package/dist/services/live-events.js.map +1 -0
- package/dist/services/projects.d.ts +66 -0
- package/dist/services/projects.d.ts.map +1 -0
- package/dist/services/projects.js +472 -0
- package/dist/services/projects.js.map +1 -0
- package/dist/services/run-log-store.d.ts +34 -0
- package/dist/services/run-log-store.d.ts.map +1 -0
- package/dist/services/run-log-store.js +112 -0
- package/dist/services/run-log-store.js.map +1 -0
- package/dist/services/secrets.d.ts +506 -0
- package/dist/services/secrets.d.ts.map +1 -0
- package/dist/services/secrets.js +284 -0
- package/dist/services/secrets.js.map +1 -0
- package/dist/services/sidebar-badges.d.ts +9 -0
- package/dist/services/sidebar-badges.d.ts.map +1 -0
- package/dist/services/sidebar-badges.js +33 -0
- package/dist/services/sidebar-badges.js.map +1 -0
- package/dist/startup-banner.d.ts +27 -0
- package/dist/startup-banner.d.ts.map +1 -0
- package/dist/startup-banner.js +112 -0
- package/dist/startup-banner.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +29 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local-disk-provider.d.ts +3 -0
- package/dist/storage/local-disk-provider.d.ts.map +1 -0
- package/dist/storage/local-disk-provider.js +79 -0
- package/dist/storage/local-disk-provider.js.map +1 -0
- package/dist/storage/provider-registry.d.ts +4 -0
- package/dist/storage/provider-registry.d.ts.map +1 -0
- package/dist/storage/provider-registry.js +15 -0
- package/dist/storage/provider-registry.js.map +1 -0
- package/dist/storage/s3-provider.d.ts +11 -0
- package/dist/storage/s3-provider.d.ts.map +1 -0
- package/dist/storage/s3-provider.js +123 -0
- package/dist/storage/s3-provider.js.map +1 -0
- package/dist/storage/service.d.ts +3 -0
- package/dist/storage/service.d.ts.map +1 -0
- package/dist/storage/service.js +120 -0
- package/dist/storage/service.js.map +1 -0
- package/dist/storage/types.d.ts +55 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export type { AdapterAgent, AdapterRuntime, UsageSummary, AdapterExecutionResult, AdapterInvocationMeta, AdapterExecutionContext, AdapterEnvironmentCheckLevel, AdapterEnvironmentCheck, AdapterEnvironmentTestStatus, AdapterEnvironmentTestResult, AdapterEnvironmentTestContext, AdapterSessionCodec, AdapterModel, ServerAdapterModule, } from "@paperclipai/adapter-utils";
|
|
2
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,4BAA4B,EAC5B,uBAAuB,EACvB,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,GACpB,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { type RunProcessResult, runningProcesses, MAX_CAPTURE_BYTES, MAX_EXCERPT_BYTES, parseObject, asString, asNumber, asBoolean, asStringArray, parseJson, appendWithCap, resolvePathValue, renderTemplate, redactEnvForLogs, buildPaperclipEnv, defaultPathForPlatform, ensurePathInEnv, ensureAbsoluteDirectory, ensureCommandResolvable, } from "@paperclipai/adapter-utils/server-utils";
|
|
2
|
+
import type { RunProcessResult } from "@paperclipai/adapter-utils/server-utils";
|
|
3
|
+
export declare function runChildProcess(runId: string, command: string, args: string[], opts: {
|
|
4
|
+
cwd: string;
|
|
5
|
+
env: Record<string, string>;
|
|
6
|
+
timeoutSec: number;
|
|
7
|
+
graceSec: number;
|
|
8
|
+
onLog: (stream: "stdout" | "stderr", chunk: string) => Promise<void>;
|
|
9
|
+
}): Promise<RunProcessResult>;
|
|
10
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/adapters/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,gBAAgB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,aAAa,EACb,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,yCAAyC,CAAC;AAIjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAEhF,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE;IACJ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE,GACA,OAAO,CAAC,gBAAgB,CAAC,CAK3B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Re-export everything from the shared adapter-utils/server-utils package.
|
|
2
|
+
// This file is kept as a convenience shim so existing in-tree
|
|
3
|
+
// imports (process/, http/, heartbeat.ts) don't need rewriting.
|
|
4
|
+
import { logger } from "../middleware/logger.js";
|
|
5
|
+
export { runningProcesses, MAX_CAPTURE_BYTES, MAX_EXCERPT_BYTES, parseObject, asString, asNumber, asBoolean, asStringArray, parseJson, appendWithCap, resolvePathValue, renderTemplate, redactEnvForLogs, buildPaperclipEnv, defaultPathForPlatform, ensurePathInEnv, ensureAbsoluteDirectory, ensureCommandResolvable, } from "@paperclipai/adapter-utils/server-utils";
|
|
6
|
+
// Re-export runChildProcess with the server's pino logger wired in.
|
|
7
|
+
import { runChildProcess as _runChildProcess } from "@paperclipai/adapter-utils/server-utils";
|
|
8
|
+
export async function runChildProcess(runId, command, args, opts) {
|
|
9
|
+
return _runChildProcess(runId, command, args, {
|
|
10
|
+
...opts,
|
|
11
|
+
onLogError: (err, id, msg) => logger.warn({ err, runId: id }, msg),
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/adapters/utils.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,8DAA8D;AAC9D,gEAAgE;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAEL,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,aAAa,EACb,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,yCAAyC,CAAC;AAEjD,oEAAoE;AACpE,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAG9F,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAa,EACb,OAAe,EACf,IAAc,EACd,IAMC;IAED,OAAO,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;QAC5C,GAAG,IAAI;QACP,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;KACnE,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface LocalAgentJwtClaims {
|
|
2
|
+
sub: string;
|
|
3
|
+
company_id: string;
|
|
4
|
+
adapter_type: string;
|
|
5
|
+
run_id: string;
|
|
6
|
+
iat: number;
|
|
7
|
+
exp: number;
|
|
8
|
+
iss?: string;
|
|
9
|
+
aud?: string;
|
|
10
|
+
jti?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function createLocalAgentJwt(agentId: string, companyId: string, adapterType: string, runId: string): string | null;
|
|
13
|
+
export declare function verifyLocalAgentJwt(token: string): LocalAgentJwtClaims | null;
|
|
14
|
+
//# sourceMappingURL=agent-auth-jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-auth-jwt.d.ts","sourceRoot":"","sources":["../src/agent-auth-jwt.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAkDD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,iBAyBzG;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CA8C7E"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
2
|
+
const JWT_ALGORITHM = "HS256";
|
|
3
|
+
function parseNumber(value, fallback) {
|
|
4
|
+
const parsed = Number(value);
|
|
5
|
+
if (!Number.isFinite(parsed) || parsed <= 0)
|
|
6
|
+
return fallback;
|
|
7
|
+
return Math.floor(parsed);
|
|
8
|
+
}
|
|
9
|
+
function jwtConfig() {
|
|
10
|
+
const secret = process.env.PAPERCLIP_AGENT_JWT_SECRET;
|
|
11
|
+
if (!secret)
|
|
12
|
+
return null;
|
|
13
|
+
return {
|
|
14
|
+
secret,
|
|
15
|
+
ttlSeconds: parseNumber(process.env.PAPERCLIP_AGENT_JWT_TTL_SECONDS, 60 * 60 * 48),
|
|
16
|
+
issuer: process.env.PAPERCLIP_AGENT_JWT_ISSUER ?? "paperclip",
|
|
17
|
+
audience: process.env.PAPERCLIP_AGENT_JWT_AUDIENCE ?? "paperclip-api",
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function base64UrlEncode(value) {
|
|
21
|
+
return Buffer.from(value, "utf8").toString("base64url");
|
|
22
|
+
}
|
|
23
|
+
function base64UrlDecode(value) {
|
|
24
|
+
return Buffer.from(value, "base64url").toString("utf8");
|
|
25
|
+
}
|
|
26
|
+
function signPayload(secret, signingInput) {
|
|
27
|
+
return createHmac("sha256", secret).update(signingInput).digest("base64url");
|
|
28
|
+
}
|
|
29
|
+
function parseJson(value) {
|
|
30
|
+
try {
|
|
31
|
+
const parsed = JSON.parse(value);
|
|
32
|
+
return parsed && typeof parsed === "object" ? parsed : null;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function safeCompare(a, b) {
|
|
39
|
+
const left = Buffer.from(a);
|
|
40
|
+
const right = Buffer.from(b);
|
|
41
|
+
if (left.length !== right.length)
|
|
42
|
+
return false;
|
|
43
|
+
return timingSafeEqual(left, right);
|
|
44
|
+
}
|
|
45
|
+
export function createLocalAgentJwt(agentId, companyId, adapterType, runId) {
|
|
46
|
+
const config = jwtConfig();
|
|
47
|
+
if (!config)
|
|
48
|
+
return null;
|
|
49
|
+
const now = Math.floor(Date.now() / 1000);
|
|
50
|
+
const claims = {
|
|
51
|
+
sub: agentId,
|
|
52
|
+
company_id: companyId,
|
|
53
|
+
adapter_type: adapterType,
|
|
54
|
+
run_id: runId,
|
|
55
|
+
iat: now,
|
|
56
|
+
exp: now + config.ttlSeconds,
|
|
57
|
+
iss: config.issuer,
|
|
58
|
+
aud: config.audience,
|
|
59
|
+
};
|
|
60
|
+
const header = {
|
|
61
|
+
alg: JWT_ALGORITHM,
|
|
62
|
+
typ: "JWT",
|
|
63
|
+
};
|
|
64
|
+
const signingInput = `${base64UrlEncode(JSON.stringify(header))}.${base64UrlEncode(JSON.stringify(claims))}`;
|
|
65
|
+
const signature = signPayload(config.secret, signingInput);
|
|
66
|
+
return `${signingInput}.${signature}`;
|
|
67
|
+
}
|
|
68
|
+
export function verifyLocalAgentJwt(token) {
|
|
69
|
+
if (!token)
|
|
70
|
+
return null;
|
|
71
|
+
const config = jwtConfig();
|
|
72
|
+
if (!config)
|
|
73
|
+
return null;
|
|
74
|
+
const parts = token.split(".");
|
|
75
|
+
if (parts.length !== 3)
|
|
76
|
+
return null;
|
|
77
|
+
const [headerB64, claimsB64, signature] = parts;
|
|
78
|
+
const header = parseJson(base64UrlDecode(headerB64));
|
|
79
|
+
if (!header || header.alg !== JWT_ALGORITHM)
|
|
80
|
+
return null;
|
|
81
|
+
const signingInput = `${headerB64}.${claimsB64}`;
|
|
82
|
+
const expectedSig = signPayload(config.secret, signingInput);
|
|
83
|
+
if (!safeCompare(signature, expectedSig))
|
|
84
|
+
return null;
|
|
85
|
+
const claims = parseJson(base64UrlDecode(claimsB64));
|
|
86
|
+
if (!claims)
|
|
87
|
+
return null;
|
|
88
|
+
const sub = typeof claims.sub === "string" ? claims.sub : null;
|
|
89
|
+
const companyId = typeof claims.company_id === "string" ? claims.company_id : null;
|
|
90
|
+
const adapterType = typeof claims.adapter_type === "string" ? claims.adapter_type : null;
|
|
91
|
+
const runId = typeof claims.run_id === "string" ? claims.run_id : null;
|
|
92
|
+
const iat = typeof claims.iat === "number" ? claims.iat : null;
|
|
93
|
+
const exp = typeof claims.exp === "number" ? claims.exp : null;
|
|
94
|
+
if (!sub || !companyId || !adapterType || !runId || !iat || !exp)
|
|
95
|
+
return null;
|
|
96
|
+
const now = Math.floor(Date.now() / 1000);
|
|
97
|
+
if (exp < now)
|
|
98
|
+
return null;
|
|
99
|
+
const issuer = typeof claims.iss === "string" ? claims.iss : undefined;
|
|
100
|
+
const audience = typeof claims.aud === "string" ? claims.aud : undefined;
|
|
101
|
+
if (issuer && issuer !== config.issuer)
|
|
102
|
+
return null;
|
|
103
|
+
if (audience && audience !== config.audience)
|
|
104
|
+
return null;
|
|
105
|
+
return {
|
|
106
|
+
sub,
|
|
107
|
+
company_id: companyId,
|
|
108
|
+
adapter_type: adapterType,
|
|
109
|
+
run_id: runId,
|
|
110
|
+
iat,
|
|
111
|
+
exp,
|
|
112
|
+
...(issuer ? { iss: issuer } : {}),
|
|
113
|
+
...(audience ? { aud: audience } : {}),
|
|
114
|
+
jti: typeof claims.jti === "string" ? claims.jti : undefined,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=agent-auth-jwt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-auth-jwt.js","sourceRoot":"","sources":["../src/agent-auth-jwt.ts"],"names":[],"mappings":"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"}
|
package/dist/app.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import express, { type Request as ExpressRequest } from "express";
|
|
2
|
+
import type { Db } from "@paperclipai/db";
|
|
3
|
+
import type { DeploymentExposure, DeploymentMode } from "@paperclipai/shared";
|
|
4
|
+
import type { StorageService } from "./storage/types.js";
|
|
5
|
+
import type { BetterAuthSessionResult } from "./auth/better-auth.js";
|
|
6
|
+
type UiMode = "none" | "static" | "vite-dev";
|
|
7
|
+
export declare function createApp(db: Db, opts: {
|
|
8
|
+
uiMode: UiMode;
|
|
9
|
+
storageService: StorageService;
|
|
10
|
+
deploymentMode: DeploymentMode;
|
|
11
|
+
deploymentExposure: DeploymentExposure;
|
|
12
|
+
allowedHostnames: string[];
|
|
13
|
+
bindHost: string;
|
|
14
|
+
authReady: boolean;
|
|
15
|
+
companyDeletionEnabled: boolean;
|
|
16
|
+
betterAuthHandler?: express.RequestHandler;
|
|
17
|
+
resolveSession?: (req: ExpressRequest) => Promise<BetterAuthSessionResult | null>;
|
|
18
|
+
}): Promise<import("express-serve-static-core").Express>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,EAAE,EAAU,KAAK,OAAO,IAAI,cAAc,EAAE,MAAM,SAAS,CAAC;AAI1E,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAoBzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,KAAK,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE7C,wBAAsB,SAAS,CAC7B,EAAE,EAAE,EAAE,EACN,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,sBAAsB,EAAE,OAAO,CAAC;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAC3C,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;CACnF,wDAuHF"}
|
package/dist/app.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import express, { Router } from "express";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { httpLogger, errorHandler } from "./middleware/index.js";
|
|
6
|
+
import { actorMiddleware } from "./middleware/auth.js";
|
|
7
|
+
import { boardMutationGuard } from "./middleware/board-mutation-guard.js";
|
|
8
|
+
import { privateHostnameGuard, resolvePrivateHostnameAllowSet } from "./middleware/private-hostname-guard.js";
|
|
9
|
+
import { healthRoutes } from "./routes/health.js";
|
|
10
|
+
import { companyRoutes } from "./routes/companies.js";
|
|
11
|
+
import { agentRoutes } from "./routes/agents.js";
|
|
12
|
+
import { projectRoutes } from "./routes/projects.js";
|
|
13
|
+
import { issueRoutes } from "./routes/issues.js";
|
|
14
|
+
import { goalRoutes } from "./routes/goals.js";
|
|
15
|
+
import { approvalRoutes } from "./routes/approvals.js";
|
|
16
|
+
import { secretRoutes } from "./routes/secrets.js";
|
|
17
|
+
import { costRoutes } from "./routes/costs.js";
|
|
18
|
+
import { activityRoutes } from "./routes/activity.js";
|
|
19
|
+
import { dashboardRoutes } from "./routes/dashboard.js";
|
|
20
|
+
import { sidebarBadgeRoutes } from "./routes/sidebar-badges.js";
|
|
21
|
+
import { llmRoutes } from "./routes/llms.js";
|
|
22
|
+
import { assetRoutes } from "./routes/assets.js";
|
|
23
|
+
import { accessRoutes } from "./routes/access.js";
|
|
24
|
+
export async function createApp(db, opts) {
|
|
25
|
+
const app = express();
|
|
26
|
+
app.use(express.json());
|
|
27
|
+
app.use(httpLogger);
|
|
28
|
+
const privateHostnameGateEnabled = opts.deploymentMode === "authenticated" && opts.deploymentExposure === "private";
|
|
29
|
+
const privateHostnameAllowSet = resolvePrivateHostnameAllowSet({
|
|
30
|
+
allowedHostnames: opts.allowedHostnames,
|
|
31
|
+
bindHost: opts.bindHost,
|
|
32
|
+
});
|
|
33
|
+
app.use(privateHostnameGuard({
|
|
34
|
+
enabled: privateHostnameGateEnabled,
|
|
35
|
+
allowedHostnames: opts.allowedHostnames,
|
|
36
|
+
bindHost: opts.bindHost,
|
|
37
|
+
}));
|
|
38
|
+
app.use(actorMiddleware(db, {
|
|
39
|
+
deploymentMode: opts.deploymentMode,
|
|
40
|
+
resolveSession: opts.resolveSession,
|
|
41
|
+
}));
|
|
42
|
+
app.get("/api/auth/get-session", (req, res) => {
|
|
43
|
+
if (req.actor.type !== "board" || !req.actor.userId) {
|
|
44
|
+
res.status(401).json({ error: "Unauthorized" });
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
res.json({
|
|
48
|
+
session: {
|
|
49
|
+
id: `paperclip:${req.actor.source}:${req.actor.userId}`,
|
|
50
|
+
userId: req.actor.userId,
|
|
51
|
+
},
|
|
52
|
+
user: {
|
|
53
|
+
id: req.actor.userId,
|
|
54
|
+
email: null,
|
|
55
|
+
name: req.actor.source === "local_implicit" ? "Local Board" : null,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
if (opts.betterAuthHandler) {
|
|
60
|
+
app.all("/api/auth/*authPath", opts.betterAuthHandler);
|
|
61
|
+
}
|
|
62
|
+
app.use(llmRoutes(db));
|
|
63
|
+
// Mount API routes
|
|
64
|
+
const api = Router();
|
|
65
|
+
api.use(boardMutationGuard());
|
|
66
|
+
api.use("/health", healthRoutes(db, {
|
|
67
|
+
deploymentMode: opts.deploymentMode,
|
|
68
|
+
deploymentExposure: opts.deploymentExposure,
|
|
69
|
+
authReady: opts.authReady,
|
|
70
|
+
companyDeletionEnabled: opts.companyDeletionEnabled,
|
|
71
|
+
}));
|
|
72
|
+
api.use("/companies", companyRoutes(db));
|
|
73
|
+
api.use(agentRoutes(db));
|
|
74
|
+
api.use(assetRoutes(db, opts.storageService));
|
|
75
|
+
api.use(projectRoutes(db));
|
|
76
|
+
api.use(issueRoutes(db, opts.storageService));
|
|
77
|
+
api.use(goalRoutes(db));
|
|
78
|
+
api.use(approvalRoutes(db));
|
|
79
|
+
api.use(secretRoutes(db));
|
|
80
|
+
api.use(costRoutes(db));
|
|
81
|
+
api.use(activityRoutes(db));
|
|
82
|
+
api.use(dashboardRoutes(db));
|
|
83
|
+
api.use(sidebarBadgeRoutes(db));
|
|
84
|
+
api.use(accessRoutes(db, {
|
|
85
|
+
deploymentMode: opts.deploymentMode,
|
|
86
|
+
deploymentExposure: opts.deploymentExposure,
|
|
87
|
+
bindHost: opts.bindHost,
|
|
88
|
+
allowedHostnames: opts.allowedHostnames,
|
|
89
|
+
}));
|
|
90
|
+
app.use("/api", api);
|
|
91
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
92
|
+
if (opts.uiMode === "static") {
|
|
93
|
+
// Serve built UI from ui/dist in production.
|
|
94
|
+
const uiDist = path.resolve(__dirname, "../../ui/dist");
|
|
95
|
+
app.use(express.static(uiDist));
|
|
96
|
+
app.get(/.*/, (_req, res) => {
|
|
97
|
+
res.sendFile(path.join(uiDist, "index.html"));
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
if (opts.uiMode === "vite-dev") {
|
|
101
|
+
const uiRoot = path.resolve(__dirname, "../../ui");
|
|
102
|
+
const { createServer: createViteServer } = await import("vite");
|
|
103
|
+
const vite = await createViteServer({
|
|
104
|
+
root: uiRoot,
|
|
105
|
+
appType: "spa",
|
|
106
|
+
server: {
|
|
107
|
+
middlewareMode: true,
|
|
108
|
+
allowedHosts: privateHostnameGateEnabled ? Array.from(privateHostnameAllowSet) : undefined,
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
app.use(vite.middlewares);
|
|
112
|
+
app.get(/.*/, async (req, res, next) => {
|
|
113
|
+
try {
|
|
114
|
+
const templatePath = path.resolve(uiRoot, "index.html");
|
|
115
|
+
const template = fs.readFileSync(templatePath, "utf-8");
|
|
116
|
+
const html = await vite.transformIndexHtml(req.originalUrl, template);
|
|
117
|
+
res.status(200).set({ "Content-Type": "text/html" }).end(html);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
next(err);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
app.use(errorHandler);
|
|
125
|
+
return app;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Request, RequestHandler } from "express";
|
|
2
|
+
import { betterAuth } from "better-auth";
|
|
3
|
+
import type { Db } from "@paperclipai/db";
|
|
4
|
+
import type { Config } from "../config.js";
|
|
5
|
+
export type BetterAuthSessionUser = {
|
|
6
|
+
id: string;
|
|
7
|
+
email?: string | null;
|
|
8
|
+
name?: string | null;
|
|
9
|
+
};
|
|
10
|
+
export type BetterAuthSessionResult = {
|
|
11
|
+
session: {
|
|
12
|
+
id: string;
|
|
13
|
+
userId: string;
|
|
14
|
+
} | null;
|
|
15
|
+
user: BetterAuthSessionUser | null;
|
|
16
|
+
};
|
|
17
|
+
type BetterAuthInstance = ReturnType<typeof betterAuth>;
|
|
18
|
+
export declare function createBetterAuthInstance(db: Db, config: Config): BetterAuthInstance;
|
|
19
|
+
export declare function createBetterAuthHandler(auth: BetterAuthInstance): RequestHandler;
|
|
20
|
+
export declare function resolveBetterAuthSessionFromHeaders(auth: BetterAuthInstance, headers: Headers): Promise<BetterAuthSessionResult | null>;
|
|
21
|
+
export declare function resolveBetterAuthSession(auth: BetterAuthInstance, req: Request): Promise<BetterAuthSessionResult | null>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=better-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"better-auth.d.ts","sourceRoot":"","sources":["../../src/auth/better-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAO1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/C,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAmBxD,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CA2BnF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG,cAAc,CAKhF;AAED,wBAAsB,mCAAmC,CACvD,IAAI,EAAE,kBAAkB,EACxB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CA0BzC;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,kBAAkB,EACxB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAEzC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { betterAuth } from "better-auth";
|
|
2
|
+
import { drizzleAdapter } from "better-auth/adapters/drizzle";
|
|
3
|
+
import { toNodeHandler } from "better-auth/node";
|
|
4
|
+
import { authAccounts, authSessions, authUsers, authVerifications, } from "@paperclipai/db";
|
|
5
|
+
function headersFromNodeHeaders(rawHeaders) {
|
|
6
|
+
const headers = new Headers();
|
|
7
|
+
for (const [key, raw] of Object.entries(rawHeaders)) {
|
|
8
|
+
if (!raw)
|
|
9
|
+
continue;
|
|
10
|
+
if (Array.isArray(raw)) {
|
|
11
|
+
for (const value of raw)
|
|
12
|
+
headers.append(key, value);
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
headers.set(key, raw);
|
|
16
|
+
}
|
|
17
|
+
return headers;
|
|
18
|
+
}
|
|
19
|
+
function headersFromExpressRequest(req) {
|
|
20
|
+
return headersFromNodeHeaders(req.headers);
|
|
21
|
+
}
|
|
22
|
+
export function createBetterAuthInstance(db, config) {
|
|
23
|
+
const baseUrl = config.authBaseUrlMode === "explicit" ? config.authPublicBaseUrl : undefined;
|
|
24
|
+
const secret = process.env.BETTER_AUTH_SECRET ?? process.env.PAPERCLIP_AGENT_JWT_SECRET ?? "paperclip-dev-secret";
|
|
25
|
+
const authConfig = {
|
|
26
|
+
baseURL: baseUrl,
|
|
27
|
+
secret,
|
|
28
|
+
database: drizzleAdapter(db, {
|
|
29
|
+
provider: "pg",
|
|
30
|
+
schema: {
|
|
31
|
+
user: authUsers,
|
|
32
|
+
session: authSessions,
|
|
33
|
+
account: authAccounts,
|
|
34
|
+
verification: authVerifications,
|
|
35
|
+
},
|
|
36
|
+
}),
|
|
37
|
+
emailAndPassword: {
|
|
38
|
+
enabled: true,
|
|
39
|
+
requireEmailVerification: false,
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
if (!baseUrl) {
|
|
43
|
+
delete authConfig.baseURL;
|
|
44
|
+
}
|
|
45
|
+
return betterAuth(authConfig);
|
|
46
|
+
}
|
|
47
|
+
export function createBetterAuthHandler(auth) {
|
|
48
|
+
const handler = toNodeHandler(auth);
|
|
49
|
+
return (req, res, next) => {
|
|
50
|
+
void Promise.resolve(handler(req, res)).catch(next);
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export async function resolveBetterAuthSessionFromHeaders(auth, headers) {
|
|
54
|
+
const api = auth.api;
|
|
55
|
+
if (!api?.getSession)
|
|
56
|
+
return null;
|
|
57
|
+
const sessionValue = await api.getSession({
|
|
58
|
+
headers,
|
|
59
|
+
});
|
|
60
|
+
if (!sessionValue || typeof sessionValue !== "object")
|
|
61
|
+
return null;
|
|
62
|
+
const value = sessionValue;
|
|
63
|
+
const session = value.session?.id && value.session.userId
|
|
64
|
+
? { id: value.session.id, userId: value.session.userId }
|
|
65
|
+
: null;
|
|
66
|
+
const user = value.user?.id
|
|
67
|
+
? {
|
|
68
|
+
id: value.user.id,
|
|
69
|
+
email: value.user.email ?? null,
|
|
70
|
+
name: value.user.name ?? null,
|
|
71
|
+
}
|
|
72
|
+
: null;
|
|
73
|
+
if (!session || !user)
|
|
74
|
+
return null;
|
|
75
|
+
return { session, user };
|
|
76
|
+
}
|
|
77
|
+
export async function resolveBetterAuthSession(auth, req) {
|
|
78
|
+
return resolveBetterAuthSessionFromHeaders(auth, headersFromExpressRequest(req));
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=better-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"better-auth.js","sourceRoot":"","sources":["../../src/auth/better-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Db } from "@paperclipai/db";
|
|
2
|
+
import type { DeploymentMode } from "@paperclipai/shared";
|
|
3
|
+
type ChallengeStatus = "available" | "claimed" | "expired" | "invalid";
|
|
4
|
+
export declare function initializeBoardClaimChallenge(db: Db, opts: {
|
|
5
|
+
deploymentMode: DeploymentMode;
|
|
6
|
+
}): Promise<void>;
|
|
7
|
+
export declare function getBoardClaimWarningUrl(host: string, port: number): string | null;
|
|
8
|
+
export declare function inspectBoardClaimChallenge(token: string, code: string | undefined): {
|
|
9
|
+
status: ChallengeStatus;
|
|
10
|
+
requiresSignIn: boolean;
|
|
11
|
+
expiresAt: string | null;
|
|
12
|
+
claimedByUserId: string | null;
|
|
13
|
+
};
|
|
14
|
+
export declare function claimBoardOwnership(db: Db, opts: {
|
|
15
|
+
token: string;
|
|
16
|
+
code: string | undefined;
|
|
17
|
+
userId: string;
|
|
18
|
+
}): Promise<{
|
|
19
|
+
status: ChallengeStatus;
|
|
20
|
+
claimedByUserId?: string;
|
|
21
|
+
}>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=board-claim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board-claim.d.ts","sourceRoot":"","sources":["../src/board-claim.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAK1D,KAAK,eAAe,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAiCvE,wBAAsB,6BAA6B,CACjD,EAAE,EAAE,EAAE,EACN,IAAI,EAAE;IAAE,cAAc,EAAE,cAAc,CAAA;CAAE,GACvC,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKjF;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS;;;;;EAQjF;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,EAAE,EACN,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChE,OAAO,CAAC;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA6DhE"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { and, eq } from "drizzle-orm";
|
|
3
|
+
import { companies, companyMemberships, instanceUserRoles } from "@paperclipai/db";
|
|
4
|
+
const LOCAL_BOARD_USER_ID = "local-board";
|
|
5
|
+
const CLAIM_TTL_MS = 1000 * 60 * 60 * 24;
|
|
6
|
+
let activeChallenge = null;
|
|
7
|
+
function createChallenge(now = new Date()) {
|
|
8
|
+
return {
|
|
9
|
+
token: randomBytes(24).toString("hex"),
|
|
10
|
+
code: randomBytes(12).toString("hex"),
|
|
11
|
+
createdAt: now,
|
|
12
|
+
expiresAt: new Date(now.getTime() + CLAIM_TTL_MS),
|
|
13
|
+
claimedAt: null,
|
|
14
|
+
claimedByUserId: null,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function getChallengeStatus(token, code) {
|
|
18
|
+
if (!activeChallenge)
|
|
19
|
+
return "invalid";
|
|
20
|
+
if (activeChallenge.token !== token)
|
|
21
|
+
return "invalid";
|
|
22
|
+
if (activeChallenge.code !== (code ?? ""))
|
|
23
|
+
return "invalid";
|
|
24
|
+
if (activeChallenge.claimedAt)
|
|
25
|
+
return "claimed";
|
|
26
|
+
if (activeChallenge.expiresAt.getTime() <= Date.now())
|
|
27
|
+
return "expired";
|
|
28
|
+
return "available";
|
|
29
|
+
}
|
|
30
|
+
export async function initializeBoardClaimChallenge(db, opts) {
|
|
31
|
+
if (opts.deploymentMode !== "authenticated") {
|
|
32
|
+
activeChallenge = null;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const admins = await db
|
|
36
|
+
.select({ userId: instanceUserRoles.userId })
|
|
37
|
+
.from(instanceUserRoles)
|
|
38
|
+
.where(eq(instanceUserRoles.role, "instance_admin"));
|
|
39
|
+
const onlyLocalBoardAdmin = admins.length === 1 && admins[0]?.userId === LOCAL_BOARD_USER_ID;
|
|
40
|
+
if (!onlyLocalBoardAdmin) {
|
|
41
|
+
activeChallenge = null;
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (!activeChallenge || activeChallenge.expiresAt.getTime() <= Date.now() || activeChallenge.claimedAt) {
|
|
45
|
+
activeChallenge = createChallenge();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function getBoardClaimWarningUrl(host, port) {
|
|
49
|
+
if (!activeChallenge)
|
|
50
|
+
return null;
|
|
51
|
+
if (activeChallenge.claimedAt || activeChallenge.expiresAt.getTime() <= Date.now())
|
|
52
|
+
return null;
|
|
53
|
+
const visibleHost = host === "0.0.0.0" ? "localhost" : host;
|
|
54
|
+
return `http://${visibleHost}:${port}/board-claim/${activeChallenge.token}?code=${activeChallenge.code}`;
|
|
55
|
+
}
|
|
56
|
+
export function inspectBoardClaimChallenge(token, code) {
|
|
57
|
+
const status = getChallengeStatus(token, code);
|
|
58
|
+
return {
|
|
59
|
+
status,
|
|
60
|
+
requiresSignIn: true,
|
|
61
|
+
expiresAt: activeChallenge?.expiresAt?.toISOString() ?? null,
|
|
62
|
+
claimedByUserId: activeChallenge?.claimedByUserId ?? null,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export async function claimBoardOwnership(db, opts) {
|
|
66
|
+
const status = getChallengeStatus(opts.token, opts.code);
|
|
67
|
+
if (status !== "available")
|
|
68
|
+
return { status };
|
|
69
|
+
await db.transaction(async (tx) => {
|
|
70
|
+
const existingTargetAdmin = await tx
|
|
71
|
+
.select({ id: instanceUserRoles.id })
|
|
72
|
+
.from(instanceUserRoles)
|
|
73
|
+
.where(and(eq(instanceUserRoles.userId, opts.userId), eq(instanceUserRoles.role, "instance_admin")))
|
|
74
|
+
.then((rows) => rows[0] ?? null);
|
|
75
|
+
if (!existingTargetAdmin) {
|
|
76
|
+
await tx.insert(instanceUserRoles).values({
|
|
77
|
+
userId: opts.userId,
|
|
78
|
+
role: "instance_admin",
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
await tx
|
|
82
|
+
.delete(instanceUserRoles)
|
|
83
|
+
.where(and(eq(instanceUserRoles.userId, LOCAL_BOARD_USER_ID), eq(instanceUserRoles.role, "instance_admin")));
|
|
84
|
+
const allCompanies = await tx.select({ id: companies.id }).from(companies);
|
|
85
|
+
for (const company of allCompanies) {
|
|
86
|
+
const existing = await tx
|
|
87
|
+
.select({ id: companyMemberships.id, status: companyMemberships.status })
|
|
88
|
+
.from(companyMemberships)
|
|
89
|
+
.where(and(eq(companyMemberships.companyId, company.id), eq(companyMemberships.principalType, "user"), eq(companyMemberships.principalId, opts.userId)))
|
|
90
|
+
.then((rows) => rows[0] ?? null);
|
|
91
|
+
if (!existing) {
|
|
92
|
+
await tx.insert(companyMemberships).values({
|
|
93
|
+
companyId: company.id,
|
|
94
|
+
principalType: "user",
|
|
95
|
+
principalId: opts.userId,
|
|
96
|
+
status: "active",
|
|
97
|
+
membershipRole: "owner",
|
|
98
|
+
});
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (existing.status !== "active") {
|
|
102
|
+
await tx
|
|
103
|
+
.update(companyMemberships)
|
|
104
|
+
.set({ status: "active", membershipRole: "owner", updatedAt: new Date() })
|
|
105
|
+
.where(eq(companyMemberships.id, existing.id));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
if (activeChallenge && activeChallenge.token === opts.token) {
|
|
110
|
+
activeChallenge.claimedAt = new Date();
|
|
111
|
+
activeChallenge.claimedByUserId = opts.userId;
|
|
112
|
+
}
|
|
113
|
+
return { status: "claimed", claimedByUserId: opts.userId };
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=board-claim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board-claim.js","sourceRoot":"","sources":["../src/board-claim.ts"],"names":[],"mappings":"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"}
|