@kky42/pievo-server 1.0.0
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/.output/nitro.json +17 -0
- package/.output/public/assets/CodeField-dOzyFQNH.js +34 -0
- package/.output/public/assets/LoopView-B4H9QibC.js +55 -0
- package/.output/public/assets/Modal-D33gNSgx.js +1 -0
- package/.output/public/assets/SignIn-SHuRRyOv.js +1 -0
- package/.output/public/assets/actionUi-ChGGALzg.js +1 -0
- package/.output/public/assets/app-DElSo_jy.css +2 -0
- package/.output/public/assets/artifactView-DFuubXLJ.js +66 -0
- package/.output/public/assets/index-DfpTWRSz.js +12 -0
- package/.output/public/assets/invite._token-DJtd-XE2.js +1 -0
- package/.output/public/assets/invite._token-T8oo4Qtw.js +1 -0
- package/.output/public/assets/jsx-runtime-BseJUIpC.js +1 -0
- package/.output/public/assets/lifecycleUi-DKkChdnU.js +1 -0
- package/.output/public/assets/loopApi-BM2nj71x.js +3 -0
- package/.output/public/assets/loops._loopId-B19Jw7jC.js +5 -0
- package/.output/public/assets/loops._loopId_.runs._runId-_CflHV38.js +3 -0
- package/.output/public/assets/notifyFns-DCubjpRy.js +1 -0
- package/.output/public/assets/preload-helper-CKUiEq3b.js +3 -0
- package/.output/public/assets/routes-B9tgli5f.js +1 -0
- package/.output/public/assets/routes-CTtlM_qt.js +1 -0
- package/.output/public/assets/t._teamId-Bm21mngW.js +1 -0
- package/.output/public/assets/t._teamId-gR7BVKkR.js +1 -0
- package/.output/public/assets/ui-Dp88qUWh.js +1 -0
- package/.output/public/assets/useRouter-DsjH8G0p.js +1 -0
- package/.output/public/favicon.svg +12 -0
- package/.output/public/fonts/GeistPixel-Square.woff2 +0 -0
- package/.output/server/_chunks/ssr-renderer.mjs +26 -0
- package/.output/server/_libs/@aws-crypto/crc32+[...].mjs +419 -0
- package/.output/server/_libs/@aws-sdk/checksums+[...].mjs +10732 -0
- package/.output/server/_libs/@aws-sdk/client-s3+[...].mjs +9475 -0
- package/.output/server/_libs/@aws-sdk/credential-provider-http+[...].mjs +137 -0
- package/.output/server/_libs/@aws-sdk/credential-provider-ini+[...].mjs +440 -0
- package/.output/server/_libs/@aws-sdk/credential-provider-process+[...].mjs +62 -0
- package/.output/server/_libs/@aws-sdk/credential-provider-sso+[...].mjs +818 -0
- package/.output/server/_libs/@aws-sdk/credential-provider-web-identity+[...].mjs +59 -0
- package/.output/server/_libs/@base-ui/react+[...].mjs +11125 -0
- package/.output/server/_libs/@codemirror/autocomplete+[...].mjs +19713 -0
- package/.output/server/_libs/@codemirror/lang-css+[...].mjs +2636 -0
- package/.output/server/_libs/@codemirror/lang-html+[...].mjs +2247 -0
- package/.output/server/_libs/@codemirror/lang-json+[...].mjs +79 -0
- package/.output/server/_libs/@reduxjs/toolkit+[...].mjs +1736 -0
- package/.output/server/_libs/@smithy/credential-provider-imds+[...].mjs +342 -0
- package/.output/server/_libs/@tanstack/react-router+[...].mjs +14300 -0
- package/.output/server/_libs/@uiw/codemirror-extensions-basic-setup+[...].mjs +76 -0
- package/.output/server/_libs/atomic-sleep.mjs +27 -0
- package/.output/server/_libs/aws-crypto__crc32c.mjs +314 -0
- package/.output/server/_libs/aws-sdk__nested-clients.mjs +2671 -0
- package/.output/server/_libs/babel__runtime.mjs +30 -0
- package/.output/server/_libs/clsx.mjs +16 -0
- package/.output/server/_libs/codemirror__commands.mjs +1725 -0
- package/.output/server/_libs/codemirror__lint.mjs +565 -0
- package/.output/server/_libs/codemirror__search.mjs +1138 -0
- package/.output/server/_libs/codemirror__theme-one-dark.mjs +161 -0
- package/.output/server/_libs/colorette.mjs +129 -0
- package/.output/server/_libs/croner.mjs +735 -0
- package/.output/server/_libs/d3-array.mjs +231 -0
- package/.output/server/_libs/d3-color.mjs +330 -0
- package/.output/server/_libs/d3-format.mjs +252 -0
- package/.output/server/_libs/d3-interpolate.mjs +163 -0
- package/.output/server/_libs/d3-path.mjs +77 -0
- package/.output/server/_libs/d3-scale+[...].mjs +1907 -0
- package/.output/server/_libs/d3-shape.mjs +689 -0
- package/.output/server/_libs/dateformat.mjs +341 -0
- package/.output/server/_libs/decimal.js-light.mjs +884 -0
- package/.output/server/_libs/diff.mjs +732 -0
- package/.output/server/_libs/dom-serializer+[...].mjs +708 -0
- package/.output/server/_libs/domhandler.mjs +461 -0
- package/.output/server/_libs/dompurify.mjs +2111 -0
- package/.output/server/_libs/domutils.mjs +868 -0
- package/.output/server/_libs/drizzle-orm+postgres.mjs +7689 -0
- package/.output/server/_libs/electric-sql__pglite.mjs +14674 -0
- package/.output/server/_libs/end-of-stream+once+wrappy.mjs +145 -0
- package/.output/server/_libs/es-toolkit.mjs +1737 -0
- package/.output/server/_libs/eventemitter3.mjs +236 -0
- package/.output/server/_libs/fast-copy.mjs +285 -0
- package/.output/server/_libs/fast-safe-stringify.mjs +172 -0
- package/.output/server/_libs/h3+rou3+srvx.mjs +1201 -0
- package/.output/server/_libs/html-dom-parser+htmlparser2.mjs +1560 -0
- package/.output/server/_libs/html-react-parser+[...].mjs +1360 -0
- package/.output/server/_libs/initdb.wasm +0 -0
- package/.output/server/_libs/marked.mjs +1548 -0
- package/.output/server/_libs/on-exit-leak-free.mjs +80 -0
- package/.output/server/_libs/pglite.data +37667 -8
- package/.output/server/_libs/pglite.wasm +0 -0
- package/.output/server/_libs/pino+[...].mjs +3196 -0
- package/.output/server/_libs/pino-abstract-transport+split2.mjs +194 -0
- package/.output/server/_libs/pino-pretty+[...].mjs +1623 -0
- package/.output/server/_libs/pinojs__redact.mjs +280 -0
- package/.output/server/_libs/react-redux+[...].mjs +205 -0
- package/.output/server/_libs/recharts+victory-vendor.mjs +15875 -0
- package/.output/server/_libs/tanstack__history.mjs +342 -0
- package/.output/server/_libs/ufo.mjs +64 -0
- package/.output/server/_libs/uiw__codemirror-themes.mjs +32 -0
- package/.output/server/_libs/uiw__react-codemirror.mjs +354 -0
- package/.output/server/_runtime.mjs +37 -0
- package/.output/server/_ssr/CodeField-tm4rr6G3.mjs +143 -0
- package/.output/server/_ssr/DashboardView-CC7htv28.mjs +2795 -0
- package/.output/server/_ssr/LoopPlaybook-BXH8mhiX.mjs +2105 -0
- package/.output/server/_ssr/LoopView-DCugEbHx.mjs +1106 -0
- package/.output/server/_ssr/Modal-DpKZHLZK.mjs +49 -0
- package/.output/server/_ssr/SignIn-dTndU6Hw.mjs +67 -0
- package/.output/server/_ssr/actionUi-CZbEixbf.mjs +119 -0
- package/.output/server/_ssr/adapters-BS8XosjF.mjs +130 -0
- package/.output/server/_ssr/artifactFiles-Cagtj7J0.mjs +61 -0
- package/.output/server/_ssr/artifactKind-BW0isV8L.mjs +37 -0
- package/.output/server/_ssr/artifactView-DS4O22wl.mjs +304 -0
- package/.output/server/_ssr/artifacts-DngKyW2u.mjs +2 -0
- package/.output/server/_ssr/auth-DY1DuYZd.mjs +38429 -0
- package/.output/server/_ssr/boot-BbtG0ImW.mjs +9010 -0
- package/.output/server/_ssr/boot-CMHTxQpJ.mjs +2 -0
- package/.output/server/_ssr/bun-sqlite-dialect-BW9W1_Ps-CU1Spd6z.mjs +162 -0
- package/.output/server/_ssr/core-RrmWoKne.mjs +5 -0
- package/.output/server/_ssr/createServerRpc-BD8Xn_0_.mjs +12 -0
- package/.output/server/_ssr/d1-sqlite-dialect-BLC8LXE6-DfG7tB8s.mjs +112 -0
- package/.output/server/_ssr/db-DWAuZq1o.mjs +2 -0
- package/.output/server/_ssr/dist-BIxFFVZg.mjs +342 -0
- package/.output/server/_ssr/empty-plugin-adapters-DKUlnwwl.mjs +5 -0
- package/.output/server/_ssr/factory-Blq0DYfT.mjs +6903 -0
- package/.output/server/_ssr/invite._token-BRCo9LGB.mjs +36 -0
- package/.output/server/_ssr/invite._token-DJxGLILJ.mjs +28 -0
- package/.output/server/_ssr/invite._token-NewFt27g.mjs +92 -0
- package/.output/server/_ssr/kysely-adapter-D3XTe64J.mjs +2 -0
- package/.output/server/_ssr/kysely-migration-tables-JkVUjPF_-bPAX9LR_.mjs +19 -0
- package/.output/server/_ssr/lifecycleUi-C9lg1r3r.mjs +38 -0
- package/.output/server/_ssr/logger-Dw82jNjH.mjs +2 -0
- package/.output/server/_ssr/loopApi-BtfkZQYK.mjs +532 -0
- package/.output/server/_ssr/loopApi-Cxe8WyOB.mjs +105 -0
- package/.output/server/_ssr/loops._loopId-7NQJPB9W.mjs +30 -0
- package/.output/server/_ssr/loops._loopId-DhnArGdL.mjs +1635 -0
- package/.output/server/_ssr/loops._loopId_.runs._runId-Bvuo2nki.mjs +29 -0
- package/.output/server/_ssr/loops._loopId_.runs._runId-Dip5Xk-q.mjs +674 -0
- package/.output/server/_ssr/machineFns-Dvr5ICUy.mjs +266 -0
- package/.output/server/_ssr/node-sqlite-dialect-DhyOpJTX.mjs +162 -0
- package/.output/server/_ssr/notifyFns-BcMRY5kP.mjs +118 -0
- package/.output/server/_ssr/notifyFns-Q458pZmE.mjs +580 -0
- package/.output/server/_ssr/router-J8KZ30xw.mjs +678 -0
- package/.output/server/_ssr/routes-Bcs4T1ox.mjs +28 -0
- package/.output/server/_ssr/routes-BoGrcf-b.mjs +43 -0
- package/.output/server/_ssr/routes-D4am3Zff.mjs +28 -0
- package/.output/server/_ssr/runDiff-CpEFqo7G.mjs +113 -0
- package/.output/server/_ssr/ssr.mjs +5837 -0
- package/.output/server/_ssr/start-4ifArtKx.mjs +4 -0
- package/.output/server/_ssr/store-b3JcQ08F.mjs +2 -0
- package/.output/server/_ssr/t._teamId-CeUhzgzT.mjs +32 -0
- package/.output/server/_ssr/t._teamId-DR-hQK7o.mjs +47 -0
- package/.output/server/_ssr/t._teamId-Dy_McbRt.mjs +31 -0
- package/.output/server/_ssr/teamCookie-B7hLOIie.mjs +10 -0
- package/.output/server/_ssr/teamFns-BIDnsg2A.mjs +473 -0
- package/.output/server/_ssr/teamFns-DA4ovI5g.mjs +33 -0
- package/.output/server/_ssr/tokens-ytd60FUt.mjs +2 -0
- package/.output/server/_ssr/ui-Dej2qjuS.mjs +267 -0
- package/.output/server/_tanstack-start-manifest_v-CVS6c7re.mjs +95 -0
- package/.output/server/drizzle/0000_round_marauders.sql +193 -0
- package/.output/server/drizzle/0001_naive_silver_fox.sql +25 -0
- package/.output/server/drizzle/0002_funny_sage.sql +12 -0
- package/.output/server/drizzle/0003_optimal_slapstick.sql +102 -0
- package/.output/server/drizzle/0004_remove_grok_agent.sql +5 -0
- package/.output/server/drizzle/0005_heavy_gauntlet.sql +8 -0
- package/.output/server/drizzle/0006_tranquil_sharon_carter.sql +1 -0
- package/.output/server/drizzle/0007_faulty_starbolt.sql +30 -0
- package/.output/server/drizzle/0008_durable_lifecycle_evidence.sql +15 -0
- package/.output/server/drizzle/meta/0000_snapshot.json +1333 -0
- package/.output/server/drizzle/meta/0001_snapshot.json +1498 -0
- package/.output/server/drizzle/meta/0002_snapshot.json +1576 -0
- package/.output/server/drizzle/meta/0003_snapshot.json +1666 -0
- package/.output/server/drizzle/meta/0005_snapshot.json +1666 -0
- package/.output/server/drizzle/meta/0006_snapshot.json +1672 -0
- package/.output/server/drizzle/meta/0007_snapshot.json +1787 -0
- package/.output/server/drizzle/meta/_journal.json +69 -0
- package/.output/server/index.mjs +464 -0
- package/.output/server/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/tslib/tslib.js +484 -0
- package/.output/server/package.json +9 -0
- package/LICENSE +21 -0
- package/drizzle/0000_round_marauders.sql +193 -0
- package/drizzle/0001_naive_silver_fox.sql +25 -0
- package/drizzle/0002_funny_sage.sql +12 -0
- package/drizzle/0003_optimal_slapstick.sql +102 -0
- package/drizzle/0004_remove_grok_agent.sql +5 -0
- package/drizzle/0005_heavy_gauntlet.sql +8 -0
- package/drizzle/0006_tranquil_sharon_carter.sql +1 -0
- package/drizzle/0007_faulty_starbolt.sql +30 -0
- package/drizzle/0008_durable_lifecycle_evidence.sql +15 -0
- package/drizzle/meta/0000_snapshot.json +1333 -0
- package/drizzle/meta/0001_snapshot.json +1498 -0
- package/drizzle/meta/0002_snapshot.json +1576 -0
- package/drizzle/meta/0003_snapshot.json +1666 -0
- package/drizzle/meta/0005_snapshot.json +1666 -0
- package/drizzle/meta/0006_snapshot.json +1672 -0
- package/drizzle/meta/0007_snapshot.json +1787 -0
- package/drizzle/meta/_journal.json +69 -0
- package/package.json +84 -0
- package/scripts/pievo-server.mjs +390 -0
- package/scripts/prestart.mjs +66 -0
- package/scripts/server-cli-lib.mjs +451 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { C as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
|
|
2
|
+
import { f as useRouter } from "../_libs/@tanstack/react-router+[...].mjs";
|
|
3
|
+
import { r as LoadErrorCard } from "./actionUi-CZbEixbf.mjs";
|
|
4
|
+
//#region node_modules/.nitro/vite/services/ssr/assets/routes-Bcs4T1ox.js
|
|
5
|
+
var import_jsx_runtime = require_jsx_runtime();
|
|
6
|
+
/**
|
|
7
|
+
* The home route. Under the auth gate it is now a THIN redirect to the explicit
|
|
8
|
+
* team URL (`/t/<lastUsed|personal>`) so the dashboard's team lives in the path
|
|
9
|
+
* (bookmarkable, multi-tab). `/` keeps working forever: a signed-out visitor gets
|
|
10
|
+
* the sign-in CTA; open mode (no gate ⇒ a single shared workspace with no team to
|
|
11
|
+
* expose in the URL) renders the dashboard right here, unchanged.
|
|
12
|
+
*/
|
|
13
|
+
/** First-load failure screen — a calm retry instead of the router's default
|
|
14
|
+
* error dump. Only the initial loader can land here; the in-page poll is
|
|
15
|
+
* fetch-then-set and keeps stale data on a transient blip. */
|
|
16
|
+
function LoadError({ error }) {
|
|
17
|
+
const router = useRouter();
|
|
18
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("main", {
|
|
19
|
+
className: "mx-auto max-w-[1180px] px-8 pt-12",
|
|
20
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoadErrorCard, {
|
|
21
|
+
title: "Couldn't load the dashboard.",
|
|
22
|
+
detail: String(error),
|
|
23
|
+
onRetry: () => void router.invalidate()
|
|
24
|
+
})
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { LoadError as errorComponent };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { c as createFileRoute, p as redirect, s as lazyRouteComponent } from "../_libs/@tanstack/react-router+[...].mjs";
|
|
2
|
+
import { d as getDefaultTeam, g as listTemplates, l as getAuthState } from "./loopApi-Cxe8WyOB.mjs";
|
|
3
|
+
import { a as authClient } from "./LoopPlaybook-BXH8mhiX.mjs";
|
|
4
|
+
import { n as fetchLiveData } from "./DashboardView-CC7htv28.mjs";
|
|
5
|
+
//#region node_modules/.nitro/vite/services/ssr/assets/routes-BoGrcf-b.js
|
|
6
|
+
var $$splitErrorComponentImporter = () => import("./routes-Bcs4T1ox.mjs");
|
|
7
|
+
var $$splitComponentImporter = () => import("./routes-D4am3Zff.mjs");
|
|
8
|
+
/**
|
|
9
|
+
* The home route. Under the auth gate it is now a THIN redirect to the explicit
|
|
10
|
+
* team URL (`/t/<lastUsed|personal>`) so the dashboard's team lives in the path
|
|
11
|
+
* (bookmarkable, multi-tab). `/` keeps working forever: a signed-out visitor gets
|
|
12
|
+
* the sign-in CTA; open mode (no gate ⇒ a single shared workspace with no team to
|
|
13
|
+
* expose in the URL) renders the dashboard right here, unchanged.
|
|
14
|
+
*/
|
|
15
|
+
var Route = createFileRoute("/")({
|
|
16
|
+
ssr: false,
|
|
17
|
+
loader: async () => {
|
|
18
|
+
const auth = await getAuthState();
|
|
19
|
+
if (auth.enabled) {
|
|
20
|
+
const { data: session } = await authClient.getSession();
|
|
21
|
+
if (!session) return {
|
|
22
|
+
mode: "signin",
|
|
23
|
+
auth
|
|
24
|
+
};
|
|
25
|
+
throw redirect({
|
|
26
|
+
to: "/t/$teamId",
|
|
27
|
+
params: { teamId: await getDefaultTeam() }
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
mode: "dashboard",
|
|
32
|
+
auth,
|
|
33
|
+
initial: {
|
|
34
|
+
...await fetchLiveData(),
|
|
35
|
+
templates: await listTemplates()
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
component: lazyRouteComponent($$splitComponentImporter, "component"),
|
|
40
|
+
errorComponent: lazyRouteComponent($$splitErrorComponentImporter, "errorComponent")
|
|
41
|
+
});
|
|
42
|
+
//#endregion
|
|
43
|
+
export { Route as t };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { C as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
|
|
2
|
+
import { s as useSession } from "./LoopPlaybook-BXH8mhiX.mjs";
|
|
3
|
+
import { t as SignIn } from "./SignIn-dTndU6Hw.mjs";
|
|
4
|
+
import { t as DashboardView } from "./DashboardView-CC7htv28.mjs";
|
|
5
|
+
import { t as Route } from "./routes-BoGrcf-b.mjs";
|
|
6
|
+
//#region node_modules/.nitro/vite/services/ssr/assets/routes-D4am3Zff.js
|
|
7
|
+
var import_jsx_runtime = require_jsx_runtime();
|
|
8
|
+
/**
|
|
9
|
+
* The home route. Under the auth gate it is now a THIN redirect to the explicit
|
|
10
|
+
* team URL (`/t/<lastUsed|personal>`) so the dashboard's team lives in the path
|
|
11
|
+
* (bookmarkable, multi-tab). `/` keeps working forever: a signed-out visitor gets
|
|
12
|
+
* the sign-in CTA; open mode (no gate ⇒ a single shared workspace with no team to
|
|
13
|
+
* expose in the URL) renders the dashboard right here, unchanged.
|
|
14
|
+
*/
|
|
15
|
+
/** First-load failure screen — a calm retry instead of the router's default
|
|
16
|
+
* error dump. Only the initial loader can land here; the in-page poll is
|
|
17
|
+
* fetch-then-set and keeps stale data on a transient blip. */
|
|
18
|
+
/** Open mode renders the dashboard; the gated signed-out case renders SignIn. The
|
|
19
|
+
* gated signed-in case never reaches here (the loader threw a redirect). */
|
|
20
|
+
function Home() {
|
|
21
|
+
const loaded = Route.useLoaderData();
|
|
22
|
+
const { data: session, isPending } = useSession();
|
|
23
|
+
if (loaded?.auth?.enabled && !isPending && !session) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SignIn, {});
|
|
24
|
+
if (loaded?.mode === "signin") return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SignIn, {});
|
|
25
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DashboardView, { initial: loaded.initial });
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { Home as component };
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { Ft as prevRunSnapshot, V as getArtifactSync, et as getRun, tt as getRunSnapshot } from "./boot-BbtG0ImW.mjs";
|
|
2
|
+
import { t as createTwoFilesPatch } from "../_libs/diff.mjs";
|
|
3
|
+
//#region node_modules/.nitro/vite/services/ssr/assets/runDiff-CpEFqo7G.js
|
|
4
|
+
/**
|
|
5
|
+
* Per-run artifact diff (Phase 3). Computed lazily on the SERVER at read time
|
|
6
|
+
* (no stored diffs): load run N's snapshot + the previous run's snapshot and diff
|
|
7
|
+
* the two path → metadata maps. For changed TEXT files we load both blobs and
|
|
8
|
+
* compute a unified line diff with `diff` (jsdiff) — a pure-string library, no
|
|
9
|
+
* process execution, so the server's zero-exec invariant holds. Binary/oversize
|
|
10
|
+
* files emit a size-delta marker only (no inline diff).
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Upper bound for computing an inline unified diff. jsdiff is synchronous and
|
|
14
|
+
* roughly O(N*D); on a multi-MB or minified text file it would block the
|
|
15
|
+
* single-process server (which also owns the scheduler) for seconds. Above this
|
|
16
|
+
* a changed text file degrades to the size-delta marker, like binary/oversize.
|
|
17
|
+
*/
|
|
18
|
+
var MAX_DIFF_BYTES = 512 * 1024;
|
|
19
|
+
/** A file is text-diffable only when it has stored bytes and isn't binary/oversize. */
|
|
20
|
+
function isText(e) {
|
|
21
|
+
return !!e && !e.binary && !e.oversize && !!e.hash;
|
|
22
|
+
}
|
|
23
|
+
/** Within the inline-diff size cap (unknown size ⇒ allowed). */
|
|
24
|
+
function withinDiffCap(e) {
|
|
25
|
+
return !!e && (e.size == null || e.size <= MAX_DIFF_BYTES);
|
|
26
|
+
}
|
|
27
|
+
/** Decode a snapshot entry's blob to text, or null when bytes are absent. */
|
|
28
|
+
async function textOf(e) {
|
|
29
|
+
if (!e || !e.hash) return null;
|
|
30
|
+
const bytes = await (await getArtifactSync()).readBlob(e.hash);
|
|
31
|
+
return bytes ? bytes.toString("utf8") : null;
|
|
32
|
+
}
|
|
33
|
+
/** Unified diff between two versions of a path (empty string ⇒ added/removed side). */
|
|
34
|
+
function unified(path, oldText, newText) {
|
|
35
|
+
return createTwoFilesPatch(path, path, oldText, newText, "previous run", "this run");
|
|
36
|
+
}
|
|
37
|
+
async function computeRunDiff(runId) {
|
|
38
|
+
const run = await getRun(runId);
|
|
39
|
+
if (!run) return {
|
|
40
|
+
hasSnapshot: false,
|
|
41
|
+
files: []
|
|
42
|
+
};
|
|
43
|
+
const snap = await getRunSnapshot(runId);
|
|
44
|
+
if (!snap) return {
|
|
45
|
+
hasSnapshot: false,
|
|
46
|
+
files: []
|
|
47
|
+
};
|
|
48
|
+
const curr = snap.manifest ?? {};
|
|
49
|
+
const prev = (await prevRunSnapshot(run.loopId, run.ts))?.manifest ?? {};
|
|
50
|
+
const paths = [...new Set([...Object.keys(curr), ...Object.keys(prev)])].sort();
|
|
51
|
+
const files = [];
|
|
52
|
+
for (const path of paths) {
|
|
53
|
+
const c = curr[path];
|
|
54
|
+
const p = prev[path];
|
|
55
|
+
if (c && !p) {
|
|
56
|
+
const text = isText(c);
|
|
57
|
+
const tooLarge = text && !withinDiffCap(c);
|
|
58
|
+
const file = {
|
|
59
|
+
path,
|
|
60
|
+
status: "added",
|
|
61
|
+
binary: !text,
|
|
62
|
+
tooLarge,
|
|
63
|
+
sizeDelta: c.size ?? null
|
|
64
|
+
};
|
|
65
|
+
if (text && !tooLarge) {
|
|
66
|
+
const body = await textOf(c);
|
|
67
|
+
if (body != null) file.diff = unified(path, "", body);
|
|
68
|
+
else file.binary = true;
|
|
69
|
+
}
|
|
70
|
+
files.push(file);
|
|
71
|
+
} else if (!c && p) {
|
|
72
|
+
const text = isText(p);
|
|
73
|
+
const tooLarge = text && !withinDiffCap(p);
|
|
74
|
+
const file = {
|
|
75
|
+
path,
|
|
76
|
+
status: "removed",
|
|
77
|
+
binary: !text,
|
|
78
|
+
tooLarge,
|
|
79
|
+
sizeDelta: p.size != null ? -p.size : null
|
|
80
|
+
};
|
|
81
|
+
if (text && !tooLarge) {
|
|
82
|
+
const body = await textOf(p);
|
|
83
|
+
if (body != null) file.diff = unified(path, body, "");
|
|
84
|
+
else file.binary = true;
|
|
85
|
+
}
|
|
86
|
+
files.push(file);
|
|
87
|
+
} else if (c && p) {
|
|
88
|
+
if (c.hash === p.hash && c.oversize === p.oversize && c.size === p.size) continue;
|
|
89
|
+
const sizeDelta = c.size != null && p.size != null ? c.size - p.size : null;
|
|
90
|
+
const bothText = isText(c) && isText(p);
|
|
91
|
+
const tooLarge = bothText && !(withinDiffCap(c) && withinDiffCap(p));
|
|
92
|
+
const file = {
|
|
93
|
+
path,
|
|
94
|
+
status: "modified",
|
|
95
|
+
binary: !bothText,
|
|
96
|
+
tooLarge,
|
|
97
|
+
sizeDelta
|
|
98
|
+
};
|
|
99
|
+
if (bothText && !tooLarge) {
|
|
100
|
+
const [oldText, newText] = await Promise.all([textOf(p), textOf(c)]);
|
|
101
|
+
if (oldText != null && newText != null) file.diff = unified(path, oldText, newText);
|
|
102
|
+
else file.binary = true;
|
|
103
|
+
}
|
|
104
|
+
files.push(file);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
hasSnapshot: true,
|
|
109
|
+
files
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//#endregion
|
|
113
|
+
export { computeRunDiff };
|