@markusylisiurunen/tau 0.3.9 → 0.3.10

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.
Files changed (41) hide show
  1. package/README.md +37 -1
  2. package/dist/core/cli.js +3 -0
  3. package/dist/core/cli.js.map +1 -1
  4. package/dist/core/config/index.js +1 -1
  5. package/dist/core/config/index.js.map +1 -1
  6. package/dist/core/config/schema.js +68 -0
  7. package/dist/core/config/schema.js.map +1 -1
  8. package/dist/core/index.js +2 -0
  9. package/dist/core/index.js.map +1 -1
  10. package/dist/core/nook/cli.js +196 -0
  11. package/dist/core/nook/cli.js.map +1 -0
  12. package/dist/core/nook/client.js +164 -0
  13. package/dist/core/nook/client.js.map +1 -0
  14. package/dist/core/nook/deploy.js +116 -0
  15. package/dist/core/nook/deploy.js.map +1 -0
  16. package/dist/core/nook/index.js +5 -0
  17. package/dist/core/nook/index.js.map +1 -0
  18. package/dist/core/nook/setup.js +270 -0
  19. package/dist/core/nook/setup.js.map +1 -0
  20. package/dist/core/nook/validation.js +149 -0
  21. package/dist/core/nook/validation.js.map +1 -0
  22. package/dist/core/session/session_engine.js +20 -4
  23. package/dist/core/session/session_engine.js.map +1 -1
  24. package/dist/core/telegram/adapter.js +88 -5
  25. package/dist/core/telegram/adapter.js.map +1 -1
  26. package/dist/core/telegram/session_manager.js +11 -0
  27. package/dist/core/telegram/session_manager.js.map +1 -1
  28. package/dist/core/tools/catalog.js +2 -0
  29. package/dist/core/tools/catalog.js.map +1 -1
  30. package/dist/core/tools/nook.js +175 -0
  31. package/dist/core/tools/nook.js.map +1 -0
  32. package/dist/core/tools/tool_names.js +2 -0
  33. package/dist/core/tools/tool_names.js.map +1 -1
  34. package/dist/core/version.js +1 -1
  35. package/dist/core/version.js.map +1 -1
  36. package/dist/main.js +23 -1
  37. package/dist/main.js.map +1 -1
  38. package/dist/nook/README.md +96 -0
  39. package/dist/nook/worker/index.js +767 -0
  40. package/dist/nook/worker/index.js.map +1 -0
  41. package/package.json +3 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/core/nook/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAUD,SAAS,UAAU,CACjB,GAAW,EACX,IAAc,EACd,KAAa;IAEb,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,YAAY,CAAC,qBAAqB,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACjF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,YAAY,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAA8B,OAAO,CAAC,GAAG;IACrE,GAAG,CACD;QACE,QAAQ;QACR,kFAAkF;QAClF,oGAAoG;QACpG,kBAAkB;QAClB,kDAAkD;QAClD,iBAAiB;QACjB,0BAA0B;QAC1B,gCAAgC;QAChC,uCAAuC;QACvC,mCAAmC;QACnC,+CAA+C;KAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAc,EACd,OAA8B;IAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC;IAC7C,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACnC,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QAClE,aAAa,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACtE,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3F,MAAM,YAAY,CAAC;gBACjB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;gBACzC,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,MAAM;aACP,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,sBAAsB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACxE,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3F,MAAM,cAAc,CAAC;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;gBAC7C,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,MAAM;gBACN,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,0BAA0B,CAAC;YACxC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;QAEH,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QAED,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,eAAe,CAAC,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5E,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,UAAU,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACjF,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,IAAwB,CAAC;YAC7B,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,MAAM,UAAU,GAAa,EAAE,CAAC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;gBACrB,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;oBACvB,QAAQ,GAAG,IAAI,CAAC;oBAChB,SAAS;gBACX,CAAC;gBACD,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAClD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;oBACxC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;oBACpB,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;oBACrB,SAAS;gBACX,CAAC;gBACD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;gBACnE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;YACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC3E,CAAC;YACD,MAAM,KAAK,GAAG,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;YAC7F,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;gBACrC,IAAI;gBACJ,KAAK;gBACL,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;aAC5C,CAAC,CAAC;YACH,MAAM,CAAC,YAAY,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,GAAG,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,YAAY,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,IAAc,EACd,MAAqD,EACrD,MAA8B;IAE9B,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;IACjD,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAExD,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,UAAU,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IAED,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACvC,MAAM,CAAC,WAAW,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACjF,IAAI,MAA0B,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;YACrB,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACtD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACxC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;gBACtB,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;gBACrB,SAAS;YACX,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,yBAAyB,SAAS,GAAG,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,164 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { getNookAccessClientSecret } from "../config/index.js";
