arcrun 1.1.0 → 1.3.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.
Files changed (62) hide show
  1. package/dist/commands/config.d.ts +4 -0
  2. package/dist/commands/config.d.ts.map +1 -0
  3. package/dist/commands/config.js +39 -0
  4. package/dist/commands/config.js.map +1 -0
  5. package/dist/commands/creds.d.ts.map +1 -1
  6. package/dist/commands/creds.js +21 -3
  7. package/dist/commands/creds.js.map +1 -1
  8. package/dist/commands/init.d.ts +5 -2
  9. package/dist/commands/init.d.ts.map +1 -1
  10. package/dist/commands/init.js +154 -19
  11. package/dist/commands/init.js.map +1 -1
  12. package/dist/commands/install-harness.d.ts +2 -0
  13. package/dist/commands/install-harness.d.ts.map +1 -0
  14. package/dist/commands/install-harness.js +122 -0
  15. package/dist/commands/install-harness.js.map +1 -0
  16. package/dist/commands/mcp-setup.d.ts +12 -0
  17. package/dist/commands/mcp-setup.d.ts.map +1 -0
  18. package/dist/commands/mcp-setup.js +42 -0
  19. package/dist/commands/mcp-setup.js.map +1 -0
  20. package/dist/commands/push.d.ts.map +1 -1
  21. package/dist/commands/push.js +42 -11
  22. package/dist/commands/push.js.map +1 -1
  23. package/dist/commands/recipe.d.ts.map +1 -1
  24. package/dist/commands/recipe.js +63 -1
  25. package/dist/commands/recipe.js.map +1 -1
  26. package/dist/commands/update.d.ts +13 -0
  27. package/dist/commands/update.d.ts.map +1 -0
  28. package/dist/commands/update.js +89 -0
  29. package/dist/commands/update.js.map +1 -0
  30. package/dist/commands/validate.js +2 -2
  31. package/dist/commands/validate.js.map +1 -1
  32. package/dist/index.js +43 -2
  33. package/dist/index.js.map +1 -1
  34. package/dist/lib/api-recipe-seeds.d.ts +32 -0
  35. package/dist/lib/api-recipe-seeds.d.ts.map +1 -0
  36. package/dist/lib/api-recipe-seeds.js +108 -0
  37. package/dist/lib/api-recipe-seeds.js.map +1 -0
  38. package/dist/lib/cf-api.d.ts +22 -0
  39. package/dist/lib/cf-api.d.ts.map +1 -1
  40. package/dist/lib/cf-api.js +58 -0
  41. package/dist/lib/cf-api.js.map +1 -1
  42. package/dist/lib/config.d.ts +34 -1
  43. package/dist/lib/config.d.ts.map +1 -1
  44. package/dist/lib/config.js +176 -8
  45. package/dist/lib/config.js.map +1 -1
  46. package/dist/lib/deploy.d.ts +56 -0
  47. package/dist/lib/deploy.d.ts.map +1 -0
  48. package/dist/lib/deploy.js +239 -0
  49. package/dist/lib/deploy.js.map +1 -0
  50. package/dist/lib/exposure-warning.d.ts +25 -0
  51. package/dist/lib/exposure-warning.d.ts.map +1 -0
  52. package/dist/lib/exposure-warning.js +92 -0
  53. package/dist/lib/exposure-warning.js.map +1 -0
  54. package/dist/lib/yaml-parser.d.ts.map +1 -1
  55. package/dist/lib/yaml-parser.js +7 -1
  56. package/dist/lib/yaml-parser.js.map +1 -1
  57. package/harness/CLAUDE.block.md +15 -0
  58. package/harness/commands/arcrun.md +29 -0
  59. package/harness/hooks/arcrun-guard.sh +54 -0
  60. package/harness/settings.fragment.json +16 -0
  61. package/harness/skills/arcrun-mindset/SKILL.md +78 -0
  62. package/package.json +5 -4
