@struktoai/mirage-browser 0.0.3 → 0.0.5-alpha.1
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/README.md +2 -1
- package/dist/aliyun-DR6KT3H6.js +8 -0
- package/dist/backblaze-XCLZXTES.js +8 -0
- package/dist/box-XBCSU3AA.js +8 -0
- package/dist/ceph-F5S2NMTO.js +8 -0
- package/dist/{chunk-HYUESAQS.js → chunk-2J35WXX5.js} +7 -3
- package/dist/chunk-2J35WXX5.js.map +1 -0
- package/dist/{chunk-CGZGX2GO.js → chunk-2WNXK742.js} +10 -12
- package/dist/chunk-2WNXK742.js.map +1 -0
- package/dist/{chunk-X2CCEHOR.js → chunk-2WSKXBSV.js} +22 -12
- package/dist/chunk-2WSKXBSV.js.map +1 -0
- package/dist/{chunk-SOF74I3T.js → chunk-37WKCB2E.js} +7 -5
- package/dist/chunk-37WKCB2E.js.map +1 -0
- package/dist/{chunk-ROHDW6KT.js → chunk-3IYCVC7W.js} +11 -5
- package/dist/chunk-3IYCVC7W.js.map +1 -0
- package/dist/{chunk-LSURHXZH.js → chunk-46HNNKFR.js} +11 -5
- package/dist/chunk-46HNNKFR.js.map +1 -0
- package/dist/chunk-4IF4TGAI.js +11 -0
- package/dist/chunk-4IF4TGAI.js.map +1 -0
- package/dist/{chunk-DA5EW34P.js → chunk-5OZJMTYW.js} +17 -13
- package/dist/chunk-5OZJMTYW.js.map +1 -0
- package/dist/{chunk-PV53AX35.js → chunk-5UM6EBVW.js} +18 -12
- package/dist/chunk-5UM6EBVW.js.map +1 -0
- package/dist/{chunk-NWZNQ3RC.js → chunk-6HRSCX2U.js} +11 -5
- package/dist/chunk-6HRSCX2U.js.map +1 -0
- package/dist/{chunk-F5QWZ7GM.js → chunk-7HWQAYXR.js} +11 -5
- package/dist/chunk-7HWQAYXR.js.map +1 -0
- package/dist/{chunk-OSMEXGRN.js → chunk-AUZNQ7EI.js} +13 -20
- package/dist/chunk-AUZNQ7EI.js.map +1 -0
- package/dist/{chunk-RQ273N5K.js → chunk-BGA2F226.js} +26 -21
- package/dist/chunk-BGA2F226.js.map +1 -0
- package/dist/{chunk-HXQ7HDA6.js → chunk-BV372CUO.js} +18 -20
- package/dist/chunk-BV372CUO.js.map +1 -0
- package/dist/{chunk-57QQAM7V.js → chunk-C4THTILY.js} +11 -5
- package/dist/chunk-C4THTILY.js.map +1 -0
- package/dist/{chunk-DVXOMWD4.js → chunk-D4MEOKNQ.js} +11 -5
- package/dist/chunk-D4MEOKNQ.js.map +1 -0
- package/dist/chunk-D4RAMWYH.js +88 -0
- package/dist/chunk-D4RAMWYH.js.map +1 -0
- package/dist/{chunk-NLBT6TBM.js → chunk-EHIT6WCY.js} +11 -5
- package/dist/chunk-EHIT6WCY.js.map +1 -0
- package/dist/{chunk-CNDGXKMU.js → chunk-EN6TZYT2.js} +11 -5
- package/dist/chunk-EN6TZYT2.js.map +1 -0
- package/dist/{chunk-QLLRQNOJ.js → chunk-FTDVV7EQ.js} +11 -5
- package/dist/chunk-FTDVV7EQ.js.map +1 -0
- package/dist/{chunk-G26SGOFR.js → chunk-G67Q2Z6I.js} +11 -5
- package/dist/chunk-G67Q2Z6I.js.map +1 -0
- package/dist/{chunk-XBOJZZRT.js → chunk-GM2QMJAY.js} +13 -20
- package/dist/chunk-GM2QMJAY.js.map +1 -0
- package/dist/{chunk-XYKNXGPR.js → chunk-HRWLHJX2.js} +14 -20
- package/dist/chunk-HRWLHJX2.js.map +1 -0
- package/dist/{chunk-DHZMC42C.js → chunk-INEXV2PN.js} +11 -5
- package/dist/chunk-INEXV2PN.js.map +1 -0
- package/dist/chunk-IZMKMD3O.js +11 -0
- package/dist/chunk-IZMKMD3O.js.map +1 -0
- package/dist/{chunk-4NLXLDMV.js → chunk-JUVMJ5GI.js} +13 -20
- package/dist/chunk-JUVMJ5GI.js.map +1 -0
- package/dist/{chunk-BIIG7ZAQ.js → chunk-KL2VFYUV.js} +7 -5
- package/dist/chunk-KL2VFYUV.js.map +1 -0
- package/dist/{chunk-J54OBIJA.js → chunk-L64GRKOD.js} +12 -3
- package/dist/chunk-L64GRKOD.js.map +1 -0
- package/dist/{chunk-54NTYJEO.js → chunk-LPDLPRPS.js} +1 -3
- package/dist/{chunk-54NTYJEO.js.map → chunk-LPDLPRPS.js.map} +1 -1
- package/dist/chunk-M2UF2JHJ.js +11 -0
- package/dist/chunk-M2UF2JHJ.js.map +1 -0
- package/dist/{chunk-KNJKYCTA.js → chunk-NVHPJ5CV.js} +19 -12
- package/dist/chunk-NVHPJ5CV.js.map +1 -0
- package/dist/{chunk-O5ONB7QT.js → chunk-OSTDTTWI.js} +14 -5
- package/dist/chunk-OSTDTTWI.js.map +1 -0
- package/dist/{chunk-J7PLA5S3.js → chunk-PQCRGTSA.js} +11 -5
- package/dist/chunk-PQCRGTSA.js.map +1 -0
- package/dist/{chunk-BJHHL4UT.js → chunk-QE7QNA45.js} +14 -11
- package/dist/chunk-QE7QNA45.js.map +1 -0
- package/dist/{chunk-K2S42IR4.js → chunk-QG2NUNCY.js} +11 -5
- package/dist/chunk-QG2NUNCY.js.map +1 -0
- package/dist/chunk-UFHBDBZD.js +1212 -0
- package/dist/chunk-UFHBDBZD.js.map +1 -0
- package/dist/{chunk-KTE5PB2D.js → chunk-UY22T4AC.js} +22 -14
- package/dist/chunk-UY22T4AC.js.map +1 -0
- package/dist/chunk-XJBC3OYX.js +11 -0
- package/dist/chunk-XJBC3OYX.js.map +1 -0
- package/dist/{chunk-6YP3B7UK.js → chunk-Y6DYUK6J.js} +11 -5
- package/dist/chunk-Y6DYUK6J.js.map +1 -0
- package/dist/{chunk-DFHFILVF.js → chunk-YOCTIHQZ.js} +14 -12
- package/dist/chunk-YOCTIHQZ.js.map +1 -0
- package/dist/{chunk-TQ6VRUEI.js → chunk-ZDJPUXYH.js} +14 -12
- package/dist/chunk-ZDJPUXYH.js.map +1 -0
- package/dist/{chunk-2AEAISO2.js → chunk-ZKCOSE3R.js} +18 -18
- package/dist/chunk-ZKCOSE3R.js.map +1 -0
- package/dist/chunk-ZTHVEXIV.js +11 -0
- package/dist/chunk-ZTHVEXIV.js.map +1 -0
- package/dist/{config-ET26F632.js → config-2Y6LZKLV.js} +2 -4
- package/dist/config-4GSOMUMF.js +9 -0
- package/dist/config-5YBUWFUP.js +9 -0
- package/dist/config-DE5OZ4I7.js +9 -0
- package/dist/config-ELDOFRJW.js +9 -0
- package/dist/config-FPM3LAW7.js +9 -0
- package/dist/config-JY557MA6.js +9 -0
- package/dist/{config-NV5WXP64.js → config-UU27ALAA.js} +2 -4
- package/dist/config-WRACCRPN.js +9 -0
- package/dist/digitalocean-QDHTRS2W.js +8 -0
- package/dist/discord-ERUI7OAQ.js +7 -0
- package/dist/dropbox-3U6D4HLE.js +8 -0
- package/dist/gcal-MTBSDG34.js +8 -0
- package/dist/gcs-KNGRBBET.js +8 -0
- package/dist/gdocs-RUIOIRKP.js +8 -0
- package/dist/gdrive-5JB7ZKEP.js +8 -0
- package/dist/github-CIXBFBVO.js +7 -0
- package/dist/github_ci-HR6YOYAO.js +8 -0
- package/dist/gmail-JHGWTQU5.js +8 -0
- package/dist/gsheets-N54JO2RS.js +8 -0
- package/dist/gslides-B4VMNLMB.js +8 -0
- package/dist/index.d.ts +292 -348
- package/dist/index.js +171 -110
- package/dist/index.js.map +1 -1
- package/dist/langfuse-HEUJGDOC.js +7 -0
- package/dist/linear-J4QQ3CA6.js +7 -0
- package/dist/minio-BXWHJ6K5.js +8 -0
- package/dist/mongodb-YZP643ZU.js +7 -0
- package/dist/notion-I5S5SRLO.js +7 -0
- package/dist/oci-XOPKH4AE.js +8 -0
- package/dist/opfs-36QO72Y5.js +7 -0
- package/dist/postgres-HPOMN2AR.js +7 -0
- package/dist/qingstor-JKAHLK62.js +8 -0
- package/dist/r2-L3QXQ76M.js +8 -0
- package/dist/{s3-GI7SDKGR.js → s3-LRZJPGHK.js} +2 -2
- package/dist/scaleway-CGNDYNKS.js +8 -0
- package/dist/seaweedfs-BSQWCBIR.js +8 -0
- package/dist/slack-62ECSENR.js +7 -0
- package/dist/supabase-J66NXWAF.js +8 -0
- package/dist/tencent-AC667LV3.js +8 -0
- package/dist/trello-SUPG6VDF.js +7 -0
- package/dist/trello-SUPG6VDF.js.map +1 -0
- package/dist/wasabi-5KKPW6LH.js +8 -0
- package/dist/wasabi-5KKPW6LH.js.map +1 -0
- package/package.json +2 -3
- package/dist/aliyun-GMNRT7BJ.js +0 -8
- package/dist/backblaze-O6CLR73B.js +0 -8
- package/dist/box-GXWDWZRN.js +0 -8
- package/dist/ceph-SM7MXDAY.js +0 -8
- package/dist/chunk-2AEAISO2.js.map +0 -1
- package/dist/chunk-2H4KUUFP.js +0 -26
- package/dist/chunk-2H4KUUFP.js.map +0 -1
- package/dist/chunk-4NLXLDMV.js.map +0 -1
- package/dist/chunk-57QQAM7V.js.map +0 -1
- package/dist/chunk-6YP3B7UK.js.map +0 -1
- package/dist/chunk-BIIG7ZAQ.js.map +0 -1
- package/dist/chunk-BJHHL4UT.js.map +0 -1
- package/dist/chunk-CGZGX2GO.js.map +0 -1
- package/dist/chunk-CNDGXKMU.js.map +0 -1
- package/dist/chunk-DA5EW34P.js.map +0 -1
- package/dist/chunk-DFHFILVF.js.map +0 -1
- package/dist/chunk-DHZMC42C.js.map +0 -1
- package/dist/chunk-DVXOMWD4.js.map +0 -1
- package/dist/chunk-F5QWZ7GM.js.map +0 -1
- package/dist/chunk-G26SGOFR.js.map +0 -1
- package/dist/chunk-HXQ7HDA6.js.map +0 -1
- package/dist/chunk-HYUESAQS.js.map +0 -1
- package/dist/chunk-J54OBIJA.js.map +0 -1
- package/dist/chunk-J7PLA5S3.js.map +0 -1
- package/dist/chunk-JSAQMYPK.js +0 -26
- package/dist/chunk-JSAQMYPK.js.map +0 -1
- package/dist/chunk-K2S42IR4.js.map +0 -1
- package/dist/chunk-KNJKYCTA.js.map +0 -1
- package/dist/chunk-KTE5PB2D.js.map +0 -1
- package/dist/chunk-KV2DM5H6.js +0 -2116
- package/dist/chunk-KV2DM5H6.js.map +0 -1
- package/dist/chunk-LSURHXZH.js.map +0 -1
- package/dist/chunk-NLBT6TBM.js.map +0 -1
- package/dist/chunk-NMZBJOFW.js +0 -26
- package/dist/chunk-NMZBJOFW.js.map +0 -1
- package/dist/chunk-NWZNQ3RC.js.map +0 -1
- package/dist/chunk-O5ONB7QT.js.map +0 -1
- package/dist/chunk-OSMEXGRN.js.map +0 -1
- package/dist/chunk-PV53AX35.js.map +0 -1
- package/dist/chunk-QLLRQNOJ.js.map +0 -1
- package/dist/chunk-ROHDW6KT.js.map +0 -1
- package/dist/chunk-RQ273N5K.js.map +0 -1
- package/dist/chunk-SOF74I3T.js.map +0 -1
- package/dist/chunk-TQ6VRUEI.js.map +0 -1
- package/dist/chunk-X2CCEHOR.js.map +0 -1
- package/dist/chunk-XBOJZZRT.js.map +0 -1
- package/dist/chunk-XYKNXGPR.js.map +0 -1
- package/dist/chunk-YGRKFONX.js +0 -26
- package/dist/chunk-YGRKFONX.js.map +0 -1
- package/dist/config-7IZCGWKX.js +0 -11
- package/dist/config-AT74FARJ.js +0 -11
- package/dist/config-C2AYHACT.js +0 -11
- package/dist/config-GHJOYNM6.js +0 -11
- package/dist/config-L55UXIF4.js +0 -11
- package/dist/config-V7BLK5WP.js +0 -11
- package/dist/digitalocean-XFH2V2A3.js +0 -8
- package/dist/discord-OQMSHM3L.js +0 -7
- package/dist/dropbox-IAOKM7G5.js +0 -8
- package/dist/gcs-JYZB6CVP.js +0 -8
- package/dist/gdocs-PHKQGLZL.js +0 -8
- package/dist/gdrive-4JQLGOOP.js +0 -8
- package/dist/github-DU7Z4RSU.js +0 -7
- package/dist/github_ci-XSAJDNXC.js +0 -8
- package/dist/gmail-DEQP2M7T.js +0 -8
- package/dist/gsheets-KCIHSMOK.js +0 -8
- package/dist/gslides-2KBUKKM5.js +0 -8
- package/dist/langfuse-FNCMKFSL.js +0 -7
- package/dist/linear-XTFO4WKD.js +0 -7
- package/dist/minio-NGPBAJY3.js +0 -8
- package/dist/mongodb-PGOX6QSY.js +0 -7
- package/dist/notion-HYYNQ7KI.js +0 -7
- package/dist/oci-EGDBSMLM.js +0 -8
- package/dist/opfs-5WGXB5OG.js +0 -7
- package/dist/postgres-5HYED4AC.js +0 -7
- package/dist/qingstor-2T4Y6MEG.js +0 -8
- package/dist/r2-3B45S2KV.js +0 -8
- package/dist/scaleway-ICCXVAY6.js +0 -8
- package/dist/seaweedfs-MF77EC33.js +0 -8
- package/dist/slack-6LGQERIU.js +0 -7
- package/dist/supabase-XTOVMHXU.js +0 -8
- package/dist/tencent-FXFKSOTN.js +0 -8
- package/dist/trello-DZK4NEVY.js +0 -7
- package/dist/wasabi-KVE2B6RB.js +0 -8
- /package/dist/{aliyun-GMNRT7BJ.js.map → aliyun-DR6KT3H6.js.map} +0 -0
- /package/dist/{backblaze-O6CLR73B.js.map → backblaze-XCLZXTES.js.map} +0 -0
- /package/dist/{box-GXWDWZRN.js.map → box-XBCSU3AA.js.map} +0 -0
- /package/dist/{ceph-SM7MXDAY.js.map → ceph-F5S2NMTO.js.map} +0 -0
- /package/dist/{config-7IZCGWKX.js.map → config-2Y6LZKLV.js.map} +0 -0
- /package/dist/{config-AT74FARJ.js.map → config-4GSOMUMF.js.map} +0 -0
- /package/dist/{config-C2AYHACT.js.map → config-5YBUWFUP.js.map} +0 -0
- /package/dist/{config-ET26F632.js.map → config-DE5OZ4I7.js.map} +0 -0
- /package/dist/{config-GHJOYNM6.js.map → config-ELDOFRJW.js.map} +0 -0
- /package/dist/{config-L55UXIF4.js.map → config-FPM3LAW7.js.map} +0 -0
- /package/dist/{config-NV5WXP64.js.map → config-JY557MA6.js.map} +0 -0
- /package/dist/{config-V7BLK5WP.js.map → config-UU27ALAA.js.map} +0 -0
- /package/dist/{digitalocean-XFH2V2A3.js.map → config-WRACCRPN.js.map} +0 -0
- /package/dist/{discord-OQMSHM3L.js.map → digitalocean-QDHTRS2W.js.map} +0 -0
- /package/dist/{dropbox-IAOKM7G5.js.map → discord-ERUI7OAQ.js.map} +0 -0
- /package/dist/{gcs-JYZB6CVP.js.map → dropbox-3U6D4HLE.js.map} +0 -0
- /package/dist/{gdocs-PHKQGLZL.js.map → gcal-MTBSDG34.js.map} +0 -0
- /package/dist/{gdrive-4JQLGOOP.js.map → gcs-KNGRBBET.js.map} +0 -0
- /package/dist/{github-DU7Z4RSU.js.map → gdocs-RUIOIRKP.js.map} +0 -0
- /package/dist/{github_ci-XSAJDNXC.js.map → gdrive-5JB7ZKEP.js.map} +0 -0
- /package/dist/{gmail-DEQP2M7T.js.map → github-CIXBFBVO.js.map} +0 -0
- /package/dist/{gsheets-KCIHSMOK.js.map → github_ci-HR6YOYAO.js.map} +0 -0
- /package/dist/{gslides-2KBUKKM5.js.map → gmail-JHGWTQU5.js.map} +0 -0
- /package/dist/{langfuse-FNCMKFSL.js.map → gsheets-N54JO2RS.js.map} +0 -0
- /package/dist/{linear-XTFO4WKD.js.map → gslides-B4VMNLMB.js.map} +0 -0
- /package/dist/{minio-NGPBAJY3.js.map → langfuse-HEUJGDOC.js.map} +0 -0
- /package/dist/{mongodb-PGOX6QSY.js.map → linear-J4QQ3CA6.js.map} +0 -0
- /package/dist/{notion-HYYNQ7KI.js.map → minio-BXWHJ6K5.js.map} +0 -0
- /package/dist/{oci-EGDBSMLM.js.map → mongodb-YZP643ZU.js.map} +0 -0
- /package/dist/{opfs-5WGXB5OG.js.map → notion-I5S5SRLO.js.map} +0 -0
- /package/dist/{postgres-5HYED4AC.js.map → oci-XOPKH4AE.js.map} +0 -0
- /package/dist/{qingstor-2T4Y6MEG.js.map → opfs-36QO72Y5.js.map} +0 -0
- /package/dist/{r2-3B45S2KV.js.map → postgres-HPOMN2AR.js.map} +0 -0
- /package/dist/{s3-GI7SDKGR.js.map → qingstor-JKAHLK62.js.map} +0 -0
- /package/dist/{scaleway-ICCXVAY6.js.map → r2-L3QXQ76M.js.map} +0 -0
- /package/dist/{seaweedfs-MF77EC33.js.map → s3-LRZJPGHK.js.map} +0 -0
- /package/dist/{slack-6LGQERIU.js.map → scaleway-CGNDYNKS.js.map} +0 -0
- /package/dist/{supabase-XTOVMHXU.js.map → seaweedfs-BSQWCBIR.js.map} +0 -0
- /package/dist/{tencent-FXFKSOTN.js.map → slack-62ECSENR.js.map} +0 -0
- /package/dist/{trello-DZK4NEVY.js.map → supabase-J66NXWAF.js.map} +0 -0
- /package/dist/{wasabi-KVE2B6RB.js.map → tencent-AC667LV3.js.map} +0 -0
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
// src/resource/discord/discord.ts
|
|
2
|
+
import { mountKey, mountPrefixOf } from "@struktoai/mirage-core";
|
|
2
3
|
import {
|
|
3
4
|
BrowserDiscordTransport,
|
|
4
5
|
DISCORD_COMMANDS,
|
|
5
6
|
DISCORD_PROMPT,
|
|
6
|
-
|
|
7
|
+
DISCORD_OPS,
|
|
7
8
|
DISCORD_WRITE_PROMPT,
|
|
8
9
|
DiscordAccessor,
|
|
9
10
|
PathSpec,
|
|
@@ -12,11 +13,15 @@ import {
|
|
|
12
13
|
discordRead,
|
|
13
14
|
discordReaddir,
|
|
14
15
|
discordStat,
|
|
15
|
-
|
|
16
|
+
makeResolveGlob
|
|
16
17
|
} from "@struktoai/mirage-core";
|
|
17
18
|
|
|
18
19
|
// src/resource/discord/config.ts
|
|
19
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
redactConfigWithSchema,
|
|
22
|
+
secretSchema,
|
|
23
|
+
z
|
|
24
|
+
} from "@struktoai/mirage-core";
|
|
20
25
|
var DiscordConfigSchema = z.object({
|
|
21
26
|
proxyUrl: z.string(),
|
|
22
27
|
getHeaders: secretSchema(
|
|
@@ -28,9 +33,14 @@ function redactDiscordConfig(config) {
|
|
|
28
33
|
}
|
|
29
34
|
|
|
30
35
|
// src/resource/discord/discord.ts
|
|
36
|
+
var resolveDiscordGlob = makeResolveGlob(discordReaddir);
|
|
31
37
|
var DiscordResource = class {
|
|
32
38
|
kind = ResourceName.DISCORD;
|
|
33
39
|
cachesReads = true;
|
|
40
|
+
// Every listed file carries an exact size: chat.jsonl and members/*.json
|
|
41
|
+
// are rendered at readdir from payloads the listing already fetched, and
|
|
42
|
+
// attachments carry Discord's CDN byte count.
|
|
43
|
+
sizesAlwaysKnown = true;
|
|
34
44
|
indexTtl = 600;
|
|
35
45
|
prompt = DISCORD_PROMPT;
|
|
36
46
|
writePrompt = DISCORD_WRITE_PROMPT;
|
|
@@ -57,7 +67,7 @@ var DiscordResource = class {
|
|
|
57
67
|
return DISCORD_COMMANDS;
|
|
58
68
|
}
|
|
59
69
|
ops() {
|
|
60
|
-
return
|
|
70
|
+
return DISCORD_OPS;
|
|
61
71
|
}
|
|
62
72
|
readFile(p) {
|
|
63
73
|
return discordRead(this.accessor, p, this.index);
|
|
@@ -68,18 +78,14 @@ var DiscordResource = class {
|
|
|
68
78
|
stat(p) {
|
|
69
79
|
return discordStat(this.accessor, p, this.index);
|
|
70
80
|
}
|
|
71
|
-
async fingerprint(p) {
|
|
72
|
-
const lookup = await this.index.get(p.original);
|
|
73
|
-
return lookup.entry?.remoteTime ?? null;
|
|
74
|
-
}
|
|
75
81
|
glob(paths, prefix = "") {
|
|
76
82
|
const effective = prefix !== "" ? paths.map(
|
|
77
|
-
(p) => p.
|
|
78
|
-
|
|
83
|
+
(p) => mountPrefixOf(p.virtual, p.resourcePath) !== "" ? p : new PathSpec({
|
|
84
|
+
virtual: p.virtual,
|
|
79
85
|
directory: p.directory,
|
|
80
86
|
...p.pattern !== null ? { pattern: p.pattern } : {},
|
|
81
87
|
resolved: p.resolved,
|
|
82
|
-
prefix
|
|
88
|
+
resourcePath: mountKey(p.virtual, prefix)
|
|
83
89
|
})
|
|
84
90
|
) : paths;
|
|
85
91
|
return resolveDiscordGlob(this.accessor, effective, this.index);
|
|
@@ -99,4 +105,4 @@ export {
|
|
|
99
105
|
redactDiscordConfig,
|
|
100
106
|
DiscordResource
|
|
101
107
|
};
|
|
102
|
-
//# sourceMappingURL=chunk-
|
|
108
|
+
//# sourceMappingURL=chunk-5UM6EBVW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resource/discord/discord.ts","../src/resource/discord/config.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { mountKey, mountPrefixOf } from '@struktoai/mirage-core'\nimport {\n BrowserDiscordTransport,\n DISCORD_COMMANDS,\n DISCORD_PROMPT,\n DISCORD_OPS,\n DISCORD_WRITE_PROMPT,\n DiscordAccessor,\n type FileStat,\n type IndexCacheStore,\n PathSpec,\n RAMIndexCacheStore,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n discordRead,\n discordReaddir,\n discordStat,\n makeResolveGlob,\n} from '@struktoai/mirage-core'\nimport { redactDiscordConfig, type DiscordConfig, type DiscordConfigRedacted } from './config.ts'\n\nconst resolveDiscordGlob = makeResolveGlob(discordReaddir)\n\nexport interface DiscordResourceState {\n type: string\n config: DiscordConfigRedacted\n}\n\nexport class DiscordResource implements Resource {\n readonly kind: string = ResourceName.DISCORD\n readonly cachesReads: boolean = true\n // Every listed file carries an exact size: chat.jsonl and members/*.json\n // are rendered at readdir from payloads the listing already fetched, and\n // attachments carry Discord's CDN byte count.\n readonly sizesAlwaysKnown: boolean = true\n readonly indexTtl: number = 600\n readonly prompt: string = DISCORD_PROMPT\n readonly writePrompt: string = DISCORD_WRITE_PROMPT\n readonly config: DiscordConfig\n readonly accessor: DiscordAccessor\n readonly index: IndexCacheStore\n\n constructor(config: DiscordConfig) {\n this.config = config\n this.accessor = new DiscordAccessor(\n new BrowserDiscordTransport({\n proxyUrl: config.proxyUrl,\n ...(config.getHeaders !== undefined ? { getHeaders: config.getHeaders } : {}),\n }),\n )\n this.index = new RAMIndexCacheStore({ ttl: this.indexTtl })\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n close(): Promise<void> {\n return Promise.resolve()\n }\n\n commands(): readonly RegisteredCommand[] {\n return DISCORD_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return DISCORD_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return discordRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return discordReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return discordStat(this.accessor, p, this.index)\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective =\n prefix !== ''\n ? paths.map((p) =>\n mountPrefixOf(p.virtual, p.resourcePath) !== ''\n ? p\n : new PathSpec({\n virtual: p.virtual,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n resourcePath: mountKey(p.virtual, prefix),\n }),\n )\n : paths\n return resolveDiscordGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<DiscordResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactDiscordConfig(this.config),\n })\n }\n\n loadState(_state: DiscordResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n redactConfigWithSchema,\n type ConfigOf,\n type RedactedConfig,\n secretSchema,\n z,\n} from '@struktoai/mirage-core'\n\ntype HeaderProvider = () => Promise<Record<string, string>> | Record<string, string>\n\nconst DiscordConfigSchema = z.object({\n proxyUrl: z.string(),\n getHeaders: secretSchema(\n z.custom<HeaderProvider>((value) => typeof value === 'function'),\n ).optional(),\n})\n\nexport type DiscordConfig = ConfigOf<typeof DiscordConfigSchema>\n\nexport type DiscordConfigRedacted = RedactedConfig<DiscordConfig, 'getHeaders'>\n\nexport function redactDiscordConfig(config: DiscordConfig): DiscordConfigRedacted {\n return redactConfigWithSchema(DiscordConfigSchema, config) as unknown as DiscordConfigRedacted\n}\n"],"mappings":";AAcA,SAAS,UAAU,qBAAqB;AACxC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACpBP;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,OACK;AAIP,IAAM,sBAAsB,EAAE,OAAO;AAAA,EACnC,UAAU,EAAE,OAAO;AAAA,EACnB,YAAY;AAAA,IACV,EAAE,OAAuB,CAAC,UAAU,OAAO,UAAU,UAAU;AAAA,EACjE,EAAE,SAAS;AACb,CAAC;AAMM,SAAS,oBAAoB,QAA8C;AAChF,SAAO,uBAAuB,qBAAqB,MAAM;AAC3D;;;ADAA,IAAM,qBAAqB,gBAAgB,cAAc;AAOlD,IAAM,kBAAN,MAA0C;AAAA,EACtC,OAAe,aAAa;AAAA,EAC5B,cAAuB;AAAA;AAAA;AAAA;AAAA,EAIvB,mBAA4B;AAAA,EAC5B,WAAmB;AAAA,EACnB,SAAiB;AAAA,EACjB,cAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAuB;AACjC,SAAK,SAAS;AACd,SAAK,WAAW,IAAI;AAAA,MAClB,IAAI,wBAAwB;AAAA,QAC1B,UAAU,OAAO;AAAA,QACjB,GAAI,OAAO,eAAe,SAAY,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,MAC7E,CAAC;AAAA,IACH;AACA,SAAK,QAAQ,IAAI,mBAAmB,EAAE,KAAK,KAAK,SAAS,CAAC;AAAA,EAC5D;AAAA,EAEA,OAAsB;AACpB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,QAAuB;AACrB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,WAAyC;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAA+B;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,GAAkC;AACzC,WAAO,YAAY,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,eAAe,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACpD;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,YAAY,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,KAAK,OAA4B,SAAS,IAAyB;AACjE,UAAM,YACJ,WAAW,KACP,MAAM;AAAA,MAAI,CAAC,MACT,cAAc,EAAE,SAAS,EAAE,YAAY,MAAM,KACzC,IACA,IAAI,SAAS;AAAA,QACX,SAAS,EAAE;AAAA,QACX,WAAW,EAAE;AAAA,QACb,GAAI,EAAE,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QACnD,UAAU,EAAE;AAAA,QACZ,cAAc,SAAS,EAAE,SAAS,MAAM;AAAA,MAC1C,CAAC;AAAA,IACP,IACA;AACN,WAAO,mBAAmB,KAAK,UAAU,WAAW,KAAK,KAAK;AAAA,EAChE;AAAA,EAEA,WAA0C;AACxC,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,oBAAoB,KAAK,MAAM;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,QAA6C;AACrD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
S3Resource
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-BGA2F226.js";
|
|
4
4
|
|
|
5
5
|
// src/resource/digitalocean/digitalocean.ts
|
|
6
6
|
import {
|
|
@@ -10,7 +10,11 @@ import {
|
|
|
10
10
|
} from "@struktoai/mirage-core";
|
|
11
11
|
|
|
12
12
|
// src/resource/digitalocean/config.ts
|
|
13
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
redactConfigWithSchema,
|
|
15
|
+
secretSchema,
|
|
16
|
+
z
|
|
17
|
+
} from "@struktoai/mirage-core";
|
|
14
18
|
var DigitalOceanConfigSchema = z.object({
|
|
15
19
|
bucket: z.string(),
|
|
16
20
|
presignedUrlProvider: secretSchema(
|
|
@@ -18,7 +22,8 @@ var DigitalOceanConfigSchema = z.object({
|
|
|
18
22
|
),
|
|
19
23
|
region: z.string().optional(),
|
|
20
24
|
endpoint: z.string().optional(),
|
|
21
|
-
defaultContentType: z.string().optional()
|
|
25
|
+
defaultContentType: z.string().optional(),
|
|
26
|
+
keyPrefix: z.string().optional()
|
|
22
27
|
});
|
|
23
28
|
function resolvedDigitalOceanEndpoint(config) {
|
|
24
29
|
if (config.endpoint !== void 0 && config.endpoint !== "") return config.endpoint;
|
|
@@ -35,7 +40,8 @@ function digitalOceanToS3Config(config) {
|
|
|
35
40
|
presignedUrlProvider: config.presignedUrlProvider,
|
|
36
41
|
...config.region !== void 0 ? { region: config.region } : {},
|
|
37
42
|
...endpoint !== void 0 ? { endpoint } : {},
|
|
38
|
-
...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {}
|
|
43
|
+
...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {},
|
|
44
|
+
...config.keyPrefix !== void 0 ? { keyPrefix: config.keyPrefix } : {}
|
|
39
45
|
};
|
|
40
46
|
}
|
|
41
47
|
function redactDigitalOceanConfig(config) {
|
|
@@ -89,4 +95,4 @@ export {
|
|
|
89
95
|
DIGITALOCEAN_BROWSER_PROMPT,
|
|
90
96
|
DigitalOceanResource
|
|
91
97
|
};
|
|
92
|
-
//# sourceMappingURL=chunk-
|
|
98
|
+
//# sourceMappingURL=chunk-6HRSCX2U.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resource/digitalocean/digitalocean.ts","../src/resource/digitalocean/config.ts","../src/resource/digitalocean/prompt.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n remapCommandsResource,\n remapOpsResource,\n ResourceName,\n type RegisteredCommand,\n type RegisteredOp,\n} from '@struktoai/mirage-core'\nimport { S3Resource } from '../s3/s3.ts'\nimport {\n digitalOceanToS3Config,\n redactDigitalOceanConfig,\n type DigitalOceanConfig,\n type DigitalOceanConfigRedacted,\n} from './config.ts'\nimport { DIGITALOCEAN_BROWSER_PROMPT } from './prompt.ts'\n\nexport interface DigitalOceanResourceState {\n type: string\n config: DigitalOceanConfigRedacted\n}\n\nexport class DigitalOceanResource extends S3Resource {\n override readonly kind: string = ResourceName.DIGITALOCEAN\n override readonly prompt: string = DIGITALOCEAN_BROWSER_PROMPT\n readonly digitalOceanConfig: DigitalOceanConfig\n private readonly digitalOceanOps: readonly RegisteredOp[]\n private readonly digitalOceanCommands: readonly RegisteredCommand[]\n\n constructor(config: DigitalOceanConfig) {\n super(digitalOceanToS3Config(config))\n this.digitalOceanConfig = config\n this.digitalOceanOps = remapOpsResource(super.ops(), ResourceName.DIGITALOCEAN)\n this.digitalOceanCommands = remapCommandsResource(super.commands(), ResourceName.DIGITALOCEAN)\n }\n\n override ops(): readonly RegisteredOp[] {\n return this.digitalOceanOps\n }\n\n override commands(): readonly RegisteredCommand[] {\n return this.digitalOceanCommands\n }\n\n override getState(): Promise<DigitalOceanResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactDigitalOceanConfig(this.digitalOceanConfig),\n })\n }\n\n override loadState(_state: DigitalOceanResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n redactConfigWithSchema,\n type ConfigOf,\n type RedactedConfig,\n secretSchema,\n z,\n} from '@struktoai/mirage-core'\nimport type { S3BrowserPresignedUrlProvider, S3Config } from '../s3/config.ts'\n\nconst DigitalOceanConfigSchema = z.object({\n bucket: z.string(),\n presignedUrlProvider: secretSchema(\n z.custom<S3BrowserPresignedUrlProvider>((value) => typeof value === 'function'),\n ),\n region: z.string().optional(),\n endpoint: z.string().optional(),\n defaultContentType: z.string().optional(),\n keyPrefix: z.string().optional(),\n})\n\nexport type DigitalOceanConfig = ConfigOf<typeof DigitalOceanConfigSchema>\n\nexport type DigitalOceanConfigRedacted = RedactedConfig<DigitalOceanConfig, 'presignedUrlProvider'>\n\nexport function resolvedDigitalOceanEndpoint(config: DigitalOceanConfig): string | undefined {\n if (config.endpoint !== undefined && config.endpoint !== '') return config.endpoint\n if (config.region !== undefined && config.region !== '') {\n const region = config.region\n return `https://${region}.digitaloceanspaces.com`\n }\n return undefined\n}\n\nexport function digitalOceanToS3Config(config: DigitalOceanConfig): S3Config {\n const endpoint = resolvedDigitalOceanEndpoint(config)\n return {\n bucket: config.bucket,\n presignedUrlProvider: config.presignedUrlProvider,\n ...(config.region !== undefined ? { region: config.region } : {}),\n ...(endpoint !== undefined ? { endpoint } : {}),\n ...(config.defaultContentType !== undefined\n ? { defaultContentType: config.defaultContentType }\n : {}),\n ...(config.keyPrefix !== undefined ? { keyPrefix: config.keyPrefix } : {}),\n }\n}\n\nexport function redactDigitalOceanConfig(config: DigitalOceanConfig): DigitalOceanConfigRedacted {\n return redactConfigWithSchema(\n DigitalOceanConfigSchema,\n config,\n ) as unknown as DigitalOceanConfigRedacted\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nexport const DIGITALOCEAN_BROWSER_PROMPT = `{prefix}\n Remote DigitalOcean Spaces bucket (S3-compatible) accessed via presigned URLs (browser runtime).\n Supports the full filesystem command set: ls/tree/cat/grep/find/du/cp/mv/rm/etc.\n Listing operations require the presigner to sign LIST/COPY operations in\n addition to GET/PUT/HEAD/DELETE — see S3BrowserPresignedUrlProvider docs.`\n"],"mappings":";;;;;AAcA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;;;ACNP;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,OACK;AAGP,IAAM,2BAA2B,EAAE,OAAO;AAAA,EACxC,QAAQ,EAAE,OAAO;AAAA,EACjB,sBAAsB;AAAA,IACpB,EAAE,OAAsC,CAAC,UAAU,OAAO,UAAU,UAAU;AAAA,EAChF;AAAA,EACA,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAMM,SAAS,6BAA6B,QAAgD;AAC3F,MAAI,OAAO,aAAa,UAAa,OAAO,aAAa,GAAI,QAAO,OAAO;AAC3E,MAAI,OAAO,WAAW,UAAa,OAAO,WAAW,IAAI;AACvD,UAAM,SAAS,OAAO;AACtB,WAAO,WAAW,MAAM;AAAA,EAC1B;AACA,SAAO;AACT;AAEO,SAAS,uBAAuB,QAAsC;AAC3E,QAAM,WAAW,6BAA6B,MAAM;AACpD,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,sBAAsB,OAAO;AAAA,IAC7B,GAAI,OAAO,WAAW,SAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,IAC/D,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,IAC7C,GAAI,OAAO,uBAAuB,SAC9B,EAAE,oBAAoB,OAAO,mBAAmB,IAChD,CAAC;AAAA,IACL,GAAI,OAAO,cAAc,SAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,EAC1E;AACF;AAEO,SAAS,yBAAyB,QAAwD;AAC/F,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;ACpDO,IAAM,8BAA8B;AAAA;AAAA;AAAA;AAAA;;;AFqBpC,IAAM,uBAAN,cAAmC,WAAW;AAAA,EACjC,OAAe,aAAa;AAAA,EAC5B,SAAiB;AAAA,EAC1B;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,QAA4B;AACtC,UAAM,uBAAuB,MAAM,CAAC;AACpC,SAAK,qBAAqB;AAC1B,SAAK,kBAAkB,iBAAiB,MAAM,IAAI,GAAG,aAAa,YAAY;AAC9E,SAAK,uBAAuB,sBAAsB,MAAM,SAAS,GAAG,aAAa,YAAY;AAAA,EAC/F;AAAA,EAES,MAA+B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAA+C;AACtD,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,yBAAyB,KAAK,kBAAkB;AAAA,IAC1D,CAAC;AAAA,EACH;AAAA,EAES,UAAU,QAAkD;AACnE,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
S3Resource
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-BGA2F226.js";
|
|
4
4
|
|
|
5
5
|
// src/resource/gcs/gcs.ts
|
|
6
6
|
import {
|
|
@@ -10,7 +10,11 @@ import {
|
|
|
10
10
|
} from "@struktoai/mirage-core";
|
|
11
11
|
|
|
12
12
|
// src/resource/gcs/config.ts
|
|
13
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
redactConfigWithSchema,
|
|
15
|
+
secretSchema,
|
|
16
|
+
z
|
|
17
|
+
} from "@struktoai/mirage-core";
|
|
14
18
|
var GCSConfigSchema = z.object({
|
|
15
19
|
bucket: z.string(),
|
|
16
20
|
presignedUrlProvider: secretSchema(
|
|
@@ -18,7 +22,8 @@ var GCSConfigSchema = z.object({
|
|
|
18
22
|
),
|
|
19
23
|
region: z.string().optional(),
|
|
20
24
|
endpoint: z.string().optional(),
|
|
21
|
-
defaultContentType: z.string().optional()
|
|
25
|
+
defaultContentType: z.string().optional(),
|
|
26
|
+
keyPrefix: z.string().optional()
|
|
22
27
|
});
|
|
23
28
|
function gcsToS3Config(config) {
|
|
24
29
|
return {
|
|
@@ -26,7 +31,8 @@ function gcsToS3Config(config) {
|
|
|
26
31
|
presignedUrlProvider: config.presignedUrlProvider,
|
|
27
32
|
...config.region !== void 0 ? { region: config.region } : { region: "auto" },
|
|
28
33
|
...config.endpoint !== void 0 ? { endpoint: config.endpoint } : { endpoint: "https://storage.googleapis.com" },
|
|
29
|
-
...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {}
|
|
34
|
+
...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {},
|
|
35
|
+
...config.keyPrefix !== void 0 ? { keyPrefix: config.keyPrefix } : {}
|
|
30
36
|
};
|
|
31
37
|
}
|
|
32
38
|
function redactGcsConfig(config) {
|
|
@@ -76,4 +82,4 @@ export {
|
|
|
76
82
|
GCS_BROWSER_PROMPT,
|
|
77
83
|
GCSResource
|
|
78
84
|
};
|
|
79
|
-
//# sourceMappingURL=chunk-
|
|
85
|
+
//# sourceMappingURL=chunk-7HWQAYXR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resource/gcs/gcs.ts","../src/resource/gcs/config.ts","../src/resource/gcs/prompt.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n remapCommandsResource,\n remapOpsResource,\n ResourceName,\n type RegisteredCommand,\n type RegisteredOp,\n} from '@struktoai/mirage-core'\nimport { S3Resource } from '../s3/s3.ts'\nimport { gcsToS3Config, redactGcsConfig, type GCSConfig, type GCSConfigRedacted } from './config.ts'\nimport { GCS_BROWSER_PROMPT } from './prompt.ts'\n\nexport interface GCSResourceState {\n type: string\n config: GCSConfigRedacted\n}\n\nexport class GCSResource extends S3Resource {\n override readonly kind: string = ResourceName.GCS\n override readonly prompt: string = GCS_BROWSER_PROMPT\n readonly gcsConfig: GCSConfig\n private readonly gcsOps: readonly RegisteredOp[]\n private readonly gcsCommands: readonly RegisteredCommand[]\n\n constructor(config: GCSConfig) {\n super(gcsToS3Config(config))\n this.gcsConfig = config\n this.gcsOps = remapOpsResource(super.ops(), ResourceName.GCS)\n this.gcsCommands = remapCommandsResource(super.commands(), ResourceName.GCS)\n }\n\n override ops(): readonly RegisteredOp[] {\n return this.gcsOps\n }\n\n override commands(): readonly RegisteredCommand[] {\n return this.gcsCommands\n }\n\n override getState(): Promise<GCSResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactGcsConfig(this.gcsConfig),\n })\n }\n\n override loadState(_state: GCSResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n redactConfigWithSchema,\n type ConfigOf,\n type RedactedConfig,\n secretSchema,\n z,\n} from '@struktoai/mirage-core'\nimport type { S3BrowserPresignedUrlProvider, S3Config } from '../s3/config.ts'\n\nconst GCSConfigSchema = z.object({\n bucket: z.string(),\n presignedUrlProvider: secretSchema(\n z.custom<S3BrowserPresignedUrlProvider>((value) => typeof value === 'function'),\n ),\n region: z.string().optional(),\n endpoint: z.string().optional(),\n defaultContentType: z.string().optional(),\n keyPrefix: z.string().optional(),\n})\n\nexport type GCSConfig = ConfigOf<typeof GCSConfigSchema>\n\nexport type GCSConfigRedacted = RedactedConfig<GCSConfig, 'presignedUrlProvider'>\n\nexport function gcsToS3Config(config: GCSConfig): S3Config {\n return {\n bucket: config.bucket,\n presignedUrlProvider: config.presignedUrlProvider,\n ...(config.region !== undefined ? { region: config.region } : { region: 'auto' }),\n ...(config.endpoint !== undefined\n ? { endpoint: config.endpoint }\n : { endpoint: 'https://storage.googleapis.com' }),\n ...(config.defaultContentType !== undefined\n ? { defaultContentType: config.defaultContentType }\n : {}),\n ...(config.keyPrefix !== undefined ? { keyPrefix: config.keyPrefix } : {}),\n }\n}\n\nexport function redactGcsConfig(config: GCSConfig): GCSConfigRedacted {\n return redactConfigWithSchema(GCSConfigSchema, config) as unknown as GCSConfigRedacted\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nexport const GCS_BROWSER_PROMPT = `{prefix}\n Remote Google Cloud Storage bucket accessed via presigned URLs (browser runtime).\n Supports the full filesystem command set: ls/tree/cat/grep/find/du/cp/mv/rm/etc.\n Listing operations require the presigner to sign LIST/COPY operations in\n addition to GET/PUT/HEAD/DELETE — see S3BrowserPresignedUrlProvider docs.`\n"],"mappings":";;;;;AAcA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;;;ACNP;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,OACK;AAGP,IAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,QAAQ,EAAE,OAAO;AAAA,EACjB,sBAAsB;AAAA,IACpB,EAAE,OAAsC,CAAC,UAAU,OAAO,UAAU,UAAU;AAAA,EAChF;AAAA,EACA,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAMM,SAAS,cAAc,QAA6B;AACzD,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,sBAAsB,OAAO;AAAA,IAC7B,GAAI,OAAO,WAAW,SAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,EAAE,QAAQ,OAAO;AAAA,IAC/E,GAAI,OAAO,aAAa,SACpB,EAAE,UAAU,OAAO,SAAS,IAC5B,EAAE,UAAU,iCAAiC;AAAA,IACjD,GAAI,OAAO,uBAAuB,SAC9B,EAAE,oBAAoB,OAAO,mBAAmB,IAChD,CAAC;AAAA,IACL,GAAI,OAAO,cAAc,SAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,EAC1E;AACF;AAEO,SAAS,gBAAgB,QAAsC;AACpE,SAAO,uBAAuB,iBAAiB,MAAM;AACvD;;;ACzCO,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;;;AFgB3B,IAAM,cAAN,cAA0B,WAAW;AAAA,EACxB,OAAe,aAAa;AAAA,EAC5B,SAAiB;AAAA,EAC1B;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,QAAmB;AAC7B,UAAM,cAAc,MAAM,CAAC;AAC3B,SAAK,YAAY;AACjB,SAAK,SAAS,iBAAiB,MAAM,IAAI,GAAG,aAAa,GAAG;AAC5D,SAAK,cAAc,sBAAsB,MAAM,SAAS,GAAG,aAAa,GAAG;AAAA,EAC7E;AAAA,EAES,MAA+B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAsC;AAC7C,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,gBAAgB,KAAK,SAAS;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAES,UAAU,QAAyC;AAC1D,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
} from "./chunk-
|
|
2
|
+
redactGoogleConfig
|
|
3
|
+
} from "./chunk-4IF4TGAI.js";
|
|
4
4
|
|
|
5
5
|
// src/resource/gslides/gslides.ts
|
|
6
|
+
import { mountKey, mountPrefixOf } from "@struktoai/mirage-core";
|
|
6
7
|
import {
|
|
7
8
|
GSLIDES_COMMANDS,
|
|
8
9
|
GSLIDES_PROMPT,
|
|
9
|
-
|
|
10
|
+
GSLIDES_OPS,
|
|
10
11
|
GSLIDES_WRITE_PROMPT,
|
|
11
12
|
GSlidesAccessor,
|
|
12
13
|
PathSpec,
|
|
@@ -15,9 +16,10 @@ import {
|
|
|
15
16
|
TokenManager,
|
|
16
17
|
gslidesRead,
|
|
17
18
|
gslidesReaddir,
|
|
18
|
-
|
|
19
|
+
makeResolveGlob,
|
|
19
20
|
gslidesStat
|
|
20
21
|
} from "@struktoai/mirage-core";
|
|
22
|
+
var gslidesResolveGlob = makeResolveGlob(gslidesReaddir);
|
|
21
23
|
var GSlidesResource = class {
|
|
22
24
|
kind = ResourceName.GSLIDES;
|
|
23
25
|
cachesReads = true;
|
|
@@ -29,12 +31,7 @@ var GSlidesResource = class {
|
|
|
29
31
|
index;
|
|
30
32
|
constructor(config) {
|
|
31
33
|
this.config = config;
|
|
32
|
-
const tm = new TokenManager(
|
|
33
|
-
clientId: config.clientId,
|
|
34
|
-
...config.clientSecret !== void 0 ? { clientSecret: config.clientSecret } : {},
|
|
35
|
-
refreshToken: config.refreshToken,
|
|
36
|
-
...config.refreshFn !== void 0 ? { refreshFn: config.refreshFn } : {}
|
|
37
|
-
});
|
|
34
|
+
const tm = new TokenManager(config);
|
|
38
35
|
this.accessor = new GSlidesAccessor({ tokenManager: tm });
|
|
39
36
|
this.index = new RAMIndexCacheStore({ ttl: 86400 });
|
|
40
37
|
}
|
|
@@ -48,7 +45,7 @@ var GSlidesResource = class {
|
|
|
48
45
|
return GSLIDES_COMMANDS;
|
|
49
46
|
}
|
|
50
47
|
ops() {
|
|
51
|
-
return
|
|
48
|
+
return GSLIDES_OPS;
|
|
52
49
|
}
|
|
53
50
|
readFile(p) {
|
|
54
51
|
return gslidesRead(this.accessor, p, this.index);
|
|
@@ -59,18 +56,14 @@ var GSlidesResource = class {
|
|
|
59
56
|
stat(p) {
|
|
60
57
|
return gslidesStat(this.accessor, p, this.index);
|
|
61
58
|
}
|
|
62
|
-
async fingerprint(p) {
|
|
63
|
-
const lookup = await this.index.get(p.original);
|
|
64
|
-
return lookup.entry?.remoteTime ?? null;
|
|
65
|
-
}
|
|
66
59
|
glob(paths, prefix = "") {
|
|
67
60
|
const effective = prefix !== "" ? paths.map(
|
|
68
|
-
(p) => p.
|
|
69
|
-
|
|
61
|
+
(p) => mountPrefixOf(p.virtual, p.resourcePath) !== "" ? p : new PathSpec({
|
|
62
|
+
virtual: p.virtual,
|
|
70
63
|
directory: p.directory,
|
|
71
64
|
...p.pattern !== null ? { pattern: p.pattern } : {},
|
|
72
65
|
resolved: p.resolved,
|
|
73
|
-
prefix
|
|
66
|
+
resourcePath: mountKey(p.virtual, prefix)
|
|
74
67
|
})
|
|
75
68
|
) : paths;
|
|
76
69
|
return gslidesResolveGlob(this.accessor, effective, this.index);
|
|
@@ -78,7 +71,7 @@ var GSlidesResource = class {
|
|
|
78
71
|
getState() {
|
|
79
72
|
return Promise.resolve({
|
|
80
73
|
type: this.kind,
|
|
81
|
-
config:
|
|
74
|
+
config: redactGoogleConfig(this.config)
|
|
82
75
|
});
|
|
83
76
|
}
|
|
84
77
|
loadState(_state) {
|
|
@@ -89,4 +82,4 @@ var GSlidesResource = class {
|
|
|
89
82
|
export {
|
|
90
83
|
GSlidesResource
|
|
91
84
|
};
|
|
92
|
-
//# sourceMappingURL=chunk-
|
|
85
|
+
//# sourceMappingURL=chunk-AUZNQ7EI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resource/gslides/gslides.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { mountKey, mountPrefixOf } from '@struktoai/mirage-core'\nimport {\n type FileStat,\n GSLIDES_COMMANDS,\n GSLIDES_PROMPT,\n GSLIDES_OPS,\n GSLIDES_WRITE_PROMPT,\n GSlidesAccessor,\n type IndexCacheStore,\n PathSpec,\n RAMIndexCacheStore,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n TokenManager,\n gslidesRead,\n gslidesReaddir,\n makeResolveGlob,\n gslidesStat,\n} from '@struktoai/mirage-core'\nimport { redactGSlidesConfig, type GSlidesConfig, type GSlidesConfigRedacted } from './config.ts'\n\nconst gslidesResolveGlob = makeResolveGlob(gslidesReaddir)\n\nexport interface GSlidesResourceState {\n type: string\n config: GSlidesConfigRedacted\n}\n\nexport class GSlidesResource implements Resource {\n readonly kind: string = ResourceName.GSLIDES\n readonly cachesReads: boolean = true\n readonly indexTtl: number = 86_400\n readonly prompt: string = GSLIDES_PROMPT\n readonly writePrompt: string = GSLIDES_WRITE_PROMPT\n readonly config: GSlidesConfig\n readonly accessor: GSlidesAccessor\n readonly index: IndexCacheStore\n\n constructor(config: GSlidesConfig) {\n this.config = config\n const tm = new TokenManager(config)\n this.accessor = new GSlidesAccessor({ tokenManager: tm })\n this.index = new RAMIndexCacheStore({ ttl: 86_400 })\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n close(): Promise<void> {\n return Promise.resolve()\n }\n\n commands(): readonly RegisteredCommand[] {\n return GSLIDES_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return GSLIDES_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return gslidesRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return gslidesReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return gslidesStat(this.accessor, p, this.index)\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective =\n prefix !== ''\n ? paths.map((p) =>\n mountPrefixOf(p.virtual, p.resourcePath) !== ''\n ? p\n : new PathSpec({\n virtual: p.virtual,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n resourcePath: mountKey(p.virtual, prefix),\n }),\n )\n : paths\n return gslidesResolveGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<GSlidesResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactGSlidesConfig(this.config),\n })\n }\n\n loadState(_state: GSlidesResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n"],"mappings":";;;;;AAcA,SAAS,UAAU,qBAAqB;AACxC;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,IAAM,qBAAqB,gBAAgB,cAAc;AAOlD,IAAM,kBAAN,MAA0C;AAAA,EACtC,OAAe,aAAa;AAAA,EAC5B,cAAuB;AAAA,EACvB,WAAmB;AAAA,EACnB,SAAiB;AAAA,EACjB,cAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAuB;AACjC,SAAK,SAAS;AACd,UAAM,KAAK,IAAI,aAAa,MAAM;AAClC,SAAK,WAAW,IAAI,gBAAgB,EAAE,cAAc,GAAG,CAAC;AACxD,SAAK,QAAQ,IAAI,mBAAmB,EAAE,KAAK,MAAO,CAAC;AAAA,EACrD;AAAA,EAEA,OAAsB;AACpB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,QAAuB;AACrB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,WAAyC;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAA+B;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,GAAkC;AACzC,WAAO,YAAY,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,eAAe,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACpD;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,YAAY,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,KAAK,OAA4B,SAAS,IAAyB;AACjE,UAAM,YACJ,WAAW,KACP,MAAM;AAAA,MAAI,CAAC,MACT,cAAc,EAAE,SAAS,EAAE,YAAY,MAAM,KACzC,IACA,IAAI,SAAS;AAAA,QACX,SAAS,EAAE;AAAA,QACX,WAAW,EAAE;AAAA,QACb,GAAI,EAAE,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QACnD,UAAU,EAAE;AAAA,QACZ,cAAc,SAAS,EAAE,SAAS,MAAM;AAAA,MAC1C,CAAC;AAAA,IACP,IACA;AACN,WAAO,mBAAmB,KAAK,UAAU,WAAW,KAAK,KAAK;AAAA,EAChE;AAAA,EAEA,WAA0C;AACxC,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,mBAAoB,KAAK,MAAM;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,QAA6C;AACrD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
// src/resource/s3/s3.ts
|
|
2
|
+
import { mountKey, mountPrefixOf } from "@struktoai/mirage-core";
|
|
2
3
|
import {
|
|
3
4
|
copy as copyCore,
|
|
4
5
|
create as createCore,
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
s3DuSize as duSizeCore,
|
|
7
|
+
s3DuEntries as duEntriesCore,
|
|
7
8
|
exists as existsCore,
|
|
8
9
|
find as findCore,
|
|
10
|
+
makeResolveGlob,
|
|
9
11
|
mkdir as mkdirCore,
|
|
10
12
|
PathSpec,
|
|
11
13
|
RAMIndexCacheStore,
|
|
@@ -15,7 +17,8 @@ import {
|
|
|
15
17
|
readdir as readdirCore,
|
|
16
18
|
rename as renameCore,
|
|
17
19
|
ResourceName,
|
|
18
|
-
|
|
20
|
+
S3_SCOPE_ERROR,
|
|
21
|
+
s3StorageId,
|
|
19
22
|
rmR as rmRCore,
|
|
20
23
|
rmdir as rmdirCore,
|
|
21
24
|
S3_OPS,
|
|
@@ -33,6 +36,7 @@ import {
|
|
|
33
36
|
} from "@struktoai/mirage-core";
|
|
34
37
|
|
|
35
38
|
// src/resource/s3/s3.ts
|
|
39
|
+
var globCore = makeResolveGlob(readdirCore, S3_SCOPE_ERROR);
|
|
36
40
|
var S3_BROWSER_PROMPT = `{prefix}
|
|
37
41
|
Remote S3 bucket accessed via presigned URLs (browser runtime).
|
|
38
42
|
Supports the full filesystem command set: ls/tree/cat/grep/find/du/cp/mv/rm/etc.
|
|
@@ -42,6 +46,10 @@ var S3Resource = class {
|
|
|
42
46
|
supportsSnapshot = true;
|
|
43
47
|
kind = ResourceName.S3;
|
|
44
48
|
cachesReads = true;
|
|
49
|
+
// A HEAD carries ContentLength, so a size is always knowable without
|
|
50
|
+
// fetching. Every sibling browser resource says so; s3 was the one that
|
|
51
|
+
// did not, and its node twin has always declared it.
|
|
52
|
+
sizesAlwaysKnown = true;
|
|
45
53
|
indexTtl = 600;
|
|
46
54
|
prompt = S3_BROWSER_PROMPT;
|
|
47
55
|
config;
|
|
@@ -52,6 +60,13 @@ var S3Resource = class {
|
|
|
52
60
|
this.accessor = new S3Accessor(this.config);
|
|
53
61
|
this.index = new RAMIndexCacheStore({ ttl: this.indexTtl });
|
|
54
62
|
}
|
|
63
|
+
// Without this, two mounts of one bucket at different prefixes are two
|
|
64
|
+
// storages, so `mv` between them copies an object over itself and then
|
|
65
|
+
// unlinks the source. Node has always declared it; the shared helper keeps
|
|
66
|
+
// the two runtimes from computing different identities for one bucket.
|
|
67
|
+
storageId() {
|
|
68
|
+
return s3StorageId(this.kind, this.config);
|
|
69
|
+
}
|
|
55
70
|
open() {
|
|
56
71
|
return Promise.resolve();
|
|
57
72
|
}
|
|
@@ -120,33 +135,23 @@ var S3Resource = class {
|
|
|
120
135
|
return rmRCore(this.accessor, p);
|
|
121
136
|
}
|
|
122
137
|
du(p) {
|
|
123
|
-
return
|
|
138
|
+
return duSizeCore(this.accessor, p);
|
|
124
139
|
}
|
|
125
140
|
find(p, options = {}) {
|
|
126
141
|
return findCore(this.accessor, p, options);
|
|
127
142
|
}
|
|
128
143
|
glob(paths, prefix = "") {
|
|
129
144
|
const effective = prefix ? paths.map(
|
|
130
|
-
(p) => p.
|
|
131
|
-
|
|
145
|
+
(p) => mountPrefixOf(p.virtual, p.resourcePath) ? p : new PathSpec({
|
|
146
|
+
virtual: p.virtual,
|
|
132
147
|
directory: p.directory,
|
|
133
148
|
...p.pattern !== null ? { pattern: p.pattern } : {},
|
|
134
149
|
resolved: p.resolved,
|
|
135
|
-
prefix
|
|
150
|
+
resourcePath: mountKey(p.virtual, prefix)
|
|
136
151
|
})
|
|
137
152
|
) : paths;
|
|
138
153
|
return globCore(this.accessor, effective, this.index);
|
|
139
154
|
}
|
|
140
|
-
async fingerprint(p) {
|
|
141
|
-
try {
|
|
142
|
-
const s = await statCore(this.accessor, p, this.index);
|
|
143
|
-
const etag = s.extra.etag;
|
|
144
|
-
return typeof etag === "string" && etag !== "" ? etag : null;
|
|
145
|
-
} catch (err) {
|
|
146
|
-
if (err?.code === "ENOENT") return null;
|
|
147
|
-
throw err;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
155
|
getState() {
|
|
151
156
|
return Promise.resolve({
|
|
152
157
|
type: this.kind,
|
|
@@ -156,10 +161,10 @@ var S3Resource = class {
|
|
|
156
161
|
loadState(_state) {
|
|
157
162
|
return Promise.resolve();
|
|
158
163
|
}
|
|
159
|
-
// Ignored —
|
|
164
|
+
// Ignored — duEntries is not yet on the public Resource interface, but keeping
|
|
160
165
|
// it around matches the node-side S3Resource.opsMap hook for completeness.
|
|
161
|
-
|
|
162
|
-
return
|
|
166
|
+
_duEntries(p) {
|
|
167
|
+
return duEntriesCore(this.accessor, p);
|
|
163
168
|
}
|
|
164
169
|
_rangeRead(p, offset, size) {
|
|
165
170
|
return rangeReadCore(this.accessor, p, offset, size);
|
|
@@ -174,4 +179,4 @@ export {
|
|
|
174
179
|
S3_BROWSER_PROMPT,
|
|
175
180
|
S3Resource
|
|
176
181
|
};
|
|
177
|
-
//# sourceMappingURL=chunk-
|
|
182
|
+
//# sourceMappingURL=chunk-BGA2F226.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resource/s3/s3.ts","../src/resource/s3/config.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { mountKey, mountPrefixOf } from '@struktoai/mirage-core'\nimport {\n copy as copyCore,\n create as createCore,\n s3DuSize as duSizeCore,\n s3DuEntries as duEntriesCore,\n exists as existsCore,\n type FileStat,\n type FindOptions,\n find as findCore,\n type IndexCacheStore,\n makeResolveGlob,\n mkdir as mkdirCore,\n PathSpec,\n RAMIndexCacheStore,\n rangeRead as rangeReadCore,\n S3_COMMANDS,\n read as readCore,\n readdir as readdirCore,\n type RegisteredCommand,\n type RegisteredOp,\n rename as renameCore,\n type Resource,\n ResourceName,\n S3_SCOPE_ERROR,\n s3StorageId,\n rmR as rmRCore,\n rmdir as rmdirCore,\n S3_OPS,\n S3Accessor,\n stat as statCore,\n stream as streamCore,\n truncate as truncateCore,\n unlink as unlinkCore,\n write as writeCore,\n} from '@struktoai/mirage-core'\nimport { redactConfig, type S3Config, type S3ConfigRedacted } from './config.ts'\n\nconst globCore = makeResolveGlob(readdirCore, S3_SCOPE_ERROR)\n\nexport const S3_BROWSER_PROMPT = `{prefix}\n Remote S3 bucket accessed via presigned URLs (browser runtime).\n Supports the full filesystem command set: ls/tree/cat/grep/find/du/cp/mv/rm/etc.\n Listing operations require the presigner to sign LIST/COPY operations in\n addition to GET/PUT/HEAD/DELETE — see S3BrowserPresignedUrlProvider docs.`\n\nexport interface S3ResourceState {\n type: string\n config: S3ConfigRedacted\n}\n\nexport class S3Resource implements Resource {\n readonly supportsSnapshot: boolean = true\n readonly kind: string = ResourceName.S3\n readonly cachesReads: boolean = true\n // A HEAD carries ContentLength, so a size is always knowable without\n // fetching. Every sibling browser resource says so; s3 was the one that\n // did not, and its node twin has always declared it.\n readonly sizesAlwaysKnown: boolean = true\n readonly indexTtl: number = 600\n readonly prompt: string = S3_BROWSER_PROMPT\n readonly config: S3Config\n readonly accessor: S3Accessor\n readonly index: IndexCacheStore\n\n constructor(config: S3Config) {\n this.config = config\n this.accessor = new S3Accessor(this.config)\n this.index = new RAMIndexCacheStore({ ttl: this.indexTtl })\n }\n\n // Without this, two mounts of one bucket at different prefixes are two\n // storages, so `mv` between them copies an object over itself and then\n // unlinks the source. Node has always declared it; the shared helper keeps\n // the two runtimes from computing different identities for one bucket.\n storageId(): string {\n return s3StorageId(this.kind, this.config)\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n close(): Promise<void> {\n return Promise.resolve()\n }\n\n commands(): readonly RegisteredCommand[] {\n return S3_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return S3_OPS\n }\n\n streamPath(p: PathSpec): AsyncIterable<Uint8Array> {\n return streamCore(this.accessor, p)\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return readCore(this.accessor, p)\n }\n\n writeFile(p: PathSpec, data: Uint8Array): Promise<void> {\n return writeCore(this.accessor, p, data)\n }\n\n async appendFile(p: PathSpec, data: Uint8Array): Promise<void> {\n let existing: Uint8Array\n try {\n existing = await readCore(this.accessor, p)\n } catch (err) {\n if ((err as { code?: string } | null)?.code === 'ENOENT') {\n existing = new Uint8Array()\n } else {\n throw err\n }\n }\n const merged = new Uint8Array(existing.byteLength + data.byteLength)\n merged.set(existing, 0)\n merged.set(data, existing.byteLength)\n await writeCore(this.accessor, p, merged)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return readdirCore(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return statCore(this.accessor, p, this.index)\n }\n\n exists(p: PathSpec): Promise<boolean> {\n return existsCore(this.accessor, p)\n }\n\n mkdir(p: PathSpec): Promise<void> {\n return mkdirCore(this.accessor, p)\n }\n\n rmdir(p: PathSpec): Promise<void> {\n return rmdirCore(this.accessor, p)\n }\n\n unlink(p: PathSpec): Promise<void> {\n return unlinkCore(this.accessor, p)\n }\n\n rename(src: PathSpec, dst: PathSpec): Promise<void> {\n return renameCore(this.accessor, src, dst)\n }\n\n truncate(p: PathSpec, length: number): Promise<void> {\n return truncateCore(this.accessor, p, length)\n }\n\n copy(src: PathSpec, dst: PathSpec): Promise<void> {\n return copyCore(this.accessor, src, dst)\n }\n\n rmR(p: PathSpec): Promise<void> {\n return rmRCore(this.accessor, p)\n }\n\n du(p: PathSpec): Promise<number> {\n return duSizeCore(this.accessor, p)\n }\n\n find(p: PathSpec, options: FindOptions = {}): Promise<string[]> {\n return findCore(this.accessor, p, options)\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective = prefix\n ? paths.map((p) =>\n mountPrefixOf(p.virtual, p.resourcePath)\n ? p\n : new PathSpec({\n virtual: p.virtual,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n resourcePath: mountKey(p.virtual, prefix),\n }),\n )\n : paths\n return globCore(this.accessor, effective, this.index)\n }\n\n getState(): Promise<S3ResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactConfig(this.config),\n })\n }\n\n loadState(_state: S3ResourceState): Promise<void> {\n return Promise.resolve()\n }\n\n // Ignored — duEntries is not yet on the public Resource interface, but keeping\n // it around matches the node-side S3Resource.opsMap hook for completeness.\n _duEntries(p: PathSpec): Promise<[[string, number][], number]> {\n return duEntriesCore(this.accessor, p)\n }\n\n _rangeRead(p: PathSpec, offset: number, size: number): Promise<Uint8Array> {\n return rangeReadCore(this.accessor, p, offset, size)\n }\n\n _create(p: PathSpec): Promise<void> {\n return createCore(this.accessor, p)\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nexport {\n redactS3Config as redactConfig,\n type S3BrowserOperation,\n type S3BrowserPresignedUrlProvider,\n type S3BrowserSignOptions,\n type S3Config,\n type S3ConfigRedacted,\n} from '@struktoai/mirage-core'\n"],"mappings":";AAcA,SAAS,UAAU,qBAAqB;AACxC;AAAA,EACE,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,UAAU;AAAA,EAGV,QAAQ;AAAA,EAER;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,QAAQ;AAAA,EACR,WAAW;AAAA,EAGX,UAAU;AAAA,EAEV;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,SAAS;AAAA,OACJ;;;ACnCP;AAAA,EACoB;AAAA,OAMb;;;AD+BP,IAAM,WAAW,gBAAgB,aAAa,cAAc;AAErD,IAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAW1B,IAAM,aAAN,MAAqC;AAAA,EACjC,mBAA4B;AAAA,EAC5B,OAAe,aAAa;AAAA,EAC5B,cAAuB;AAAA;AAAA;AAAA;AAAA,EAIvB,mBAA4B;AAAA,EAC5B,WAAmB;AAAA,EACnB,SAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAkB;AAC5B,SAAK,SAAS;AACd,SAAK,WAAW,IAAI,WAAW,KAAK,MAAM;AAC1C,SAAK,QAAQ,IAAI,mBAAmB,EAAE,KAAK,KAAK,SAAS,CAAC;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAoB;AAClB,WAAO,YAAY,KAAK,MAAM,KAAK,MAAM;AAAA,EAC3C;AAAA,EAEA,OAAsB;AACpB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,QAAuB;AACrB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,WAAyC;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAA+B;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,GAAwC;AACjD,WAAO,WAAW,KAAK,UAAU,CAAC;AAAA,EACpC;AAAA,EAEA,SAAS,GAAkC;AACzC,WAAO,SAAS,KAAK,UAAU,CAAC;AAAA,EAClC;AAAA,EAEA,UAAU,GAAa,MAAiC;AACtD,WAAO,UAAU,KAAK,UAAU,GAAG,IAAI;AAAA,EACzC;AAAA,EAEA,MAAM,WAAW,GAAa,MAAiC;AAC7D,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,SAAS,KAAK,UAAU,CAAC;AAAA,IAC5C,SAAS,KAAK;AACZ,UAAK,KAAkC,SAAS,UAAU;AACxD,mBAAW,IAAI,WAAW;AAAA,MAC5B,OAAO;AACL,cAAM;AAAA,MACR;AAAA,IACF;AACA,UAAM,SAAS,IAAI,WAAW,SAAS,aAAa,KAAK,UAAU;AACnE,WAAO,IAAI,UAAU,CAAC;AACtB,WAAO,IAAI,MAAM,SAAS,UAAU;AACpC,UAAM,UAAU,KAAK,UAAU,GAAG,MAAM;AAAA,EAC1C;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,YAAY,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,SAAS,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAC9C;AAAA,EAEA,OAAO,GAA+B;AACpC,WAAO,WAAW,KAAK,UAAU,CAAC;AAAA,EACpC;AAAA,EAEA,MAAM,GAA4B;AAChC,WAAO,UAAU,KAAK,UAAU,CAAC;AAAA,EACnC;AAAA,EAEA,MAAM,GAA4B;AAChC,WAAO,UAAU,KAAK,UAAU,CAAC;AAAA,EACnC;AAAA,EAEA,OAAO,GAA4B;AACjC,WAAO,WAAW,KAAK,UAAU,CAAC;AAAA,EACpC;AAAA,EAEA,OAAO,KAAe,KAA8B;AAClD,WAAO,WAAW,KAAK,UAAU,KAAK,GAAG;AAAA,EAC3C;AAAA,EAEA,SAAS,GAAa,QAA+B;AACnD,WAAO,aAAa,KAAK,UAAU,GAAG,MAAM;AAAA,EAC9C;AAAA,EAEA,KAAK,KAAe,KAA8B;AAChD,WAAO,SAAS,KAAK,UAAU,KAAK,GAAG;AAAA,EACzC;AAAA,EAEA,IAAI,GAA4B;AAC9B,WAAO,QAAQ,KAAK,UAAU,CAAC;AAAA,EACjC;AAAA,EAEA,GAAG,GAA8B;AAC/B,WAAO,WAAW,KAAK,UAAU,CAAC;AAAA,EACpC;AAAA,EAEA,KAAK,GAAa,UAAuB,CAAC,GAAsB;AAC9D,WAAO,SAAS,KAAK,UAAU,GAAG,OAAO;AAAA,EAC3C;AAAA,EAEA,KAAK,OAA4B,SAAS,IAAyB;AACjE,UAAM,YAAY,SACd,MAAM;AAAA,MAAI,CAAC,MACT,cAAc,EAAE,SAAS,EAAE,YAAY,IACnC,IACA,IAAI,SAAS;AAAA,QACX,SAAS,EAAE;AAAA,QACX,WAAW,EAAE;AAAA,QACb,GAAI,EAAE,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QACnD,UAAU,EAAE;AAAA,QACZ,cAAc,SAAS,EAAE,SAAS,MAAM;AAAA,MAC1C,CAAC;AAAA,IACP,IACA;AACJ,WAAO,SAAS,KAAK,UAAU,WAAW,KAAK,KAAK;AAAA,EACtD;AAAA,EAEA,WAAqC;AACnC,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,eAAa,KAAK,MAAM;AAAA,IAClC,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,QAAwC;AAChD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA;AAAA;AAAA,EAIA,WAAW,GAAoD;AAC7D,WAAO,cAAc,KAAK,UAAU,CAAC;AAAA,EACvC;AAAA,EAEA,WAAW,GAAa,QAAgB,MAAmC;AACzE,WAAO,cAAc,KAAK,UAAU,GAAG,QAAQ,IAAI;AAAA,EACrD;AAAA,EAEA,QAAQ,GAA4B;AAClC,WAAO,WAAW,KAAK,UAAU,CAAC;AAAA,EACpC;AACF;","names":[]}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
redactBoxConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-L64GRKOD.js";
|
|
4
4
|
|
|
5
5
|
// src/resource/box/box.ts
|
|
6
|
+
import { mountKey, mountPrefixOf } from "@struktoai/mirage-core";
|
|
6
7
|
import {
|
|
7
8
|
BOX_COMMANDS,
|
|
8
9
|
BOX_PROMPT,
|
|
9
|
-
|
|
10
|
+
BOX_OPS,
|
|
10
11
|
BoxAccessor,
|
|
11
12
|
BoxTokenManager,
|
|
12
13
|
PathSpec,
|
|
@@ -14,12 +15,16 @@ import {
|
|
|
14
15
|
ResourceName,
|
|
15
16
|
boxRead,
|
|
16
17
|
boxReaddir,
|
|
17
|
-
|
|
18
|
+
makeResolveGlob,
|
|
18
19
|
boxStat
|
|
19
20
|
} from "@struktoai/mirage-core";
|
|
21
|
+
var boxResolveGlob = makeResolveGlob(boxReaddir);
|
|
20
22
|
var BoxResource = class {
|
|
21
23
|
kind = ResourceName.BOX;
|
|
22
24
|
cachesReads = true;
|
|
25
|
+
// Box item listings carry an exact byte `size` for every file (0
|
|
26
|
+
// included); sizeless weblinks are filtered out of listings.
|
|
27
|
+
sizesAlwaysKnown = true;
|
|
23
28
|
indexTtl = 86400;
|
|
24
29
|
prompt = BOX_PROMPT;
|
|
25
30
|
config;
|
|
@@ -27,15 +32,12 @@ var BoxResource = class {
|
|
|
27
32
|
index;
|
|
28
33
|
constructor(config) {
|
|
29
34
|
this.config = config;
|
|
30
|
-
const tm = new BoxTokenManager(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
...config.
|
|
34
|
-
...config.
|
|
35
|
-
...config.refreshFn !== void 0 ? { refreshFn: config.refreshFn } : {},
|
|
36
|
-
...config.onRefreshTokenRotated !== void 0 ? { onRefreshTokenRotated: config.onRefreshTokenRotated } : {}
|
|
35
|
+
const tm = new BoxTokenManager(config);
|
|
36
|
+
this.accessor = new BoxAccessor({
|
|
37
|
+
tokenManager: tm,
|
|
38
|
+
...config.rootFolderId !== void 0 ? { rootFolderId: config.rootFolderId } : {},
|
|
39
|
+
...config.contentSearch !== void 0 ? { contentSearch: config.contentSearch } : {}
|
|
37
40
|
});
|
|
38
|
-
this.accessor = new BoxAccessor({ tokenManager: tm });
|
|
39
41
|
this.index = new RAMIndexCacheStore({ ttl: 86400 });
|
|
40
42
|
}
|
|
41
43
|
open() {
|
|
@@ -48,7 +50,7 @@ var BoxResource = class {
|
|
|
48
50
|
return BOX_COMMANDS;
|
|
49
51
|
}
|
|
50
52
|
ops() {
|
|
51
|
-
return
|
|
53
|
+
return BOX_OPS;
|
|
52
54
|
}
|
|
53
55
|
readFile(p) {
|
|
54
56
|
return boxRead(this.accessor, p, this.index);
|
|
@@ -59,18 +61,14 @@ var BoxResource = class {
|
|
|
59
61
|
stat(p) {
|
|
60
62
|
return boxStat(this.accessor, p, this.index);
|
|
61
63
|
}
|
|
62
|
-
async fingerprint(p) {
|
|
63
|
-
const lookup = await this.index.get(p.original);
|
|
64
|
-
return lookup.entry?.remoteTime ?? null;
|
|
65
|
-
}
|
|
66
64
|
glob(paths, prefix = "") {
|
|
67
65
|
const effective = prefix !== "" ? paths.map(
|
|
68
|
-
(p) => p.
|
|
69
|
-
|
|
66
|
+
(p) => mountPrefixOf(p.virtual, p.resourcePath) !== "" ? p : new PathSpec({
|
|
67
|
+
virtual: p.virtual,
|
|
70
68
|
directory: p.directory,
|
|
71
69
|
...p.pattern !== null ? { pattern: p.pattern } : {},
|
|
72
70
|
resolved: p.resolved,
|
|
73
|
-
prefix
|
|
71
|
+
resourcePath: mountKey(p.virtual, prefix)
|
|
74
72
|
})
|
|
75
73
|
) : paths;
|
|
76
74
|
return boxResolveGlob(this.accessor, effective, this.index);
|
|
@@ -89,4 +87,4 @@ var BoxResource = class {
|
|
|
89
87
|
export {
|
|
90
88
|
BoxResource
|
|
91
89
|
};
|
|
92
|
-
//# sourceMappingURL=chunk-
|
|
90
|
+
//# sourceMappingURL=chunk-BV372CUO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resource/box/box.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { mountKey, mountPrefixOf } from '@struktoai/mirage-core'\nimport {\n BOX_COMMANDS,\n BOX_PROMPT,\n BOX_OPS,\n BoxAccessor,\n BoxTokenManager,\n type FileStat,\n type IndexCacheStore,\n PathSpec,\n RAMIndexCacheStore,\n type RegisteredCommand,\n type RegisteredOp,\n type Resource,\n ResourceName,\n boxRead,\n boxReaddir,\n makeResolveGlob,\n boxStat,\n} from '@struktoai/mirage-core'\nimport { redactBoxConfig, type BoxConfig, type BoxConfigRedacted } from './config.ts'\n\nconst boxResolveGlob = makeResolveGlob(boxReaddir)\n\nexport interface BoxResourceState {\n type: string\n config: BoxConfigRedacted\n}\n\nexport class BoxResource implements Resource {\n readonly kind: string = ResourceName.BOX\n readonly cachesReads: boolean = true\n // Box item listings carry an exact byte `size` for every file (0\n // included); sizeless weblinks are filtered out of listings.\n readonly sizesAlwaysKnown: boolean = true\n readonly indexTtl: number = 86_400\n readonly prompt: string = BOX_PROMPT\n readonly config: BoxConfig\n readonly accessor: BoxAccessor\n readonly index: IndexCacheStore\n\n constructor(config: BoxConfig) {\n this.config = config\n // The whole config goes to the token manager, never a hand-picked\n // subset: a field added to BoxConfig would silently stop reaching it\n // (that is how gdrive lost apiBase and kept refreshing at the real\n // Google endpoint against a fake server).\n const tm = new BoxTokenManager(config)\n this.accessor = new BoxAccessor({\n tokenManager: tm,\n ...(config.rootFolderId !== undefined ? { rootFolderId: config.rootFolderId } : {}),\n ...(config.contentSearch !== undefined ? { contentSearch: config.contentSearch } : {}),\n })\n this.index = new RAMIndexCacheStore({ ttl: 86_400 })\n }\n\n open(): Promise<void> {\n return Promise.resolve()\n }\n\n close(): Promise<void> {\n return Promise.resolve()\n }\n\n commands(): readonly RegisteredCommand[] {\n return BOX_COMMANDS\n }\n\n ops(): readonly RegisteredOp[] {\n return BOX_OPS\n }\n\n readFile(p: PathSpec): Promise<Uint8Array> {\n return boxRead(this.accessor, p, this.index)\n }\n\n readdir(p: PathSpec): Promise<string[]> {\n return boxReaddir(this.accessor, p, this.index)\n }\n\n stat(p: PathSpec): Promise<FileStat> {\n return boxStat(this.accessor, p, this.index)\n }\n\n glob(paths: readonly PathSpec[], prefix = ''): Promise<PathSpec[]> {\n const effective =\n prefix !== ''\n ? paths.map((p) =>\n mountPrefixOf(p.virtual, p.resourcePath) !== ''\n ? p\n : new PathSpec({\n virtual: p.virtual,\n directory: p.directory,\n ...(p.pattern !== null ? { pattern: p.pattern } : {}),\n resolved: p.resolved,\n resourcePath: mountKey(p.virtual, prefix),\n }),\n )\n : paths\n return boxResolveGlob(this.accessor, effective, this.index)\n }\n\n getState(): Promise<BoxResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactBoxConfig(this.config),\n })\n }\n\n loadState(_state: BoxResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n"],"mappings":";;;;;AAcA,SAAS,UAAU,qBAAqB;AACxC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,IAAM,iBAAiB,gBAAgB,UAAU;AAO1C,IAAM,cAAN,MAAsC;AAAA,EAClC,OAAe,aAAa;AAAA,EAC5B,cAAuB;AAAA;AAAA;AAAA,EAGvB,mBAA4B;AAAA,EAC5B,WAAmB;AAAA,EACnB,SAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAmB;AAC7B,SAAK,SAAS;AAKd,UAAM,KAAK,IAAI,gBAAgB,MAAM;AACrC,SAAK,WAAW,IAAI,YAAY;AAAA,MAC9B,cAAc;AAAA,MACd,GAAI,OAAO,iBAAiB,SAAY,EAAE,cAAc,OAAO,aAAa,IAAI,CAAC;AAAA,MACjF,GAAI,OAAO,kBAAkB,SAAY,EAAE,eAAe,OAAO,cAAc,IAAI,CAAC;AAAA,IACtF,CAAC;AACD,SAAK,QAAQ,IAAI,mBAAmB,EAAE,KAAK,MAAO,CAAC;AAAA,EACrD;AAAA,EAEA,OAAsB;AACpB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,QAAuB;AACrB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,WAAyC;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAA+B;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,GAAkC;AACzC,WAAO,QAAQ,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAC7C;AAAA,EAEA,QAAQ,GAAgC;AACtC,WAAO,WAAW,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAChD;AAAA,EAEA,KAAK,GAAgC;AACnC,WAAO,QAAQ,KAAK,UAAU,GAAG,KAAK,KAAK;AAAA,EAC7C;AAAA,EAEA,KAAK,OAA4B,SAAS,IAAyB;AACjE,UAAM,YACJ,WAAW,KACP,MAAM;AAAA,MAAI,CAAC,MACT,cAAc,EAAE,SAAS,EAAE,YAAY,MAAM,KACzC,IACA,IAAI,SAAS;AAAA,QACX,SAAS,EAAE;AAAA,QACX,WAAW,EAAE;AAAA,QACb,GAAI,EAAE,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QACnD,UAAU,EAAE;AAAA,QACZ,cAAc,SAAS,EAAE,SAAS,MAAM;AAAA,MAC1C,CAAC;AAAA,IACP,IACA;AACN,WAAO,eAAe,KAAK,UAAU,WAAW,KAAK,KAAK;AAAA,EAC5D;AAAA,EAEA,WAAsC;AACpC,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,gBAAgB,KAAK,MAAM;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,QAAyC;AACjD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
S3Resource
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-BGA2F226.js";
|
|
4
4
|
|
|
5
5
|
// src/resource/oci/oci.ts
|
|
6
6
|
import {
|
|
@@ -10,7 +10,11 @@ import {
|
|
|
10
10
|
} from "@struktoai/mirage-core";
|
|
11
11
|
|
|
12
12
|
// src/resource/oci/config.ts
|
|
13
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
redactConfigWithSchema,
|
|
15
|
+
secretSchema,
|
|
16
|
+
z
|
|
17
|
+
} from "@struktoai/mirage-core";
|
|
14
18
|
var OCIConfigSchema = z.object({
|
|
15
19
|
bucket: z.string(),
|
|
16
20
|
presignedUrlProvider: secretSchema(
|
|
@@ -19,7 +23,8 @@ var OCIConfigSchema = z.object({
|
|
|
19
23
|
namespace: z.string().optional(),
|
|
20
24
|
region: z.string().optional(),
|
|
21
25
|
endpoint: z.string().optional(),
|
|
22
|
-
defaultContentType: z.string().optional()
|
|
26
|
+
defaultContentType: z.string().optional(),
|
|
27
|
+
keyPrefix: z.string().optional()
|
|
23
28
|
});
|
|
24
29
|
function resolvedOciEndpoint(config) {
|
|
25
30
|
if (config.endpoint !== void 0 && config.endpoint !== "") return config.endpoint;
|
|
@@ -35,7 +40,8 @@ function ociToS3Config(config) {
|
|
|
35
40
|
presignedUrlProvider: config.presignedUrlProvider,
|
|
36
41
|
...config.region !== void 0 ? { region: config.region } : {},
|
|
37
42
|
...endpoint !== void 0 ? { endpoint } : {},
|
|
38
|
-
...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {}
|
|
43
|
+
...config.defaultContentType !== void 0 ? { defaultContentType: config.defaultContentType } : {},
|
|
44
|
+
...config.keyPrefix !== void 0 ? { keyPrefix: config.keyPrefix } : {}
|
|
39
45
|
};
|
|
40
46
|
}
|
|
41
47
|
function redactOciConfig(config) {
|
|
@@ -86,4 +92,4 @@ export {
|
|
|
86
92
|
OCI_BROWSER_PROMPT,
|
|
87
93
|
OCIResource
|
|
88
94
|
};
|
|
89
|
-
//# sourceMappingURL=chunk-
|
|
95
|
+
//# sourceMappingURL=chunk-C4THTILY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resource/oci/oci.ts","../src/resource/oci/config.ts","../src/resource/oci/prompt.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n remapCommandsResource,\n remapOpsResource,\n ResourceName,\n type RegisteredCommand,\n type RegisteredOp,\n} from '@struktoai/mirage-core'\nimport { S3Resource } from '../s3/s3.ts'\nimport { ociToS3Config, redactOciConfig, type OCIConfig, type OCIConfigRedacted } from './config.ts'\nimport { OCI_BROWSER_PROMPT } from './prompt.ts'\n\nexport interface OCIResourceState {\n type: string\n config: OCIConfigRedacted\n}\n\nexport class OCIResource extends S3Resource {\n override readonly kind: string = ResourceName.OCI\n override readonly prompt: string = OCI_BROWSER_PROMPT\n readonly ociConfig: OCIConfig\n private readonly ociOps: readonly RegisteredOp[]\n private readonly ociCommands: readonly RegisteredCommand[]\n\n constructor(config: OCIConfig) {\n super(ociToS3Config(config))\n this.ociConfig = config\n this.ociOps = remapOpsResource(super.ops(), ResourceName.OCI)\n this.ociCommands = remapCommandsResource(super.commands(), ResourceName.OCI)\n }\n\n override ops(): readonly RegisteredOp[] {\n return this.ociOps\n }\n\n override commands(): readonly RegisteredCommand[] {\n return this.ociCommands\n }\n\n override getState(): Promise<OCIResourceState> {\n return Promise.resolve({\n type: this.kind,\n config: redactOciConfig(this.ociConfig),\n })\n }\n\n override loadState(_state: OCIResourceState): Promise<void> {\n return Promise.resolve()\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport {\n redactConfigWithSchema,\n type ConfigOf,\n type RedactedConfig,\n secretSchema,\n z,\n} from '@struktoai/mirage-core'\nimport type { S3BrowserPresignedUrlProvider, S3Config } from '../s3/config.ts'\n\nconst OCIConfigSchema = z.object({\n bucket: z.string(),\n presignedUrlProvider: secretSchema(\n z.custom<S3BrowserPresignedUrlProvider>((value) => typeof value === 'function'),\n ),\n namespace: z.string().optional(),\n region: z.string().optional(),\n endpoint: z.string().optional(),\n defaultContentType: z.string().optional(),\n keyPrefix: z.string().optional(),\n})\n\nexport type OCIConfig = ConfigOf<typeof OCIConfigSchema>\n\nexport type OCIConfigRedacted = RedactedConfig<OCIConfig, 'presignedUrlProvider'>\n\nexport function resolvedOciEndpoint(config: OCIConfig): string | undefined {\n if (config.endpoint !== undefined && config.endpoint !== '') return config.endpoint\n if (\n config.namespace !== undefined &&\n config.namespace !== '' &&\n config.region !== undefined &&\n config.region !== ''\n ) {\n return `https://${config.namespace}.compat.objectstorage.${config.region}.oci.customer-oci.com`\n }\n return undefined\n}\n\nexport function ociToS3Config(config: OCIConfig): S3Config {\n const endpoint = resolvedOciEndpoint(config)\n return {\n bucket: config.bucket,\n presignedUrlProvider: config.presignedUrlProvider,\n ...(config.region !== undefined ? { region: config.region } : {}),\n ...(endpoint !== undefined ? { endpoint } : {}),\n ...(config.defaultContentType !== undefined\n ? { defaultContentType: config.defaultContentType }\n : {}),\n ...(config.keyPrefix !== undefined ? { keyPrefix: config.keyPrefix } : {}),\n }\n}\n\nexport function redactOciConfig(config: OCIConfig): OCIConfigRedacted {\n return redactConfigWithSchema(OCIConfigSchema, config) as unknown as OCIConfigRedacted\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nexport const OCI_BROWSER_PROMPT = `{prefix}\n Remote Oracle Cloud Object Storage accessed via presigned URLs (browser runtime).\n Supports the full filesystem command set: ls/tree/cat/grep/find/du/cp/mv/rm/etc.\n Listing operations require the presigner to sign LIST/COPY operations in\n addition to GET/PUT/HEAD/DELETE — see S3BrowserPresignedUrlProvider docs.`\n"],"mappings":";;;;;AAcA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;;;ACNP;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,OACK;AAGP,IAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,QAAQ,EAAE,OAAO;AAAA,EACjB,sBAAsB;AAAA,IACpB,EAAE,OAAsC,CAAC,UAAU,OAAO,UAAU,UAAU;AAAA,EAChF;AAAA,EACA,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAMM,SAAS,oBAAoB,QAAuC;AACzE,MAAI,OAAO,aAAa,UAAa,OAAO,aAAa,GAAI,QAAO,OAAO;AAC3E,MACE,OAAO,cAAc,UACrB,OAAO,cAAc,MACrB,OAAO,WAAW,UAClB,OAAO,WAAW,IAClB;AACA,WAAO,WAAW,OAAO,SAAS,yBAAyB,OAAO,MAAM;AAAA,EAC1E;AACA,SAAO;AACT;AAEO,SAAS,cAAc,QAA6B;AACzD,QAAM,WAAW,oBAAoB,MAAM;AAC3C,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,sBAAsB,OAAO;AAAA,IAC7B,GAAI,OAAO,WAAW,SAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,IAC/D,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,IAC7C,GAAI,OAAO,uBAAuB,SAC9B,EAAE,oBAAoB,OAAO,mBAAmB,IAChD,CAAC;AAAA,IACL,GAAI,OAAO,cAAc,SAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,EAC1E;AACF;AAEO,SAAS,gBAAgB,QAAsC;AACpE,SAAO,uBAAuB,iBAAiB,MAAM;AACvD;;;ACtDO,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;;;AFgB3B,IAAM,cAAN,cAA0B,WAAW;AAAA,EACxB,OAAe,aAAa;AAAA,EAC5B,SAAiB;AAAA,EAC1B;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,QAAmB;AAC7B,UAAM,cAAc,MAAM,CAAC;AAC3B,SAAK,YAAY;AACjB,SAAK,SAAS,iBAAiB,MAAM,IAAI,GAAG,aAAa,GAAG;AAC5D,SAAK,cAAc,sBAAsB,MAAM,SAAS,GAAG,aAAa,GAAG;AAAA,EAC7E;AAAA,EAES,MAA+B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAyC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAES,WAAsC;AAC7C,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,gBAAgB,KAAK,SAAS;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAES,UAAU,QAAyC;AAC1D,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
|