3
+ import { validateNookSiteSlug } from "./validation.js";
4
+ function bufferToArrayBuffer(buffer) {
5
+ const copy = new ArrayBuffer(buffer.byteLength);
6
+ new Uint8Array(copy).set(buffer);
7
+ return copy;
8
+ }
9
+ async function readDeployFileContent(file) {
10
+ if ("readContent" in file) {
11
+ return new Blob([bufferToArrayBuffer(await file.readContent())]);
12
+ }
13
+ return new Blob([bufferToArrayBuffer(readFileSync(file.absolutePath))]);
14
+ }
15
+ export class NookClient {
16
+ config;
17
+ env;
18
+ fetchImpl;
19
+ constructor(options) {
20
+ this.config = options.config;
21
+ this.env = options.env ?? process.env;
22
+ this.fetchImpl = options.fetchImpl ?? fetch;
23
+ }
24
+ baseUrl() {
25
+ return `https://${this.config.domain}`;
26
+ }
27
+ siteUrl(site) {
28
+ const validation = validateNookSiteSlug(site);
29
+ if (!validation.ok) {
30
+ throw new Error(validation.message);
31
+ }
32
+ return `https://${site}.${this.config.domain}`;
33
+ }
34
+ authHeaders() {
35
+ const secret = getNookAccessClientSecret(this.config, this.env);
36
+ if (!this.config.accessClientId || !secret) {
37
+ return {};
38
+ }
39
+ return {
40
+ "CF-Access-Client-Id": this.config.accessClientId,
41
+ "CF-Access-Client-Secret": secret,
42
+ };
43
+ }
44
+ async requestJson(url, init = {}) {
45
+ const response = await this.fetchImpl(url, {
46
+ ...init,
47
+ headers: {
48
+ ...this.authHeaders(),
49
+ ...(init.body !== undefined ? { "content-type": "application/json" } : {}),
50
+ ...init.headers,
51
+ },
52
+ });
53
+ if (!response.ok) {
54
+ throw new Error(await formatNookHttpError(response));
55
+ }
56
+ if (response.status === 204) {
57
+ return undefined;
58
+ }
59
+ return (await response.json());
60
+ }
61
+ async readSkill() {
62
+ const response = await this.fetchImpl(`${this.baseUrl()}/__nook/skill`, {
63
+ headers: this.authHeaders(),
64
+ });
65
+ if (!response.ok) {
66
+ throw new Error(await formatNookHttpError(response));
67
+ }
68
+ return await response.text();
69
+ }
70
+ async listSites() {
71
+ const result = await this.requestJson(`${this.baseUrl()}/__nook/api/sites`);
72
+ return result.sites;
73
+ }
74
+ async deleteSite(site) {
75
+ const result = await this.requestJson(`${this.baseUrl()}/__nook/api/sites/${encodeURIComponent(site)}`, { method: "DELETE" });
76
+ return result;
77
+ }
78
+ async deploySite(args) {
79
+ const start = await this.requestJson(`${this.baseUrl()}/__nook/api/sites/${encodeURIComponent(args.site)}/deploy/start`, {
80
+ method: "POST",
81
+ body: JSON.stringify({
82
+ public: args.visibility === "public",
83
+ files: args.files.map(({ path, sizeBytes, contentType, sha256 }) => ({
84
+ path,
85
+ sizeBytes,
86
+ contentType,
87
+ sha256,
88
+ })),
89
+ }),
90
+ });
91
+ const filesByPath = new Map(args.files.map((file) => [file.path, file]));
92
+ for (const path of start.upload) {
93
+ const file = filesByPath.get(path);
94
+ if (!file) {
95
+ throw new Error(`worker requested unknown upload path '${path}'`);
96
+ }
97
+ const uploadUrl = `${this.baseUrl()}/__nook/api/sites/${encodeURIComponent(args.site)}/deploy/${encodeURIComponent(start.deploymentId)}/file?path=${encodeURIComponent(path)}`;
98
+ const response = await this.fetchImpl(uploadUrl, {
99
+ method: "PUT",
100
+ headers: {
101
+ ...this.authHeaders(),
102
+ "content-type": file.contentType,
103
+ "x-nook-deploy-token": start.token,
104
+ },
105
+ body: await readDeployFileContent(file),
106
+ });
107
+ if (!response.ok) {
108
+ throw new Error(await formatNookHttpError(response));
109
+ }
110
+ }
111
+ const finish = await this.requestJson(`${this.baseUrl()}/__nook/api/sites/${encodeURIComponent(args.site)}/deploy/${encodeURIComponent(start.deploymentId)}/finish`, {
112
+ method: "POST",
113
+ headers: { "x-nook-deploy-token": start.token },
114
+ });
115
+ return finish;
116
+ }
117
+ async getKv(site, key) {
118
+ const result = await this.requestJson(`${this.siteUrl(site)}/__nook/kv/${encodeURIComponent(key)}`);
119
+ return result.value;
120
+ }
121
+ async putKv(site, key, value) {
122
+ return await this.requestJson(`${this.siteUrl(site)}/__nook/kv/${encodeURIComponent(key)}`, {
123
+ method: "PUT",
124
+ body: JSON.stringify(value),
125
+ });
126
+ }
127
+ async deleteKv(site, key) {
128
+ return await this.requestJson(`${this.siteUrl(site)}/__nook/kv/${encodeURIComponent(key)}`, {
129
+ method: "DELETE",
130
+ });
131
+ }
132
+ async listKv(site, prefix) {
133
+ const url = new URL(`${this.siteUrl(site)}/__nook/kv`);
134
+ if (prefix) {
135
+ url.searchParams.set("prefix", prefix);
136
+ }
137
+ return await this.requestJson(url.toString());
138
+ }
139
+ }
140
+ export function createNookClientFromConfig(args) {
141
+ if (!args.config.nook) {
142
+ throw new Error("nook is not configured. add a nook block to Tau config.");
143
+ }
144
+ return new NookClient({
145
+ config: args.config.nook,
146
+ env: args.env,
147
+ fetchImpl: args.fetchImpl,
148
+ });
149
+ }
150
+ async function formatNookHttpError(response) {
151
+ const text = await response.text();
152
+ try {
153
+ const parsed = JSON.parse(text);
154
+ if (parsed.error?.message) {
155
+ return `nook request failed (${response.status} ${response.statusText}): ${parsed.error.message}`;
156
+ }
157
+ }
158
+ catch {
159
+ // fall through
160
+ }
161
+ const detail = text.trim();
162
+ return `nook request failed (${response.status} ${response.statusText})${detail ? `: ${detail}` : ""}`;
163
+ }
164
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/nook/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAyCvD,SAAS,mBAAmB,CAAC,MAAc;IACzC,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,IAA0B;IAC7D,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;QAC1B,OAAO,IAAI,IAAI,CAAC,CAAC,mBAAmB,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,IAAI,CAAC,CAAC,mBAAmB,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,OAAO,UAAU;IACJ,MAAM,CAAa;IACnB,GAAG,CAAoB;IACvB,SAAS,CAAe;IAEzC,YAAY,OAA0B;QACpC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,OAAO,WAAW,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,WAAW,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IACjD,CAAC;IAEO,WAAW;QACjB,MAAM,MAAM,GAAG,yBAAyB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3C,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO;YACL,qBAAqB,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;YACjD,yBAAyB,EAAE,MAAM;SAClC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,WAAW,CAAI,GAAW,EAAE,OAAoB,EAAE;QAC9D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;YACzC,GAAG,IAAI;YACP,OAAO,EAAE;gBACP,GAAG,IAAI,CAAC,WAAW,EAAE;gBACrB,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1E,GAAG,IAAI,CAAC,OAAO;aAChB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,SAAc,CAAC;QACxB,CAAC;QAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE;YACtE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,GAAG,IAAI,CAAC,OAAO,EAAE,mBAAmB,CACrC,CAAC;QACF,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,GAAG,IAAI,CAAC,OAAO,EAAE,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAChE,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAIhB;QACC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAIjC,GAAG,IAAI,CAAC,OAAO,EAAE,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACrF,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE,IAAI,CAAC,UAAU,KAAK,QAAQ;gBACpC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;oBACnE,IAAI;oBACJ,SAAS;oBACT,WAAW;oBACX,MAAM;iBACP,CAAC,CAAC;aACJ,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACzE,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,GAAG,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/K,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE;gBAC/C,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE;oBACP,GAAG,IAAI,CAAC,WAAW,EAAE;oBACrB,cAAc,EAAE,IAAI,CAAC,WAAW;oBAChC,qBAAqB,EAAE,KAAK,CAAC,KAAK;iBACnC;gBACD,IAAI,EAAE,MAAM,qBAAqB,CAAC,IAAI,CAAC;aACxC,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,GAAG,IAAI,CAAC,OAAO,EAAE,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAC7H;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,qBAAqB,EAAE,KAAK,CAAC,KAAK,EAAE;SAChD,CACF,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,GAAW;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAC7D,CAAC;QACF,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,GAAW,EAAE,KAAc;QACnD,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;YAC1F,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,IAAY,EACZ,GAAW;QAEX,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;YAC1F,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,MAAe;QACxC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvD,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChD,CAAC;CACF;AAED,MAAM,UAAU,0BAA0B,CAAC,IAI1C;IACC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,IAAI,UAAU,CAAC;QACpB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;QACxB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,QAAkB;IACnD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoD,CAAC;QACnF,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;YAC1B,OAAO,wBAAwB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACpG,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAO,wBAAwB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACzG,CAAC"}
@@ -0,0 +1,116 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readdirSync, readFileSync, statSync } from "node:fs";
3
+ import { extname, join, relative, resolve, sep } from "node:path";
4
+ import { assertVisibleNookRelativePath, normalizeNookAssetPath, validateNookManifest, } from "./validation.js";
5
+ const CONTENT_TYPES = {
6
+ ".css": "text/css; charset=utf-8",
7
+ ".gif": "image/gif",
8
+ ".html": "text/html; charset=utf-8",
9
+ ".ico": "image/x-icon",
10
+ ".jpeg": "image/jpeg",
11
+ ".jpg": "image/jpeg",
12
+ ".js": "application/javascript; charset=utf-8",
13
+ ".json": "application/json; charset=utf-8",
14
+ ".map": "application/json; charset=utf-8",
15
+ ".mjs": "application/javascript; charset=utf-8",
16
+ ".png": "image/png",
17
+ ".svg": "image/svg+xml",
18
+ ".txt": "text/plain; charset=utf-8",
19
+ ".wasm": "application/wasm",
20
+ ".webp": "image/webp",
21
+ };
22
+ function contentTypeForPath(path) {
23
+ return CONTENT_TYPES[extname(path).toLowerCase()] ?? "application/octet-stream";
24
+ }
25
+ function walkDirectory(dir, output) {
26
+ const entries = readdirSync(dir, { withFileTypes: true });
27
+ for (const entry of entries) {
28
+ if (entry.name.startsWith(".")) {
29
+ throw new Error(`hidden deploy path '${entry.name}' is not allowed`);
30
+ }
31
+ const entryPath = join(dir, entry.name);
32
+ if (entry.isSymbolicLink()) {
33
+ throw new Error(`symlink deploy path '${entryPath}' is not allowed`);
34
+ }
35
+ if (entry.isDirectory()) {
36
+ walkDirectory(entryPath, output);
37
+ continue;
38
+ }
39
+ if (entry.isFile()) {
40
+ output.push(entryPath);
41
+ }
42
+ }
43
+ }
44
+ export function buildNookDeployManifest(directory) {
45
+ const root = resolve(directory);
46
+ const stats = statSync(root);
47
+ if (!stats.isDirectory()) {
48
+ throw new Error(`deploy path is not a directory: ${directory}`);
49
+ }
50
+ const absoluteFiles = [];
51
+ walkDirectory(root, absoluteFiles);
52
+ const files = absoluteFiles.map((absolutePath) => {
53
+ const relativePath = relative(root, absolutePath);
54
+ assertVisibleNookRelativePath(relativePath);
55
+ const assetPath = normalizeNookAssetPath(`/${relativePath.split(sep).join("/")}`);
56
+ const content = readFileSync(absolutePath);
57
+ return {
58
+ path: assetPath,
59
+ absolutePath,
60
+ sizeBytes: content.length,
61
+ sha256: createHash("sha256").update(content).digest("hex"),
62
+ contentType: contentTypeForPath(assetPath),
63
+ };
64
+ });
65
+ validateNookManifest(files);
66
+ return files.sort((a, b) => a.path.localeCompare(b.path));
67
+ }
68
+ function joinBackendPath(dir, name) {
69
+ const trimmed = dir.replace(/\/+$/, "");
70
+ return trimmed ? `${trimmed}/${name}` : name;
71
+ }
72
+ async function walkBackendDirectory(args) {
73
+ const listed = await args.backend.listDir(args.dir);
74
+ for (const entry of listed.entries) {
75
+ if (entry.name.startsWith(".")) {
76
+ throw new Error(`hidden deploy path '${entry.name}' is not allowed`);
77
+ }
78
+ const backendPath = joinBackendPath(args.dir, entry.name);
79
+ const relativePath = args.relativeDir ? `${args.relativeDir}/${entry.name}` : entry.name;
80
+ if (entry.isSymlink) {
81
+ throw new Error(`symlink deploy path '${relativePath}' is not allowed`);
82
+ }
83
+ if (entry.isDirectory) {
84
+ await walkBackendDirectory({
85
+ backend: args.backend,
86
+ dir: backendPath,
87
+ relativeDir: relativePath,
88
+ output: args.output,
89
+ });
90
+ continue;
91
+ }
92
+ args.output.push({ backendPath, relativePath });
93
+ }
94
+ }
95
+ export async function buildNookDeployManifestFromBackend(backend, directory) {
96
+ const files = [];
97
+ await walkBackendDirectory({ backend, dir: directory, relativeDir: "", output: files });
98
+ const manifest = [];
99
+ for (const file of files) {
100
+ assertVisibleNookRelativePath(file.relativePath);
101
+ const assetPath = normalizeNookAssetPath(`/${file.relativePath}`);
102
+ const binary = await backend.readFileBinary(file.backendPath);
103
+ const content = Buffer.from(binary.content);
104
+ manifest.push({
105
+ path: assetPath,
106
+ backendPath: file.backendPath,
107
+ sizeBytes: content.length,
108
+ sha256: createHash("sha256").update(content).digest("hex"),
109
+ contentType: contentTypeForPath(assetPath),
110
+ readContent: async () => content,
111
+ });
112
+ }
113
+ validateNookManifest(manifest);
114
+ return manifest.sort((a, b) => a.path.localeCompare(b.path));
115
+ }
116
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/core/nook/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { NookCliError, printNookHelp, runNookCommand } from "./cli.js";
2
+ export { createNookClientFromConfig, NookClient } from "./client.js";
3
+ export { buildNookDeployManifest } from "./deploy.js";
4
+ export { NOOK_DEPLOY_LIMITS, NOOK_RESERVED_PATH_PREFIX, normalizeNookAssetPath, normalizeNookDomain, validateNookManifest, validateNookSiteSlug, } from "./validation.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/nook/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAOvE,OAAO,EAAE,0BAA0B,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErE,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,270 @@
1
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { dirname, join, relative } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { spawnWithCapture } from "../utils/spawn_capture.js";
6
+ import { normalizeNookDomain } from "./validation.js";
7
+ const WORKER_NAME = "tau-nook";
8
+ const R2_BUCKET = "tau-nook-assets";
9
+ async function runWrangler(args, options) {
10
+ const result = await spawnWithCapture("wrangler", args, {
11
+ cwd: options.cwd,
12
+ env: options.env,
13
+ stdio: ["ignore", "pipe", "pipe"],
14
+ captureOutput: "combined-and-split",
15
+ maxCaptureBytes: 1024 * 1024,
16
+ maxCaptureMode: "ignore",
17
+ maxCaptureStrategy: "tail",
18
+ });
19
+ if (result.exitCode !== 0) {
20
+ throw new Error(`wrangler ${args.join(" ")} failed:\n${result.output}`);
21
+ }
22
+ return (result.output ?? "").trim();
23
+ }
24
+ function requireWranglerAuth(env) {
25
+ if (!env.CLOUDFLARE_API_TOKEN?.trim()) {
26
+ throw new Error("CLOUDFLARE_API_TOKEN is required for non-interactive wrangler auth.");
27
+ }
28
+ }
29
+ function normalizeAccessTeamDomain(value) {
30
+ const normalized = value.trim().replace(/\/+$/, "");
31
+ let url;
32
+ try {
33
+ url = new URL(normalized);
34
+ }
35
+ catch {
36
+ throw new Error("Cloudflare Access team domain must be an HTTPS URL.");
37
+ }
38
+ if (url.protocol !== "https:" || url.pathname !== "/" || url.search || url.hash) {
39
+ throw new Error("Cloudflare Access team domain must be an HTTPS origin URL.");
40
+ }
41
+ return url.origin;
42
+ }
43
+ function bundledWorkerPath() {
44
+ return join(dirname(fileURLToPath(import.meta.url)), "../../nook/worker/index.js");
45
+ }
46
+ function writeWranglerProject(args) {
47
+ const workerPath = bundledWorkerPath();
48
+ const relativeWorker = relative(args.tempDir, workerPath).split("\\").join("/");
49
+ const wranglerConfig = {
50
+ name: WORKER_NAME,
51
+ main: relativeWorker,
52
+ compatibility_date: "2026-07-06",
53
+ workers_dev: false,
54
+ vars: {
55
+ NOOK_DOMAIN: args.domain,
56
+ NOOK_ACCESS_TEAM_DOMAIN: args.accessTeamDomain,
57
+ NOOK_ACCESS_AUD: args.accessAud,
58
+ },
59
+ r2_buckets: [
60
+ {
61
+ binding: "ASSETS",
62
+ bucket_name: R2_BUCKET,
63
+ },
64
+ ],
65
+ durable_objects: {
66
+ bindings: [
67
+ { name: "REGISTRY_DO", class_name: "RegistryDO" },
68
+ { name: "SITE_DO", class_name: "SiteDO" },
69
+ ],
70
+ },
71
+ migrations: [
72
+ {
73
+ tag: "v1",
74
+ new_sqlite_classes: ["RegistryDO", "SiteDO"],
75
+ },
76
+ ],
77
+ };
78
+ writeFileSync(join(args.tempDir, "wrangler.json"), JSON.stringify(wranglerConfig, null, 2), "utf-8");
79
+ }
80
+ export async function runNookSetup(args) {
81
+ const env = args.env ?? process.env;
82
+ const stdout = args.stdout ?? console.log;
83
+ requireWranglerAuth(env);
84
+ const tempDir = mkdtempSync(join(tmpdir(), "tau-nook-"));
85
+ try {
86
+ writeWranglerProject({
87
+ tempDir,
88
+ domain: args.domain,
89
+ accessTeamDomain: args.accessTeamDomain,
90
+ accessAud: args.accessAud,
91
+ });
92
+ try {
93
+ await runWrangler(["r2", "bucket", "create", R2_BUCKET], { env });
94
+ stdout(`created R2 bucket ${R2_BUCKET}`);
95
+ }
96
+ catch (error) {
97
+ stdout(`R2 bucket ${R2_BUCKET} already exists or could not be created: ${error.message}`);
98
+ }
99
+ await runWrangler(["deploy"], { cwd: tempDir, env });
100
+ stdout(`deployed Worker ${WORKER_NAME}`);
101
+ stdout("");
102
+ stdout("Configure DNS/routes for:");
103
+ stdout(` ${args.domain}`);
104
+ stdout(` *.${args.domain}`);
105
+ stdout("");
106
+ stdout("Configure Cloudflare Access for both hostnames with application audience:");
107
+ stdout(` ${args.accessAud}`);
108
+ stdout("");
109
+ stdout("Add this to Tau config after creating a Cloudflare Access service token:");
110
+ stdout(JSON.stringify({
111
+ nook: {
112
+ domain: args.domain,
113
+ accessClientId: "<cloudflare-access-client-id>",
114
+ accessClientSecretEnv: "NOOK_ACCESS_CLIENT_SECRET",
115
+ },
116
+ }, null, 2));
117
+ }
118
+ finally {
119
+ rmSync(tempDir, { recursive: true, force: true });
120
+ }
121
+ }
122
+ export async function runNookDestroy(args) {
123
+ if (!args.yes) {
124
+ throw new Error("tau nook destroy requires --yes.");
125
+ }
126
+ const env = args.env ?? process.env;
127
+ const stdout = args.stdout ?? console.log;
128
+ const fetchImpl = args.fetchImpl ?? fetch;
129
+ requireWranglerAuth(env);
130
+ try {
131
+ const cleanupResponse = await fetchImpl(`https://${args.domain}/__nook/api/destroy`, {
132
+ method: "POST",
133
+ headers: {
134
+ "CF-Access-Client-Id": args.accessClientId,
135
+ "CF-Access-Client-Secret": args.accessClientSecret,
136
+ },
137
+ });
138
+ if (!cleanupResponse.ok) {
139
+ throw new Error(await cleanupResponse.text());
140
+ }
141
+ stdout(`deleted Nook R2 objects and Durable Object data for ${args.domain}`);
142
+ }
143
+ catch (error) {
144
+ throw new Error(`failed to clean up Nook data through https://${args.domain}/__nook/api/destroy: ${error instanceof Error ? error.message : String(error)}`);
145
+ }
146
+ try {
147
+ await runWrangler(["delete", WORKER_NAME, "--force"], { env });
148
+ stdout(`deleted Worker ${WORKER_NAME}`);
149
+ }
150
+ catch (error) {
151
+ stdout(`Worker ${WORKER_NAME} was not deleted: ${error.message}`);
152
+ }
153
+ try {
154
+ await runWrangler(["r2", "bucket", "delete", R2_BUCKET], { env });
155
+ stdout(`deleted R2 bucket ${R2_BUCKET}`);
156
+ }
157
+ catch (error) {
158
+ stdout(`R2 bucket ${R2_BUCKET} was not deleted: ${error.message}`);
159
+ }
160
+ }
161
+ export function parseNookInfrastructureDomain(args) {
162
+ const remaining = [];
163
+ let domain = args.env?.NOOK_DOMAIN;
164
+ for (let i = 0; i < args.argv.length; i += 1) {
165
+ const arg = args.argv[i];
166
+ if (arg === "--domain" || arg.startsWith("--domain=")) {
167
+ const value = arg.includes("=") ? arg.slice("--domain=".length) : args.argv[++i];
168
+ if (!value) {
169
+ throw new Error("missing value for --domain");
170
+ }
171
+ domain = value;
172
+ continue;
173
+ }
174
+ remaining.push(arg);
175
+ }
176
+ if (!domain?.trim()) {
177
+ throw new Error("missing nook domain. pass --domain <domain> or set NOOK_DOMAIN.");
178
+ }
179
+ return {
180
+ domain: normalizeNookDomain(domain),
181
+ remaining,
182
+ };
183
+ }
184
+ export function parseNookSetupInputs(args) {
185
+ const parsedDomain = parseNookInfrastructureDomain({ argv: args.argv, env: args.env });
186
+ const remaining = [];
187
+ let accessTeamDomain = args.env?.NOOK_ACCESS_TEAM_DOMAIN;
188
+ let accessAud = args.env?.NOOK_ACCESS_AUD;
189
+ for (let i = 0; i < parsedDomain.remaining.length; i += 1) {
190
+ const arg = parsedDomain.remaining[i];
191
+ if (arg === "--access-team-domain" || arg.startsWith("--access-team-domain=")) {
192
+ const value = arg.includes("=")
193
+ ? arg.slice("--access-team-domain=".length)
194
+ : parsedDomain.remaining[++i];
195
+ if (!value)
196
+ throw new Error("missing value for --access-team-domain");
197
+ accessTeamDomain = value;
198
+ continue;
199
+ }
200
+ if (arg === "--access-aud" || arg.startsWith("--access-aud=")) {
201
+ const value = arg.includes("=")
202
+ ? arg.slice("--access-aud=".length)
203
+ : parsedDomain.remaining[++i];
204
+ if (!value)
205
+ throw new Error("missing value for --access-aud");
206
+ accessAud = value;
207
+ continue;
208
+ }
209
+ remaining.push(arg);
210
+ }
211
+ if (!accessTeamDomain?.trim()) {
212
+ throw new Error("missing Cloudflare Access team domain. pass --access-team-domain <url> or set NOOK_ACCESS_TEAM_DOMAIN.");
213
+ }
214
+ if (!accessAud?.trim()) {
215
+ throw new Error("missing Cloudflare Access application audience. pass --access-aud <aud> or set NOOK_ACCESS_AUD.");
216
+ }
217
+ return {
218
+ domain: parsedDomain.domain,
219
+ accessTeamDomain: normalizeAccessTeamDomain(accessTeamDomain),
220
+ accessAud: accessAud.trim(),
221
+ remaining,
222
+ };
223
+ }
224
+ export function parseNookDestroyInputs(args) {
225
+ const parsedDomain = parseNookInfrastructureDomain({ argv: args.argv, env: args.env });
226
+ const remaining = [];
227
+ let accessClientId = args.env?.NOOK_ACCESS_CLIENT_ID;
228
+ let accessClientSecret = args.env?.NOOK_ACCESS_CLIENT_SECRET;
229
+ let yes = false;
230
+ for (let i = 0; i < parsedDomain.remaining.length; i += 1) {
231
+ const arg = parsedDomain.remaining[i];
232
+ if (arg === "--yes") {
233
+ yes = true;
234
+ continue;
235
+ }
236
+ if (arg === "--access-client-id" || arg.startsWith("--access-client-id=")) {
237
+ const value = arg.includes("=")
238
+ ? arg.slice("--access-client-id=".length)
239
+ : parsedDomain.remaining[++i];
240
+ if (!value)
241
+ throw new Error("missing value for --access-client-id");
242
+ accessClientId = value;
243
+ continue;
244
+ }
245
+ if (arg === "--access-client-secret" || arg.startsWith("--access-client-secret=")) {
246
+ const value = arg.includes("=")
247
+ ? arg.slice("--access-client-secret=".length)
248
+ : parsedDomain.remaining[++i];
249
+ if (!value)
250
+ throw new Error("missing value for --access-client-secret");
251
+ accessClientSecret = value;
252
+ continue;
253
+ }
254
+ remaining.push(arg);
255
+ }
256
+ if (!accessClientId?.trim()) {
257
+ throw new Error("missing Cloudflare Access client id. pass --access-client-id <id> or set NOOK_ACCESS_CLIENT_ID.");
258
+ }
259
+ if (!accessClientSecret?.trim()) {
260
+ throw new Error("missing Cloudflare Access client secret. pass --access-client-secret <secret> or set NOOK_ACCESS_CLIENT_SECRET.");
261
+ }
262
+ return {
263
+ domain: parsedDomain.domain,
264
+ accessClientId: accessClientId.trim(),
265
+ accessClientSecret: accessClientSecret.trim(),
266
+ yes,
267
+ remaining,
268
+ };
269
+ }
270
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/core/nook/setup.ts"],"names":[],"mappings":"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"}