@@ -0,0 +1,108 @@
1
+ /**
2
+ * api-recipe-seeds.ts
3
+ *
4
+ * 現役 API recipe 的種子定義。self-host 新帳號 init 時把這些灌進空的 RECIPES KV
5
+ * (透過 cypher-executor 的 POST /recipes,或 CF KV REST API 直接寫)。
6
+ *
7
+ * API recipe = http_request + 固定設定(endpoint/method 模板)。
8
+ * 不需 deploy Worker,cypher-executor 執行時直接 fetch(見 cypher-executor/src/routes/recipes.ts)。
9
+ *
10
+ * 放在 CLI 端而非 cypher-executor/src:
11
+ * - seed 資料是「installer 要灌進用戶 KV 的種子」,本就屬 CLI 職責(SDD self-hosted-init.md §4)。
12
+ * - rule 02 §2.2 hook 擋 cypher-executor TS hard-code API endpoint;seed 的 endpoint 是資料欄位,
13
+ * 放 CLI 端避開誤判,也更符合職責切分。
14
+ *
15
+ * 來源:2026-06-01 從 prod cypher.arcrun.dev/recipes 逐一查得的現役定義。
16
+ * 對應 SDD:.agents/specs/arcrun/sdk-and-website/self-hosted-init.md §5
17
+ *
18
+ * KBDB recipe(kbdb_*)採 Supabase 模式(richblack 2026-06-02):
19
+ * 進 seed = 展示能力(引子)。使用者要用 → 去 arcrun 取統一 API Key 當 credential。
20
+ * FOLLOW-UP(KBDB 端):endpoint 現為 kbdb.finally.click,KBDB 應改用統一對外網址;
21
+ * KBDB 改網址後同步更新此處。seed 先照現況進。
22
+ */
23
+ export const API_RECIPE_SEEDS = [
24
+ // ── KBDB(Supabase 模式,auth_service=kbdb static_key)──
25
+ {
26
+ canonical_id: 'kbdb_get',
27
+ display_name: 'KBDB Get',
28
+ description: 'GET 讀取 block / 查詢。_path 帶查詢路徑。auth: kbdb static_key。',
29
+ endpoint: 'https://kbdb.finally.click{{_path}}',
30
+ method: 'GET',
31
+ auth_service: 'kbdb',
32
+ },
33
+ {
34
+ canonical_id: 'kbdb_create_block',
35
+ display_name: 'KBDB Create Block',
36
+ description: 'POST /blocks 建立 block。body 帶 block 欄位(content/type/page_name/source/user_id 等)。auth: kbdb static_key。',
37
+ endpoint: 'https://kbdb.finally.click/blocks',
38
+ method: 'POST',
39
+ auth_service: 'kbdb',
40
+ },
41
+ {
42
+ canonical_id: 'kbdb_patch_block',
43
+ display_name: 'KBDB Patch Block',
44
+ description: 'PATCH /blocks/:id 局部更新。_path 帶 /blocks/{id},body 帶要改的欄位。auth: kbdb static_key。',
45
+ endpoint: 'https://kbdb.finally.click{{_path}}',
46
+ method: 'PATCH',
47
+ auth_service: 'kbdb',
48
+ },
49
+ {
50
+ canonical_id: 'kbdb_delete',
51
+ display_name: 'KBDB Delete',
52
+ description: 'DELETE /blocks/:id 刪除 block。_path 帶 /blocks/{id}。auth: kbdb static_key。',
53
+ endpoint: 'https://kbdb.finally.click{{_path}}',
54
+ method: 'DELETE',
55
+ auth_service: 'kbdb',
56
+ },
57
+ {
58
+ canonical_id: 'kbdb_ingest',
59
+ display_name: 'KBDB Ingest',
60
+ description: 'POST /blocks/ingest 批次寫入。body 帶 input。auth: kbdb static_key。',
61
+ endpoint: 'https://kbdb.finally.click/blocks/ingest',
62
+ method: 'POST',
63
+ auth_service: 'kbdb',
64
+ },
65
+ // ── Google(service_account)──
66
+ {
67
+ canonical_id: 'gmail_send',
68
+ display_name: 'Gmail Send',
69
+ description: '寄 Gmail。POST messages/send,body 帶 raw(base64url MIME)。auth: google service_account。',
70
+ endpoint: 'https://gmail.googleapis.com/gmail/v1/users/me/messages/send',
71
+ method: 'POST',
72
+ auth_service: 'google_gmail_sa',
73
+ },
74
+ {
75
+ canonical_id: 'google_sheets_append',
76
+ display_name: 'Google Sheets Append',
77
+ description: '寫 Sheets。PUT values?valueInputOption=RAW,body 帶 values。auth: google service_account。',
78
+ endpoint: 'https://sheets.googleapis.com{{_path}}',
79
+ method: 'PUT',
80
+ auth_service: 'google_sheets_sa',
81
+ },
82
+ {
83
+ canonical_id: 'google_sheets_read',
84
+ display_name: 'Google Sheets Read',
85
+ description: '讀 Sheets。GET values。_path 帶完整路徑。auth: google service_account。',
86
+ endpoint: 'https://sheets.googleapis.com{{_path}}',
87
+ method: 'GET',
88
+ auth_service: 'google_sheets_sa',
89
+ },
90
+ // ── 訊息(static_key)──
91
+ {
92
+ canonical_id: 'telegram_send',
93
+ display_name: 'Telegram Send',
94
+ description: 'Telegram sendMessage。token 在 URL path({{auth.bot_token}}),body 帶 chat_id+text。auth: static_key path 注入。',
95
+ endpoint: 'https://api.telegram.org/bot{{auth.bot_token}}/sendMessage',
96
+ method: 'POST',
97
+ auth_service: 'telegram',
98
+ },
99
+ {
100
+ canonical_id: 'line_notify_send',
101
+ display_name: 'LINE Notify',
102
+ description: 'LINE Notify 推訊息。POST notify,body 帶 message(form-urlencoded)。auth: static_key Bearer line token。',
103
+ endpoint: 'https://notify-api.line.me/api/notify',
104
+ method: 'POST',
105
+ auth_service: 'line_notify',
106
+ },
107
+ ];
108
+ //# sourceMappingURL=api-recipe-seeds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-recipe-seeds.js","sourceRoot":"","sources":["../../src/lib/api-recipe-seeds.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAWH,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,sDAAsD;IACtD;QACE,YAAY,EAAE,UAAU;QACxB,YAAY,EAAE,UAAU;QACxB,WAAW,EAAE,sDAAsD;QACnE,QAAQ,EAAE,qCAAqC;QAC/C,MAAM,EAAE,KAAK;QACb,YAAY,EAAE,MAAM;KACrB;IACD;QACE,YAAY,EAAE,mBAAmB;QACjC,YAAY,EAAE,mBAAmB;QACjC,WAAW,EAAE,uGAAuG;QACpH,QAAQ,EAAE,mCAAmC;QAC7C,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,MAAM;KACrB;IACD;QACE,YAAY,EAAE,kBAAkB;QAChC,YAAY,EAAE,kBAAkB;QAChC,WAAW,EAAE,gFAAgF;QAC7F,QAAQ,EAAE,qCAAqC;QAC/C,MAAM,EAAE,OAAO;QACf,YAAY,EAAE,MAAM;KACrB;IACD;QACE,YAAY,EAAE,aAAa;QAC3B,YAAY,EAAE,aAAa;QAC3B,WAAW,EAAE,yEAAyE;QACtF,QAAQ,EAAE,qCAAqC;QAC/C,MAAM,EAAE,QAAQ;QAChB,YAAY,EAAE,MAAM;KACrB;IACD;QACE,YAAY,EAAE,aAAa;QAC3B,YAAY,EAAE,aAAa;QAC3B,WAAW,EAAE,8DAA8D;QAC3E,QAAQ,EAAE,0CAA0C;QACpD,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,MAAM;KACrB;IAED,+BAA+B;IAC/B;QACE,YAAY,EAAE,YAAY;QAC1B,YAAY,EAAE,YAAY;QAC1B,WAAW,EAAE,qFAAqF;QAClG,QAAQ,EAAE,8DAA8D;QACxE,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,iBAAiB;KAChC;IACD;QACE,YAAY,EAAE,sBAAsB;QACpC,YAAY,EAAE,sBAAsB;QACpC,WAAW,EAAE,sFAAsF;QACnG,QAAQ,EAAE,wCAAwC;QAClD,MAAM,EAAE,KAAK;QACb,YAAY,EAAE,kBAAkB;KACjC;IACD;QACE,YAAY,EAAE,oBAAoB;QAClC,YAAY,EAAE,oBAAoB;QAClC,WAAW,EAAE,+DAA+D;QAC5E,QAAQ,EAAE,wCAAwC;QAClD,MAAM,EAAE,KAAK;QACb,YAAY,EAAE,kBAAkB;KACjC;IAED,sBAAsB;IACtB;QACE,YAAY,EAAE,eAAe;QAC7B,YAAY,EAAE,eAAe;QAC7B,WAAW,EAAE,yGAAyG;QACtH,QAAQ,EAAE,4DAA4D;QACtE,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,UAAU;KACzB;IACD;QACE,YAAY,EAAE,kBAAkB;QAChC,YAAY,EAAE,aAAa;QAC3B,WAAW,EAAE,iGAAiG;QAC9G,QAAQ,EAAE,uCAAuC;QACjD,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,aAAa;KAC5B;CACF,CAAC"}
@@ -20,6 +20,28 @@ export declare class CfKvClient {
20
20
  }>>;
