archal 0.9.18 → 0.9.19
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/clone-assets/apify/tools.json +30 -64
- package/clone-assets/github/tools.json +6 -0
- package/clone-assets/supabase/tools.json +74 -14
- package/dist/cli.cjs +39277 -26395
- package/dist/index.cjs +1 -1
- package/dist/seed/dynamic-generator.cjs +256 -133
- package/dist/vitest/{chunk-IVXSSEYS.js → chunk-L36NXAU6.js} +165 -100
- package/dist/vitest/{chunk-CTSN67QR.js → chunk-WZ7SA4CK.js} +298 -117
- package/dist/vitest/index.cjs +509 -269
- package/dist/vitest/index.js +2 -2
- package/dist/vitest/runtime/hosted-session-reaper.cjs +293 -112
- package/dist/vitest/runtime/hosted-session-reaper.js +1 -1
- package/dist/vitest/runtime/setup-files.js +2 -2
- package/package.json +9 -9
- package/skills/attach/SKILL.md +402 -0
- package/skills/onboard/SKILL.md +12 -0
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
requestedSeedsMatchSession,
|
|
22
22
|
sleep,
|
|
23
23
|
trimEnv
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-WZ7SA4CK.js";
|
|
25
25
|
|
|
26
26
|
// ../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/compile/codegen/code.js
|
|
27
27
|
var require_code = __commonJS({
|
|
@@ -2974,7 +2974,7 @@ var require_compile = __commonJS({
|
|
|
2974
2974
|
const schOrFunc = root.refs[ref];
|
|
2975
2975
|
if (schOrFunc)
|
|
2976
2976
|
return schOrFunc;
|
|
2977
|
-
let _sch =
|
|
2977
|
+
let _sch = resolve8.call(this, root, ref);
|
|
2978
2978
|
if (_sch === void 0) {
|
|
2979
2979
|
const schema = (_a2 = root.localRefs) === null || _a2 === void 0 ? void 0 : _a2[ref];
|
|
2980
2980
|
const { schemaId } = this.opts;
|
|
@@ -3001,7 +3001,7 @@ var require_compile = __commonJS({
|
|
|
3001
3001
|
function sameSchemaEnv(s1, s2) {
|
|
3002
3002
|
return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId;
|
|
3003
3003
|
}
|
|
3004
|
-
function
|
|
3004
|
+
function resolve8(root, ref) {
|
|
3005
3005
|
let sch;
|
|
3006
3006
|
while (typeof (sch = this.refs[ref]) == "string")
|
|
3007
3007
|
ref = sch;
|
|
@@ -3576,55 +3576,55 @@ var require_fast_uri = __commonJS({
|
|
|
3576
3576
|
}
|
|
3577
3577
|
return uri;
|
|
3578
3578
|
}
|
|
3579
|
-
function
|
|
3579
|
+
function resolve8(baseURI, relativeURI, options) {
|
|
3580
3580
|
const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
|
|
3581
3581
|
const resolved = resolveComponent(parse3(baseURI, schemelessOptions), parse3(relativeURI, schemelessOptions), schemelessOptions, true);
|
|
3582
3582
|
schemelessOptions.skipEscape = true;
|
|
3583
3583
|
return serialize(resolved, schemelessOptions);
|
|
3584
3584
|
}
|
|
3585
|
-
function resolveComponent(base,
|
|
3585
|
+
function resolveComponent(base, relative3, options, skipNormalization) {
|
|
3586
3586
|
const target = {};
|
|
3587
3587
|
if (!skipNormalization) {
|
|
3588
3588
|
base = parse3(serialize(base, options), options);
|
|
3589
|
-
|
|
3589
|
+
relative3 = parse3(serialize(relative3, options), options);
|
|
3590
3590
|
}
|
|
3591
3591
|
options = options || {};
|
|
3592
|
-
if (!options.tolerant &&
|
|
3593
|
-
target.scheme =
|
|
3594
|
-
target.userinfo =
|
|
3595
|
-
target.host =
|
|
3596
|
-
target.port =
|
|
3597
|
-
target.path = removeDotSegments(
|
|
3598
|
-
target.query =
|
|
3592
|
+
if (!options.tolerant && relative3.scheme) {
|
|
3593
|
+
target.scheme = relative3.scheme;
|
|
3594
|
+
target.userinfo = relative3.userinfo;
|
|
3595
|
+
target.host = relative3.host;
|
|
3596
|
+
target.port = relative3.port;
|
|
3597
|
+
target.path = removeDotSegments(relative3.path || "");
|
|
3598
|
+
target.query = relative3.query;
|
|
3599
3599
|
} else {
|
|
3600
|
-
if (
|
|
3601
|
-
target.userinfo =
|
|
3602
|
-
target.host =
|
|
3603
|
-
target.port =
|
|
3604
|
-
target.path = removeDotSegments(
|
|
3605
|
-
target.query =
|
|
3600
|
+
if (relative3.userinfo !== void 0 || relative3.host !== void 0 || relative3.port !== void 0) {
|
|
3601
|
+
target.userinfo = relative3.userinfo;
|
|
3602
|
+
target.host = relative3.host;
|
|
3603
|
+
target.port = relative3.port;
|
|
3604
|
+
target.path = removeDotSegments(relative3.path || "");
|
|
3605
|
+
target.query = relative3.query;
|
|
3606
3606
|
} else {
|
|
3607
|
-
if (!
|
|
3607
|
+
if (!relative3.path) {
|
|
3608
3608
|
target.path = base.path;
|
|
3609
|
-
if (
|
|
3610
|
-
target.query =
|
|
3609
|
+
if (relative3.query !== void 0) {
|
|
3610
|
+
target.query = relative3.query;
|
|
3611
3611
|
} else {
|
|
3612
3612
|
target.query = base.query;
|
|
3613
3613
|
}
|
|
3614
3614
|
} else {
|
|
3615
|
-
if (
|
|
3616
|
-
target.path = removeDotSegments(
|
|
3615
|
+
if (relative3.path[0] === "/") {
|
|
3616
|
+
target.path = removeDotSegments(relative3.path);
|
|
3617
3617
|
} else {
|
|
3618
3618
|
if ((base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0) && !base.path) {
|
|
3619
|
-
target.path = "/" +
|
|
3619
|
+
target.path = "/" + relative3.path;
|
|
3620
3620
|
} else if (!base.path) {
|
|
3621
|
-
target.path =
|
|
3621
|
+
target.path = relative3.path;
|
|
3622
3622
|
} else {
|
|
3623
|
-
target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) +
|
|
3623
|
+
target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative3.path;
|
|
3624
3624
|
}
|
|
3625
3625
|
target.path = removeDotSegments(target.path);
|
|
3626
3626
|
}
|
|
3627
|
-
target.query =
|
|
3627
|
+
target.query = relative3.query;
|
|
3628
3628
|
}
|
|
3629
3629
|
target.userinfo = base.userinfo;
|
|
3630
3630
|
target.host = base.host;
|
|
@@ -3632,7 +3632,7 @@ var require_fast_uri = __commonJS({
|
|
|
3632
3632
|
}
|
|
3633
3633
|
target.scheme = base.scheme;
|
|
3634
3634
|
}
|
|
3635
|
-
target.fragment =
|
|
3635
|
+
target.fragment = relative3.fragment;
|
|
3636
3636
|
return target;
|
|
3637
3637
|
}
|
|
3638
3638
|
function equal(uriA, uriB, options) {
|
|
@@ -3803,7 +3803,7 @@ var require_fast_uri = __commonJS({
|
|
|
3803
3803
|
var fastUri = {
|
|
3804
3804
|
SCHEMES,
|
|
3805
3805
|
normalize,
|
|
3806
|
-
resolve:
|
|
3806
|
+
resolve: resolve8,
|
|
3807
3807
|
resolveComponent,
|
|
3808
3808
|
equal,
|
|
3809
3809
|
serialize,
|
|
@@ -7280,6 +7280,7 @@ var slackRouteManifest = {
|
|
|
7280
7280
|
exactDomain("slack.com"),
|
|
7281
7281
|
exactDomain("api.slack.com")
|
|
7282
7282
|
],
|
|
7283
|
+
upstreamBasePath: "/api",
|
|
7283
7284
|
// Block adjacent Slack-owned domains that tests don't need and that can be
|
|
7284
7285
|
// abused as data-exfiltration channels. hooks.slack.com and files.slack.com
|
|
7285
7286
|
// in particular are ideal POST targets for a malicious dependency trying to
|
|
@@ -8211,7 +8212,7 @@ var ROUTE_RUNTIME_DISPATCHING_ROUTE_KINDS = new Set(ROUTE_RUNTIME_PUBLIC_ROUTE_K
|
|
|
8211
8212
|
var stripeCompatibilityProfile = buildServiceCompatibilityProfile(stripeRouteManifest);
|
|
8212
8213
|
|
|
8213
8214
|
// ../route-runtime-core/src/hosted-capabilities.ts
|
|
8214
|
-
import { createHash as
|
|
8215
|
+
import { createHash as createHash6 } from "crypto";
|
|
8215
8216
|
|
|
8216
8217
|
// ../../twins/core/src/control-plane-auth.ts
|
|
8217
8218
|
import { timingSafeEqual } from "crypto";
|
|
@@ -27620,13 +27621,96 @@ import { randomUUID as randomUUID3 } from "crypto";
|
|
|
27620
27621
|
import { performance as performance2 } from "perf_hooks";
|
|
27621
27622
|
|
|
27622
27623
|
// ../../twins/core/src/fixture-oracle.ts
|
|
27623
|
-
import { existsSync as
|
|
27624
|
-
import { dirname as
|
|
27624
|
+
import { existsSync as existsSync4, readdirSync as readdirSync2, readFileSync as readFileSync5 } from "fs";
|
|
27625
|
+
import { dirname as dirname5, resolve as resolve5 } from "path";
|
|
27625
27626
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
27626
27627
|
|
|
27628
|
+
// ../../twins/core/src/legacy-asset-cache.ts
|
|
27629
|
+
import { createHash as createHash4 } from "crypto";
|
|
27630
|
+
import {
|
|
27631
|
+
existsSync as existsSync3,
|
|
27632
|
+
mkdirSync as mkdirSync2,
|
|
27633
|
+
readFileSync as readFileSync4,
|
|
27634
|
+
renameSync as renameSync3,
|
|
27635
|
+
writeFileSync as writeFileSync3
|
|
27636
|
+
} from "fs";
|
|
27637
|
+
import { homedir as homedir2 } from "os";
|
|
27638
|
+
import { dirname as dirname4, relative as relative2, resolve as resolve4 } from "path";
|
|
27639
|
+
|
|
27640
|
+
// ../../twins/core/src/recording-fetcher.ts
|
|
27641
|
+
import { createHash as createHash3 } from "crypto";
|
|
27642
|
+
import {
|
|
27643
|
+
existsSync as existsSync2,
|
|
27644
|
+
mkdirSync,
|
|
27645
|
+
readFileSync as readFileSync3,
|
|
27646
|
+
renameSync as renameSync2,
|
|
27647
|
+
statSync,
|
|
27648
|
+
writeFileSync as writeFileSync2
|
|
27649
|
+
} from "fs";
|
|
27650
|
+
import { homedir } from "os";
|
|
27651
|
+
import { dirname as dirname3, resolve as resolve3 } from "path";
|
|
27652
|
+
var RecordingManifestEntrySchema = external_exports3.object({
|
|
27653
|
+
filename: external_exports3.string(),
|
|
27654
|
+
sha256: external_exports3.string().regex(/^[0-9a-f]{64}$/, "sha256 must be 64 lowercase hex chars"),
|
|
27655
|
+
size: external_exports3.number().optional(),
|
|
27656
|
+
sizeBytes: external_exports3.number().optional(),
|
|
27657
|
+
uploadedAt: external_exports3.string().optional(),
|
|
27658
|
+
// Optional symbolic tags that map fixture-oracle / replay lookups onto this
|
|
27659
|
+
// recording. Lets twins keep tag→file resolution inside the manifest itself
|
|
27660
|
+
// rather than depending on a separate provenance.json (which is excluded
|
|
27661
|
+
// from the in-tree fixture allowlist for graduated twins). Codex P2 on
|
|
27662
|
+
// tavily #3603 — fixture-oracle previously required provenance.json to
|
|
27663
|
+
// resolve `rest-profile:tavily:tavily_search_basic` → filename.
|
|
27664
|
+
tags: external_exports3.array(external_exports3.string()).optional()
|
|
27665
|
+
}).loose();
|
|
27666
|
+
var RecordingManifestSchema = external_exports3.object({
|
|
27667
|
+
service: external_exports3.string().min(1),
|
|
27668
|
+
version: external_exports3.number().int(),
|
|
27669
|
+
container: external_exports3.string().min(1),
|
|
27670
|
+
baseUrl: external_exports3.string().optional(),
|
|
27671
|
+
entries: external_exports3.array(RecordingManifestEntrySchema)
|
|
27672
|
+
}).loose();
|
|
27673
|
+
var DEFAULT_BASE_URL = process.env["ARCHAL_FIXTURE_BASE_URL"] ?? "https://archalforge8f96908966.blob.core.windows.net/archal-fixture-artifacts?sv=2023-11-03&spr=https&se=2031-05-10T00%3A00%3A00Z&sr=c&sp=rl&sig=r3%2FC3EwzilSHls8z3Pn5ZR%2BkinwQw1C6%2BDKObIZSIu0%3D";
|
|
27674
|
+
var DEFAULT_CACHE_ROOT = process.env["ARCHAL_FIXTURE_CACHE_ROOT"] ?? resolve3(homedir(), ".archal", "forge", "recordings-cache");
|
|
27675
|
+
function warnIfSasExpiresSoon(baseUrl) {
|
|
27676
|
+
if (process.env["ARCHAL_FIXTURE_SAS_WARN"] === "0") return;
|
|
27677
|
+
const queryIdx = baseUrl.indexOf("?");
|
|
27678
|
+
if (queryIdx < 0) return;
|
|
27679
|
+
const query = baseUrl.slice(queryIdx + 1);
|
|
27680
|
+
const seParam = query.split("&").find((p) => p.startsWith("se="));
|
|
27681
|
+
if (!seParam) return;
|
|
27682
|
+
const seValue = decodeURIComponent(seParam.slice(3));
|
|
27683
|
+
const expiresAt = Date.parse(seValue);
|
|
27684
|
+
if (Number.isNaN(expiresAt)) return;
|
|
27685
|
+
const now2 = Date.now();
|
|
27686
|
+
const daysRemaining = Math.floor((expiresAt - now2) / (1e3 * 60 * 60 * 24));
|
|
27687
|
+
if (daysRemaining < 365) {
|
|
27688
|
+
console.warn(
|
|
27689
|
+
`[recording-fetcher] SAS token in ARCHAL_FIXTURE_BASE_URL expires in ${daysRemaining}d (${seValue}). Rotate via scripts/rotate-fixture-sas.mjs before expiry.`
|
|
27690
|
+
);
|
|
27691
|
+
}
|
|
27692
|
+
}
|
|
27693
|
+
warnIfSasExpiresSoon(DEFAULT_BASE_URL);
|
|
27694
|
+
|
|
27695
|
+
// ../../twins/core/src/legacy-asset-cache.ts
|
|
27696
|
+
var DEFAULT_CACHE_ROOT2 = process.env["ARCHAL_LEGACY_ASSET_CACHE_ROOT"] ?? resolve4(homedir2(), ".archal", "forge", "legacy-assets-cache");
|
|
27697
|
+
var LegacyAssetEntrySchema = external_exports3.object({
|
|
27698
|
+
relativePath: external_exports3.string().min(1),
|
|
27699
|
+
sha256: external_exports3.string().regex(/^[0-9a-f]{64}$/, "sha256 must be 64 lowercase hex chars"),
|
|
27700
|
+
sizeBytes: external_exports3.number().optional(),
|
|
27701
|
+
uploadedAt: external_exports3.string().optional()
|
|
27702
|
+
}).loose();
|
|
27703
|
+
var LegacyAssetManifestSchema = external_exports3.object({
|
|
27704
|
+
service: external_exports3.string().min(1),
|
|
27705
|
+
version: external_exports3.number().int(),
|
|
27706
|
+
container: external_exports3.string().min(1),
|
|
27707
|
+
layout: external_exports3.string().optional(),
|
|
27708
|
+
entries: external_exports3.array(LegacyAssetEntrySchema)
|
|
27709
|
+
}).loose();
|
|
27710
|
+
|
|
27627
27711
|
// ../../twins/core/src/run-twin-cli.ts
|
|
27628
|
-
import { accessSync, constants, realpathSync, statSync } from "fs";
|
|
27629
|
-
import { resolve as
|
|
27712
|
+
import { accessSync, constants, realpathSync, statSync as statSync2 } from "fs";
|
|
27713
|
+
import { resolve as resolve6 } from "path";
|
|
27630
27714
|
|
|
27631
27715
|
// ../../twins/manifest.json
|
|
27632
27716
|
var manifest_default = [
|
|
@@ -27677,6 +27761,12 @@ var manifest_default = [
|
|
|
27677
27761
|
package: "@archal/twin-firecrawl",
|
|
27678
27762
|
path: "twins/firecrawl",
|
|
27679
27763
|
stage: "internal",
|
|
27764
|
+
display: {
|
|
27765
|
+
icon: "FC",
|
|
27766
|
+
name: "Firecrawl",
|
|
27767
|
+
description: "Scraping, crawling, mapping, search, and extraction.",
|
|
27768
|
+
toolCount: 6
|
|
27769
|
+
},
|
|
27680
27770
|
transport: "rest",
|
|
27681
27771
|
hostedRuntime: { enabled: true, requiresDist: true, requiresEmptySeed: true },
|
|
27682
27772
|
cli: { bundleAssets: false, bundleToolSnapshot: false },
|
|
@@ -27744,6 +27834,12 @@ var manifest_default = [
|
|
|
27744
27834
|
package: "@archal/twin-hubspot",
|
|
27745
27835
|
path: "twins/hubspot",
|
|
27746
27836
|
stage: "internal",
|
|
27837
|
+
display: {
|
|
27838
|
+
icon: "HS",
|
|
27839
|
+
name: "HubSpot",
|
|
27840
|
+
description: "CRM contacts, companies, deals, tickets, and engagements.",
|
|
27841
|
+
toolCount: 45
|
|
27842
|
+
},
|
|
27747
27843
|
transport: "rest",
|
|
27748
27844
|
hostedRuntime: { enabled: true, requiresDist: true, requiresEmptySeed: true },
|
|
27749
27845
|
cli: { bundleAssets: false, bundleToolSnapshot: false },
|
|
@@ -27820,6 +27916,12 @@ var manifest_default = [
|
|
|
27820
27916
|
package: "@archal/twin-sendgrid",
|
|
27821
27917
|
path: "twins/sendgrid",
|
|
27822
27918
|
stage: "internal",
|
|
27919
|
+
display: {
|
|
27920
|
+
icon: "SG",
|
|
27921
|
+
name: "SendGrid",
|
|
27922
|
+
description: "Mail send, contacts, lists, templates, and stats.",
|
|
27923
|
+
toolCount: 28
|
|
27924
|
+
},
|
|
27823
27925
|
transport: "rest",
|
|
27824
27926
|
hostedRuntime: { enabled: true, requiresDist: true, requiresEmptySeed: true },
|
|
27825
27927
|
cli: { bundleAssets: false, bundleToolSnapshot: false },
|
|
@@ -27916,6 +28018,12 @@ var manifest_default = [
|
|
|
27916
28018
|
package: "@archal/twin-telegram",
|
|
27917
28019
|
path: "twins/telegram",
|
|
27918
28020
|
stage: "internal",
|
|
28021
|
+
display: {
|
|
28022
|
+
icon: "TG",
|
|
28023
|
+
name: "Telegram",
|
|
28024
|
+
description: "Bot messages, chats, updates, and webhooks.",
|
|
28025
|
+
toolCount: 32
|
|
28026
|
+
},
|
|
27919
28027
|
transport: "both",
|
|
27920
28028
|
hostedRuntime: { enabled: true, requiresDist: true, requiresEmptySeed: true },
|
|
27921
28029
|
cli: { bundleAssets: false, bundleToolSnapshot: false },
|
|
@@ -27928,6 +28036,12 @@ var manifest_default = [
|
|
|
27928
28036
|
package: "@archal/twin-twilio",
|
|
27929
28037
|
path: "twins/twilio",
|
|
27930
28038
|
stage: "internal",
|
|
28039
|
+
display: {
|
|
28040
|
+
icon: "TW",
|
|
28041
|
+
name: "Twilio",
|
|
28042
|
+
description: "Messages, calls, phone numbers, and verifications.",
|
|
28043
|
+
toolCount: 35
|
|
28044
|
+
},
|
|
27931
28045
|
transport: "rest",
|
|
27932
28046
|
hostedRuntime: { enabled: true, requiresDist: true, requiresEmptySeed: true },
|
|
27933
28047
|
cli: { bundleAssets: false, bundleToolSnapshot: false },
|
|
@@ -27940,6 +28054,12 @@ var manifest_default = [
|
|
|
27940
28054
|
package: "@archal/twin-unipile",
|
|
27941
28055
|
path: "twins/unipile",
|
|
27942
28056
|
stage: "internal",
|
|
28057
|
+
display: {
|
|
28058
|
+
icon: "UP",
|
|
28059
|
+
name: "Unipile",
|
|
28060
|
+
description: "LinkedIn and email messaging, accounts, and chats.",
|
|
28061
|
+
toolCount: 24
|
|
28062
|
+
},
|
|
27943
28063
|
transport: "rest",
|
|
27944
28064
|
hostedRuntime: { enabled: true, requiresDist: true, requiresEmptySeed: true },
|
|
27945
28065
|
cli: { bundleAssets: false, bundleToolSnapshot: false },
|
|
@@ -27958,7 +28078,7 @@ var CLONE_PACKAGES = CLONE_MANIFEST.map((t) => t.package);
|
|
|
27958
28078
|
var TWIN_PREFIX_PATTERN = new RegExp(`^(${CLONE_NAMES.join("|")})_`, "i");
|
|
27959
28079
|
|
|
27960
28080
|
// ../../twins/core/src/session-run-id.ts
|
|
27961
|
-
import { createHash as
|
|
28081
|
+
import { createHash as createHash5 } from "crypto";
|
|
27962
28082
|
|
|
27963
28083
|
// ../../twins/core/src/webhook-signing.ts
|
|
27964
28084
|
import { createHmac, timingSafeEqual as timingSafeEqual2 } from "crypto";
|
|
@@ -28099,61 +28219,6 @@ var SCENARIO_RISK_TAXONOMY = SCENARIO_RISK_RULES.map(
|
|
|
28099
28219
|
({ id, label, description }) => ({ id, label, description })
|
|
28100
28220
|
);
|
|
28101
28221
|
|
|
28102
|
-
// ../../twins/core/src/recording-fetcher.ts
|
|
28103
|
-
import { createHash as createHash4 } from "crypto";
|
|
28104
|
-
import {
|
|
28105
|
-
existsSync as existsSync3,
|
|
28106
|
-
mkdirSync,
|
|
28107
|
-
readFileSync as readFileSync4,
|
|
28108
|
-
renameSync as renameSync2,
|
|
28109
|
-
statSync as statSync2,
|
|
28110
|
-
writeFileSync as writeFileSync2
|
|
28111
|
-
} from "fs";
|
|
28112
|
-
import { homedir } from "os";
|
|
28113
|
-
import { dirname as dirname4, resolve as resolve5 } from "path";
|
|
28114
|
-
var RecordingManifestEntrySchema = external_exports3.object({
|
|
28115
|
-
filename: external_exports3.string(),
|
|
28116
|
-
sha256: external_exports3.string().regex(/^[0-9a-f]{64}$/, "sha256 must be 64 lowercase hex chars"),
|
|
28117
|
-
size: external_exports3.number().optional(),
|
|
28118
|
-
sizeBytes: external_exports3.number().optional(),
|
|
28119
|
-
uploadedAt: external_exports3.string().optional(),
|
|
28120
|
-
// Optional symbolic tags that map fixture-oracle / replay lookups onto this
|
|
28121
|
-
// recording. Lets twins keep tag→file resolution inside the manifest itself
|
|
28122
|
-
// rather than depending on a separate provenance.json (which is excluded
|
|
28123
|
-
// from the in-tree fixture allowlist for graduated twins). Codex P2 on
|
|
28124
|
-
// tavily #3603 — fixture-oracle previously required provenance.json to
|
|
28125
|
-
// resolve `rest-profile:tavily:tavily_search_basic` → filename.
|
|
28126
|
-
tags: external_exports3.array(external_exports3.string()).optional()
|
|
28127
|
-
}).loose();
|
|
28128
|
-
var RecordingManifestSchema = external_exports3.object({
|
|
28129
|
-
service: external_exports3.string().min(1),
|
|
28130
|
-
version: external_exports3.number().int(),
|
|
28131
|
-
container: external_exports3.string().min(1),
|
|
28132
|
-
baseUrl: external_exports3.string().optional(),
|
|
28133
|
-
entries: external_exports3.array(RecordingManifestEntrySchema)
|
|
28134
|
-
}).loose();
|
|
28135
|
-
var DEFAULT_BASE_URL = process.env["ARCHAL_FIXTURE_BASE_URL"] ?? "https://archalforge8f96908966.blob.core.windows.net/archal-fixture-artifacts?sv=2023-11-03&spr=https&se=2031-05-10T00%3A00%3A00Z&sr=c&sp=rl&sig=r3%2FC3EwzilSHls8z3Pn5ZR%2BkinwQw1C6%2BDKObIZSIu0%3D";
|
|
28136
|
-
var DEFAULT_CACHE_ROOT = process.env["ARCHAL_FIXTURE_CACHE_ROOT"] ?? resolve5(homedir(), ".archal", "forge", "recordings-cache");
|
|
28137
|
-
function warnIfSasExpiresSoon(baseUrl) {
|
|
28138
|
-
if (process.env["ARCHAL_FIXTURE_SAS_WARN"] === "0") return;
|
|
28139
|
-
const queryIdx = baseUrl.indexOf("?");
|
|
28140
|
-
if (queryIdx < 0) return;
|
|
28141
|
-
const query = baseUrl.slice(queryIdx + 1);
|
|
28142
|
-
const seParam = query.split("&").find((p) => p.startsWith("se="));
|
|
28143
|
-
if (!seParam) return;
|
|
28144
|
-
const seValue = decodeURIComponent(seParam.slice(3));
|
|
28145
|
-
const expiresAt = Date.parse(seValue);
|
|
28146
|
-
if (Number.isNaN(expiresAt)) return;
|
|
28147
|
-
const now2 = Date.now();
|
|
28148
|
-
const daysRemaining = Math.floor((expiresAt - now2) / (1e3 * 60 * 60 * 24));
|
|
28149
|
-
if (daysRemaining < 365) {
|
|
28150
|
-
console.warn(
|
|
28151
|
-
`[recording-fetcher] SAS token in ARCHAL_FIXTURE_BASE_URL expires in ${daysRemaining}d (${seValue}). Rotate via scripts/rotate-fixture-sas.mjs before expiry.`
|
|
28152
|
-
);
|
|
28153
|
-
}
|
|
28154
|
-
}
|
|
28155
|
-
warnIfSasExpiresSoon(DEFAULT_BASE_URL);
|
|
28156
|
-
|
|
28157
28222
|
// src/runtime/service-profiles.ts
|
|
28158
28223
|
function unsupportedServiceMessage(unsupportedServices) {
|
|
28159
28224
|
const supportedServices = listSharedRouteManifests().map((manifest) => manifest.service).sort();
|
|
@@ -28183,10 +28248,10 @@ function resolveArchalVitestServiceProfiles(services) {
|
|
|
28183
28248
|
}
|
|
28184
28249
|
|
|
28185
28250
|
// src/runtime/hosted-session-provider.ts
|
|
28186
|
-
import { createHash as
|
|
28251
|
+
import { createHash as createHash7, randomUUID as randomUUID4 } from "crypto";
|
|
28187
28252
|
import { spawn } from "child_process";
|
|
28188
28253
|
import { promises as fs } from "fs";
|
|
28189
|
-
import { join, resolve as
|
|
28254
|
+
import { join, resolve as resolve7 } from "path";
|
|
28190
28255
|
import { tmpdir } from "os";
|
|
28191
28256
|
|
|
28192
28257
|
// src/url-resolution.ts
|
|
@@ -28236,15 +28301,15 @@ function toSafeCoordinatorDirectoryName(sessionKey) {
|
|
|
28236
28301
|
return sessionKey;
|
|
28237
28302
|
}
|
|
28238
28303
|
const slug = sessionKey.replace(/[^a-zA-Z0-9._-]+/g, "-").replace(/^[.-]+|[.-]+$/g, "").slice(0, 48);
|
|
28239
|
-
const hash2 =
|
|
28304
|
+
const hash2 = createHash7("sha256").update(sessionKey).digest("hex").slice(0, 12);
|
|
28240
28305
|
return `${slug || "session"}-${hash2}`;
|
|
28241
28306
|
}
|
|
28242
28307
|
function resolveCoordinatorPaths(config2) {
|
|
28243
|
-
const baseDirectory =
|
|
28308
|
+
const baseDirectory = resolve7(
|
|
28244
28309
|
trimEnv("ARCHAL_VITEST_COORDINATOR_DIR") ?? join(tmpdir(), "archal-vitest")
|
|
28245
28310
|
);
|
|
28246
28311
|
const sessionKey = config2.sessionKey ?? `${config2.projectName}-${randomUUID4()}`;
|
|
28247
|
-
const directory =
|
|
28312
|
+
const directory = resolve7(baseDirectory, toSafeCoordinatorDirectoryName(sessionKey));
|
|
28248
28313
|
return {
|
|
28249
28314
|
directory,
|
|
28250
28315
|
lockDirectory: join(directory, "lock"),
|
|
@@ -29170,11 +29235,11 @@ async function buildRuntimeConfig(scope) {
|
|
|
29170
29235
|
};
|
|
29171
29236
|
scope[GLOBAL_SESSION_KEY] = redactSessionSnapshot(session);
|
|
29172
29237
|
try {
|
|
29173
|
-
const { writeFileSync:
|
|
29174
|
-
const { dirname:
|
|
29238
|
+
const { writeFileSync: writeFileSync4, mkdirSync: mkdirSync3 } = await import("fs");
|
|
29239
|
+
const { dirname: dirname6 } = await import("path");
|
|
29175
29240
|
const sessionIdPath = getSessionIdFilePath(config2.sessionKey);
|
|
29176
|
-
|
|
29177
|
-
|
|
29241
|
+
mkdirSync3(dirname6(sessionIdPath), { recursive: true });
|
|
29242
|
+
writeFileSync4(sessionIdPath, session.sessionId, "utf-8");
|
|
29178
29243
|
} catch {
|
|
29179
29244
|
}
|
|
29180
29245
|
return {
|