21
21
  delete(key: string): Promise<void>;
22
22
  }
23
+ /**
24
+ * Cloudflare Account-level API wrapper(self-hosted installer 用)。
25
+ *
26
+ * 負責 acr init --self-hosted 的資源建立:驗 token、建/列 KV namespace、查 workers.dev subdomain。
27
+ * (不建 R2:R2 是 dead storage 且綁卡違背開源免費;見 init.ts step 2 + registry-canon Phase 1.5。)
28
+ * 與 CfKvClient(綁單一 namespace 的 KV 操作)職責不同——這個是帳號層級的資源管理。
29
+ * 對應 SDD:.agents/specs/arcrun/sdk-and-website/self-hosted-init.md §3 step 1-2
30
+ */
31
+ export declare class CfAccountClient {
32
+ private accountBase;
33
+ private headers;
34
+ constructor(accountId: string, apiToken: string);
35
+ private cf;
36
+ /** 驗證 token 能存取此 account(權限不足會在後續建立操作報錯,這裡先確認 account 可達)。*/
37
+ verifyAccess(): Promise<void>;
38
+ /** 列出現有 KV namespace(冪等用:已存在就重用,不重建)。回傳 title → id 對照。*/
39
+ listKvNamespaces(): Promise<Map<string, string>>;
40
+ /** 建立 KV namespace(若同名已存在則回傳既有 id,冪等)。*/
41
+ ensureKvNamespace(title: string, existing?: Map<string, string>): Promise<string>;
42
+ /** 查 workers.dev subdomain(cypher-executor WORKER_SUBDOMAIN 用,組對內 component URL)。*/
43
+ getWorkersSubdomain(): Promise<string>;
44
+ }
23
45
  /** AES-GCM 加密 credential(與 cypher-executor credential-injector 解密邏輯對應)*/
24
46
  export declare function encryptCredential(value: string, encryptionKey: string): Promise<string>;
25
47
  //# sourceMappingURL=cf-api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cf-api.d.ts","sourceRoot":"","sources":["../../src/lib/cf-api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,OAAO,CAAyB;gBAE5B,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,iBAAiB;IAQ7D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAYxC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAgBhG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUzC;AAED,yEAAyE;AACzE,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyB7F"}
1
+ {"version":3,"file":"cf-api.d.ts","sourceRoot":"","sources":["../../src/lib/cf-api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,OAAO,CAAyB;gBAE5B,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,iBAAiB;IAQ7D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAYxC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAgBhG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUzC;AAED;;;;;;;GAOG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAyB;gBAE5B,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;YAQjC,EAAE;IAehB,6DAA6D;IACvD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAKnC,yDAAyD;IACnD,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAStD,yCAAyC;IACnC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAYvF,oFAAoF;IAC9E,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;CAI7C;AAED,yEAAyE;AACzE,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyB7F"}
@@ -60,6 +60,64 @@ export class CfKvClient {
60
60
  }
61
61
  }
62
62
  }
63
+ /**
64
+ * Cloudflare Account-level API wrapper(self-hosted installer 用)。
65
+ *
66
+ * 負責 acr init --self-hosted 的資源建立:驗 token、建/列 KV namespace、查 workers.dev subdomain。
67
+ * (不建 R2:R2 是 dead storage 且綁卡違背開源免費;見 init.ts step 2 + registry-canon Phase 1.5。)
68
+ * 與 CfKvClient(綁單一 namespace 的 KV 操作)職責不同——這個是帳號層級的資源管理。
69
+ * 對應 SDD:.agents/specs/arcrun/sdk-and-website/self-hosted-init.md §3 step 1-2
70
+ */
71
+ export class CfAccountClient {
72
+ accountBase;
73
+ headers;
74
+ constructor(accountId, apiToken) {
75
+ this.accountBase = `${CF_API_BASE}/accounts/${accountId}`;
76
+ this.headers = {
77
+ 'Authorization': `Bearer ${apiToken}`,
78
+ 'Content-Type': 'application/json',
79
+ };
80
+ }
81
+ async cf(path, init) {
82
+ const res = await fetch(`${this.accountBase}${path}`, {
83
+ ...init,
84
+ headers: { ...this.headers, ...(init?.headers ?? {}) },
85
+ });
86
+ const data = await res.json().catch(() => null);
87
+ if (!res.ok || !data?.success) {
88
+ const msg = data?.errors?.map(e => e.message).join('; ') ?? `HTTP ${res.status}`;
89
+ throw new Error(`CF API ${path} 失敗:${msg}`);
90
+ }
91
+ return data.result;
92
+ }
93
+ /** 驗證 token 能存取此 account(權限不足會在後續建立操作報錯,這裡先確認 account 可達)。*/
94
+ async verifyAccess() {
95
+ // GET /accounts/{id} 能通 = token 有此 account 的基本讀權限
96
+ await this.cf('');
97
+ }
98
+ /** 列出現有 KV namespace(冪等用:已存在就重用,不重建)。回傳 title → id 對照。*/
99
+ async listKvNamespaces() {
100
+ const result = await this.cf('/storage/kv/namespaces?per_page=100');
101
+ const map = new Map();
102
+ for (const ns of result)
103
+ map.set(ns.title, ns.id);
104
+ return map;
105
+ }
106
+ /** 建立 KV namespace(若同名已存在則回傳既有 id,冪等)。*/
107
+ async ensureKvNamespace(title, existing) {
108
+ const known = existing ?? (await this.listKvNamespaces());
109
+ const found = known.get(title);
110
+ if (found)
111
+ return found;
112
+ const result = await this.cf('/storage/kv/namespaces', { method: 'POST', body: JSON.stringify({ title }) });
113
+ return result.id;
114
+ }
115
+ /** 查 workers.dev subdomain(cypher-executor WORKER_SUBDOMAIN 用,組對內 component URL)。*/
116
+ async getWorkersSubdomain() {
117
+ const result = await this.cf('/workers/subdomain');
118
+ return result.subdomain;
119
+ }
120
+ }
63
121
  /** AES-GCM 加密 credential(與 cypher-executor credential-injector 解密邏輯對應)*/
64
122
  export async function encryptCredential(value, encryptionKey) {
65
123
  if (!encryptionKey || encryptionKey.length < 64) {
@@ -1 +1 @@
1
- {"version":3,"file":"cf-api.js","sourceRoot":"","sources":["../../src/lib/cf-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cf-api.js","sourceRoot":"","sources":["../../src/lib/cf-api.ts"],"names":[],"mappings":"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"}
@@ -8,11 +8,44 @@ export interface ArcrunConfig {
8
8
  cypher_executor_url?: string;
9
9
  credentials_kv_namespace_id?: string;
10
10
  webhooks_kv_namespace_id?: string;
11
- wasm_bucket?: string;
11
+ mcp_url?: string;
12
12
  multi_tenant?: boolean;
13
+ exposure_consented?: Record<string, {
14
+ confirmed_at: string;
15
+ suppress_future?: boolean;
16
+ }>;
13
17
  }
18
+ /** 專案層設定檔名(就近往上找)。含憑證 → 必須 gitignore(見 createCredentialsYamlIfMissing)。*/
19
+ export declare const PROJECT_CONFIG_NAME = ".arcrun.yaml";
20
+ /** 設定來源層級(acr config --where 用,讓使用者知道每個值來自哪一層,避免用錯帳號)。*/
21
+ export type ConfigSource = 'env' | 'project' | 'global' | 'default';
22
+ /**
23
+ * 平台預設 MCP URL(mcp_url 未設時的 fallback,SaaS 用戶用)。
24
+ * MCP 搬進 arcrun 主庫後改用 arcrun.dev zone(mcp/wrangler.toml route = mcp.arcrun.dev)。
25
+ */
26
+ export declare const DEFAULT_MCP_URL = "https://mcp.arcrun.dev";
14
27
  export declare function configExists(): boolean;
28
+ /** 從 startDir 就近往上逐層找專案層 .arcrun.yaml,回傳第一個命中的路徑(停在檔案系統根)。*/
29
+ export declare function findProjectConfig(startDir?: string): string | undefined;
30
+ /**
31
+ * 三層分層解析:全域 → 疊專案層 → 疊 env(欄位級 merge,高層只覆蓋它提供的欄位)。
32
+ * 任一層都沒有 mode 時 fallback 'local',讓 validate --offline 等在無設定下可運作。
33
+ */
15
34
  export declare function loadConfig(): ArcrunConfig;
35
+ /** 解析每個關鍵欄位的最終值與來源層(acr config --where 用)。*/
36
+ export declare function resolveConfigSources(): Array<{
37
+ field: keyof ArcrunConfig;
38
+ value: string;
39
+ source: ConfigSource;
40
+ }>;
41
+ /** 回傳本次解析實際採用的專案層設定檔路徑(無則 undefined)。acr config --where 顯示用。*/
42
+ export declare function activeProjectConfigPath(): string | undefined;
16
43
  export declare function saveConfig(config: ArcrunConfig): void;
17
44
  export declare function getCypherExecutorUrl(config: ArcrunConfig): string;
45
+ /**
46
+ * 取得 MCP server URL(薄殼原則:與 cypher_url 同一份 config 解析)。
47
+ * config 有 mcp_url(env/專案/全域 任一層)→ 用它;否則 fallback 平台預設。
48
+ * acr mcp-setup 用此決定要寫進專案 .mcp.json 的 URL → 切資料夾自動切 MCP。
49
+ */
50
+ export declare function getMcpUrl(config: ArcrunConfig): string;
18
51
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,aAAa,CAAC;IAE3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAKD,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,UAAU,IAAI,YAAY,CAOzC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAGrD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAKjE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,aAAa,CAAC;IAE3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAOlC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IAIvB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC1F;AAKD,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD,yDAAyD;AACzD,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAoBpE;;;GAGG;AACH,eAAO,MAAM,eAAe,2BAA2B,CAAC;AAExD,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,SAAS,CAatF;AAoED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,YAAY,CAQzC;AAED,6CAA6C;AAC7C,wBAAgB,oBAAoB,IAAI,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC,CAoBhH;AAED,+DAA+D;AAC/D,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,SAAS,CAE5D;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAGrD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAKjE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAEtD"}
@@ -1,22 +1,182 @@
1
1
  /**
2
- * CLI 設定檔管理(~/.arcrun/config.yaml
2
+ * CLI 設定檔管理 — 三層分層解析(SDD: sdk-and-website/config-layering.md
3
+ * 優先序:env 變數 > 專案層 .arcrun.yaml(就近往上找)> 全域 ~/.arcrun/config.yaml
4
+ * 解壓測 #7(AI/CI 非互動)+ #8(接案多帳號),仿 git config / Claude Code MCP 模式。
3
5
  */
4
6
  import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
5
7
  import { homedir } from 'node:os';
6
- import { join } from 'node:path';
8
+ import { join, dirname, parse as parsePath } from 'node:path';
7
9
  import yaml from 'js-yaml';
8
10
  const CONFIG_DIR = join(homedir(), '.arcrun');
9
11
  const CONFIG_PATH = join(CONFIG_DIR, 'config.yaml');
12
+ /** 專案層設定檔名(就近往上找)。含憑證 → 必須 gitignore(見 createCredentialsYamlIfMissing)。*/
13
+ export const PROJECT_CONFIG_NAME = '.arcrun.yaml';
14
+ /** env 變數 → config 欄位映射(最高層覆蓋)。CF 兩個沿用 wrangler 慣用名,CI 設一次兩邊通用。*/
15
+ const ENV_MAP = {
16
+ ARCRUN_MODE: 'mode',
17
+ // NAMESPACE / ARCRUN_NAMESPACE:self-hosted 單租戶的資料分區標籤(明碼,用戶自填)。
18
+ // 沿用 api_key 欄位 + 路徑(KV key 前綴 {api_key}:cred:{name}),故 self-hosted 無需平台發 api_key。
19
+ // 這是「分區標籤」非「認證密碼」:你的 cypher 在你自己的 CF,無「別人」會冒用;
20
+ // 要防外部呼叫請對 webhook 加保護(mindset §6)。SaaS 仍走 register 發的真 api_key(同一條路徑,不分叉)。
21
+ NAMESPACE: 'api_key',
22
+ ARCRUN_NAMESPACE: 'api_key',
23
+ ARCRUN_API_KEY: 'api_key',
24
+ ARCRUN_ENCRYPTION_KEY: 'encryption_key',
25
+ ENCRYPTION_KEY: 'encryption_key',
26
+ ARCRUN_CYPHER_EXECUTOR_URL: 'cypher_executor_url',
27
+ ARCRUN_MCP_URL: 'mcp_url',
28
+ CLOUDFLARE_ACCOUNT_ID: 'cloudflare_account_id',
29
+ CLOUDFLARE_API_TOKEN: 'cf_api_token',
30
+ };
31
+ /**
32
+ * 平台預設 MCP URL(mcp_url 未設時的 fallback,SaaS 用戶用)。
33
+ * MCP 搬進 arcrun 主庫後改用 arcrun.dev zone(mcp/wrangler.toml route = mcp.arcrun.dev)。
34
+ */
35
+ export const DEFAULT_MCP_URL = 'https://mcp.arcrun.dev';
10
36
  export function configExists() {
11
- return existsSync(CONFIG_PATH);
37
+ return existsSync(CONFIG_PATH) || findProjectConfig() !== undefined;
38
+ }
39
+ /** 從 startDir 就近往上逐層找專案層 .arcrun.yaml,回傳第一個命中的路徑(停在檔案系統根)。*/
40
+ export function findProjectConfig(startDir = process.cwd()) {
41
+ let dir = startDir;
42
+ const root = parsePath(dir).root;
43
+ // 防呆上界:層數不會無限(root 一定到得了),但仍加保險避免異常路徑死迴圈。
44
+ for (let i = 0; i < 256; i++) {
45
+ const candidate = join(dir, PROJECT_CONFIG_NAME);
46
+ if (existsSync(candidate))
47
+ return candidate;
48
+ if (dir === root)
49
+ break;
50
+ const parent = dirname(dir);
51
+ if (parent === dir)
52
+ break;
53
+ dir = parent;
54
+ }
55
+ return undefined;
56
+ }
57
+ /** 讀全域設定(不分層)。無檔回 undefined。*/
58
+ function readGlobalConfig() {
59
+ if (!existsSync(CONFIG_PATH))
60
+ return undefined;
61
+ return yaml.load(readFileSync(CONFIG_PATH, 'utf8')) ?? undefined;
62
+ }
63
+ /** 讀專案層設定(不分層)。無檔回 undefined。*/
64
+ function readProjectConfig() {
65
+ const path = findProjectConfig();
66
+ if (!path)
67
+ return undefined;
68
+ return yaml.load(readFileSync(path, 'utf8')) ?? undefined;
69
+ }
70
+ /**
71
+ * 載入 .env(就近往上找,同 .arcrun.yaml)到 process.env,讓用戶照 Node/Python 慣例
72
+ * 在 .env 設 NAMESPACE / ENCRYPTION_KEY 等即生效。不覆蓋「已存在於 shell」的 env(shell > .env)。
73
+ * 自己解析(不引入 dotenv 依賴)。只認單純 KEY=VALUE,忽略空行/註解/引號。
74
+ */
75
+ let _envFileLoaded = false;
76
+ function loadDotEnvOnce() {
77
+ if (_envFileLoaded)
78
+ return;
79
+ _envFileLoaded = true;
80
+ // 從 cwd 就近往上找 .env(停在含 .arcrun.yaml 的專案根或檔案系統根)
81
+ let dir = process.cwd();
82
+ const root = parsePath(dir).root;
83
+ for (let i = 0; i < 256; i++) {
84
+ const candidate = join(dir, '.env');
85
+ if (existsSync(candidate)) {
86
+ try {
87
+ for (const rawLine of readFileSync(candidate, 'utf8').split('\n')) {
88
+ const line = rawLine.trim();
89
+ if (!line || line.startsWith('#'))
90
+ continue;
91
+ const eq = line.indexOf('=');
92
+ if (eq < 1)
93
+ continue;
94
+ const k = line.slice(0, eq).trim();
95
+ let v = line.slice(eq + 1).trim();
96
+ if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) {
97
+ v = v.slice(1, -1);
98
+ }
99
+ // shell 已設的優先(不覆蓋),符合「env > .env」直覺
100
+ if (process.env[k] === undefined)
101
+ process.env[k] = v;
102
+ }
103
+ }
104
+ catch { /* .env 讀不到不致命 */ }
105
+ break;
106
+ }
107
+ if (dir === root)
108
+ break;
109
+ const parent = dirname(dir);
110
+ if (parent === dir)
111
+ break;
112
+ dir = parent;
113
+ }
12
114
  }
115
+ /** 蒐集 env 覆蓋(只取有設值的 env,欄位級)。*/
116
+ function readEnvOverrides() {
117
+ loadDotEnvOnce();
118
+ const out = {};
119
+ for (const [envName, field] of Object.entries(ENV_MAP)) {
120
+ const v = process.env[envName];
121
+ if (v !== undefined && v !== '') {
122
+ // mode 需窄型別;其餘皆 string 欄位。
123
+ out[field] = v;
124
+ }
125
+ }
126
+ return out;
127
+ }
128
+ /**
129
+ * 三層分層解析:全域 → 疊專案層 → 疊 env(欄位級 merge,高層只覆蓋它提供的欄位)。
130
+ * 任一層都沒有 mode 時 fallback 'local',讓 validate --offline 等在無設定下可運作。
131
+ */
13
132
  export function loadConfig() {
14
- if (!existsSync(CONFIG_PATH)) {
15
- // 未初始化時回傳 local 模式預設值,讓 validate --offline 等指令能在無設定下運作
16
- return { mode: 'local' };
133
+ const merged = {
134
+ ...(readGlobalConfig() ?? {}),
135
+ ...(readProjectConfig() ?? {}),
136
+ ...readEnvOverrides(),
137
+ };
138
+ if (!merged.mode)
139
+ merged.mode = 'local';
140
+ return merged;
141
+ }
142
+ /** 解析每個關鍵欄位的最終值與來源層(acr config --where 用)。*/
143
+ export function resolveConfigSources() {
144
+ const global = readGlobalConfig() ?? {};
145
+ const project = readProjectConfig() ?? {};
146
+ const env = readEnvOverrides();
147
+ const fields = [
148
+ 'mode', 'api_key', 'encryption_key', 'cloudflare_account_id',
149
+ 'cf_api_token', 'cypher_executor_url', 'mcp_url',
150
+ ];
151
+ const rows = [];
152
+ for (const f of fields) {
153
+ let value;
154
+ let source = 'default';
155
+ if (f in env) {
156
+ value = env[f];
157
+ source = 'env';
158
+ }
159
+ else if (f in project) {
160
+ value = project[f];
161
+ source = 'project';
162
+ }
163
+ else if (f in global) {
164
+ value = global[f];
165
+ source = 'global';
166
+ }
167
+ else if (f === 'mode') {
168
+ value = 'local';
169
+ source = 'default';
170
+ }
171
+ else
172
+ continue;
173
+ rows.push({ field: f, value: String(value), source });
17
174
  }
18
- const raw = readFileSync(CONFIG_PATH, 'utf8');
19
- return yaml.load(raw);
175
+ return rows;
176
+ }
177
+ /** 回傳本次解析實際採用的專案層設定檔路徑(無則 undefined)。acr config --where 顯示用。*/
178
+ export function activeProjectConfigPath() {
179
+ return findProjectConfig();
20
180
  }
21
181
  export function saveConfig(config) {
22
182
  mkdirSync(CONFIG_DIR, { recursive: true });
@@ -28,4 +188,12 @@ export function getCypherExecutorUrl(config) {
28
188
  }
29
189
  return 'https://cypher.arcrun.dev';
30
190
  }
191
+ /**
192
+ * 取得 MCP server URL(薄殼原則:與 cypher_url 同一份 config 解析)。
193
+ * config 有 mcp_url(env/專案/全域 任一層)→ 用它;否則 fallback 平台預設。
194
+ * acr mcp-setup 用此決定要寫進專案 .mcp.json 的 URL → 切資料夾自動切 MCP。
195
+ */
196
+ export function getMcpUrl(config) {
197
+ return config.mcp_url && config.mcp_url.trim() !== '' ? config.mcp_url : DEFAULT_MCP_URL;
198
+ }
31
199
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,SAAS,CAAC;AAmB3B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,uDAAuD;QACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAiB,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAoB;IACvD,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAChE,OAAO,MAAM,CAAC,mBAAmB,CAAC;IACpC,CAAC;IACD,OAAO,2BAA2B,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * deploy.ts — self-hosted Worker 部署(installer 的「下載 repo tarball + wrangler deploy」段)
3
+ *
4
+ * 對應 SDD:.agents/specs/arcrun/sdk-and-website/self-hosted-init.md §6(commit wasm + codeload)
5
+ *
6
+ * 策略(richblack 2026-06-02):repo 自帶預編譯 wasm(.component-builds 下各 component.wasm,
7
+ * 見 rule 05 慣例變更)→ CLI 從 GitHub codeload tarball 拿完整部署物 → 注入用戶的 KV id
8
+ * → 用用戶自己的 CF token wrangler deploy。用戶不需 git / tinygo,只需 wrangler。
9
+ */
10
+ /**
11
+ * init 要建立的 KV namespace(title)。
12
+ * 前 7 個權威來源:.claude/rules/01-tech-stack.md 資料儲存表(cypher-executor 用)。
13
+ * SUBMISSIONS_KV:registry worker 用(component 投稿)。漏建會讓 registry deploy 失敗 →
14
+ * 壓測 §2.6/#11「20/21」根因(registry/wrangler.toml 綁 SUBMISSIONS_KV,但注入清單沒有它,
15
+ * 殘留官方舊 id → wrangler deploy 因 KV 不存在而失敗)。補進來後回到 21/21。
16
+ */
17
+ export declare const REQUIRED_KV_NAMESPACES: readonly ["WEBHOOKS", "CREDENTIALS_KV", "RECIPES", "USERS_KV", "SESSIONS_KV", "ANALYTICS_KV", "EXEC_CONTEXT", "SUBMISSIONS_KV"];
18
+ /** 部署後要提示用戶手動 `wrangler secret put ENCRYPTION_KEY` 的 Worker。*/
19
+ export declare const SECRET_TARGET_WORKERS: readonly ["arcrun-cypher-executor", "arcrun-auth-static-key", "arcrun-auth-service-account"];
20
+ export interface DeployContext {
21
+ accountId: string;
22
+ apiToken: string;
23
+ workerSubdomain: string;
24
+ kvNamespaceIds: Record<string, string>;
25
+ }
26
+ export interface DeployResult {
27
+ implemented: boolean;
28
+ cypherExecutorUrl?: string;
29
+ message: string;
30
+ }
31
+ /** 偵測 wrangler 是否已安裝(用戶前置:裝 CF CLI)。*/
32
+ export declare function wranglerAvailable(): boolean;
33
+ /**
34
+ * 下載 repo codeload tarball(含預編譯 wasm)→ 注入用戶 KV id → wrangler deploy 全部 Worker。
35
+ *
36
+ * SDD self-hosted-init.md §6.4:
37
+ * 1. 下載 codeload tarball(ref 預設 main)→ 解壓到暫存目錄
38
+ * 2. 各 wrangler.toml 注入 ctx.kvNamespaceIds + cypher-executor WORKER_SUBDOMAIN
39
+ * 3. tier1=.component-builds/* 先 → tier2=cypher-executor/registry 後,逐一 wrangler deploy
40
+ * 4. 回 cypherExecutorUrl = https://arcrun-cypher-executor.<subdomain>.workers.dev
41
+ *
42
+ * 誠實(mindset §7):任一 worker deploy 失敗會收集進 message 回報,不假裝全綠。
43
+ *
44
+ * @param ctx 部署上下文
45
+ * @param ref git ref(branch / tag),預設 main;acr update 可帶 tag
46
+ */
47
+ export declare function downloadAndDeploy(ctx: DeployContext, ref?: string): Promise<DeployResult>;
48
+ /**
49
+ * 移除 self-hosted fork 帳號沒有、會導致 wrangler deploy 失敗的官方專屬 TOML 區塊:
50
+ * - `[[routes]]`(含 pattern/zone_name):fork 沒有 arcrun.dev zone
51
+ * - `[[r2_buckets]]`:dead storage + 綁卡違背開源免費(registry-canon 1.5)
52
+ * - `[ai]`(Workers AI binding):免費帳號未必啟用,且自架預設不需要
53
+ * 純文字行級移除(TOML table 以空行 / 下一個 `[` 區塊結束)。worker 仍靠 `workers_dev = true` 對外。
54
+ */
55
+ export declare function stripOfficialOnlyBindings(toml: string): string;
56
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/lib/deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,iIASzB,CAAC;AAEX,+DAA+D;AAC/D,eAAO,MAAM,qBAAqB,8FAIxB,CAAC;AAEX,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,uCAAuC;AACvC,wBAAgB,iBAAiB,IAAI,OAAO,CAO3C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAmD/F;AAuFD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA2B9D"}