pagegraph 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/README.md +325 -66
  2. package/dist/anthropic-messages-TqKpKmfW.js +1067 -0
  3. package/dist/anthropic-messages-TqKpKmfW.js.map +1 -0
  4. package/dist/audit.d.ts +4 -2
  5. package/dist/audit.js +5 -5
  6. package/dist/audit.js.map +1 -1
  7. package/dist/azure-openai-responses-DJjBLwoI.js +231 -0
  8. package/dist/azure-openai-responses-DJjBLwoI.js.map +1 -0
  9. package/dist/build-only/audit.js +1 -1
  10. package/dist/build-only/claims.d.ts +1 -0
  11. package/dist/build-only/claims.js +6 -0
  12. package/dist/build-only/claims.js.map +1 -0
  13. package/dist/build-only/config.js +1 -1
  14. package/dist/build-only/oxlint.d.ts +1 -0
  15. package/dist/build-only/oxlint.js +6 -0
  16. package/dist/build-only/oxlint.js.map +1 -0
  17. package/dist/build-only/tanstack-start.js +1 -1
  18. package/dist/build-only/vite.js +1 -1
  19. package/dist/{checks-uZk5Em9A.js → checks-BS-aDXB_.js} +2 -2
  20. package/dist/checks-BS-aDXB_.js.map +1 -0
  21. package/dist/claims-Bch7Lxlo.d.ts +92 -0
  22. package/dist/claims-Bv7voeEV.js +431 -0
  23. package/dist/claims-Bv7voeEV.js.map +1 -0
  24. package/dist/claims.d.ts +94 -0
  25. package/dist/claims.js +2 -0
  26. package/dist/cli.js +17607 -43387
  27. package/dist/cli.js.map +1 -1
  28. package/dist/cloudflare-workers-ai-system-one-f3ZrvNYZ.js +41 -0
  29. package/dist/cloudflare-workers-ai-system-one-f3ZrvNYZ.js.map +1 -0
  30. package/dist/config.d.ts +9 -29
  31. package/dist/config.js +2 -2
  32. package/dist/config.js.map +1 -1
  33. package/dist/{content-kcEnQdfi.js → content-CHd0X4s6.js} +2 -2
  34. package/dist/{content-kcEnQdfi.js.map → content-CHd0X4s6.js.map} +1 -1
  35. package/dist/{content-B1cPtL8b.d.ts → content-DgNr7apS.d.ts} +4 -5
  36. package/dist/declare-D5o7hwmv.js.map +1 -1
  37. package/dist/diagnostics-Wt5faNDM.js +108 -0
  38. package/dist/diagnostics-Wt5faNDM.js.map +1 -0
  39. package/dist/dist-B6zg_Z3Z.js +4794 -0
  40. package/dist/dist-B6zg_Z3Z.js.map +1 -0
  41. package/dist/document-CztEu3Vd.d.ts +109 -0
  42. package/dist/document-Dvemcv7V.js +379 -0
  43. package/dist/document-Dvemcv7V.js.map +1 -0
  44. package/dist/env-api-keys-C-OA0yM-.js +124 -0
  45. package/dist/env-api-keys-C-OA0yM-.js.map +1 -0
  46. package/dist/error-body-CyiejW4b.js +103 -0
  47. package/dist/error-body-CyiejW4b.js.map +1 -0
  48. package/dist/facts-1OKclPOk.js +115 -0
  49. package/dist/facts-1OKclPOk.js.map +1 -0
  50. package/dist/github-copilot-headers-CEpMOpQF.js +24 -0
  51. package/dist/github-copilot-headers-CEpMOpQF.js.map +1 -0
  52. package/dist/google-generative-ai-BxABKIKO.js +330 -0
  53. package/dist/google-generative-ai-BxABKIKO.js.map +1 -0
  54. package/dist/google-shared-0gpM2jFi.js +19471 -0
  55. package/dist/google-shared-0gpM2jFi.js.map +1 -0
  56. package/dist/google-vertex-D8Eb5cbu.js +376 -0
  57. package/dist/google-vertex-D8Eb5cbu.js.map +1 -0
  58. package/dist/{declare-DVgdEdOL.d.ts → graph-D1PIndsC.d.ts} +117 -6
  59. package/dist/{graph-Bcsourlv.js → graph-DMNOLXLu.js} +23 -13
  60. package/dist/graph-DMNOLXLu.js.map +1 -0
  61. package/dist/hash-Dp7EzZUo.js +18 -0
  62. package/dist/hash-Dp7EzZUo.js.map +1 -0
  63. package/dist/headers-BRNMVpzu.js +19 -0
  64. package/dist/headers-BRNMVpzu.js.map +1 -0
  65. package/dist/index-C5w9ripz.d.ts +204 -0
  66. package/dist/index.d.ts +6 -160
  67. package/dist/index.js +37 -5
  68. package/dist/index.js.map +1 -1
  69. package/dist/inline-BbS93GAT.js +682 -0
  70. package/dist/inline-BbS93GAT.js.map +1 -0
  71. package/dist/json-parse-C10znB7l.js +383 -0
  72. package/dist/json-parse-C10znB7l.js.map +1 -0
  73. package/dist/llms-Dhr_5u2O.js +19 -0
  74. package/dist/llms-Dhr_5u2O.js.map +1 -0
  75. package/dist/markdown-C6dRE9zD.js +168 -0
  76. package/dist/markdown-C6dRE9zD.js.map +1 -0
  77. package/dist/markdown-path-lJB9BAVZ.js +6 -0
  78. package/dist/markdown-path-lJB9BAVZ.js.map +1 -0
  79. package/dist/{message-DT_CjUdt.js → message-CuBjgZ74.js} +2 -2
  80. package/dist/{message-DT_CjUdt.js.map → message-CuBjgZ74.js.map} +1 -1
  81. package/dist/mistral-conversations-CvaqBWjR.js +690 -0
  82. package/dist/mistral-conversations-CvaqBWjR.js.map +1 -0
  83. package/dist/models-DcT5qOEL.js +1203 -0
  84. package/dist/models-DcT5qOEL.js.map +1 -0
  85. package/dist/node-Ccvru9GE.js +26 -0
  86. package/dist/node-Ccvru9GE.js.map +1 -0
  87. package/dist/node-MEosBOF2.js +2403 -0
  88. package/dist/node-MEosBOF2.js.map +1 -0
  89. package/dist/openai-BCBEd2eO.js +17350 -0
  90. package/dist/openai-BCBEd2eO.js.map +1 -0
  91. package/dist/openai-codex-responses-vJqxeeRC.js +1268 -0
  92. package/dist/openai-codex-responses-vJqxeeRC.js.map +1 -0
  93. package/dist/openai-completions-Cb_fRAbI.js +989 -0
  94. package/dist/openai-completions-Cb_fRAbI.js.map +1 -0
  95. package/dist/openai-prompt-cache-Bc6qNWt0.js +10 -0
  96. package/dist/openai-prompt-cache-Bc6qNWt0.js.map +1 -0
  97. package/dist/openai-responses-sDuh82G5.js +268 -0
  98. package/dist/openai-responses-sDuh82G5.js.map +1 -0
  99. package/dist/openai-responses-shared-mhuo1Jov.js +599 -0
  100. package/dist/openai-responses-shared-mhuo1Jov.js.map +1 -0
  101. package/dist/openrouter-images-CRmBkzpX.js +127 -0
  102. package/dist/openrouter-images-CRmBkzpX.js.map +1 -0
  103. package/dist/oxlint.d.ts +58 -0
  104. package/dist/oxlint.js +202 -0
  105. package/dist/oxlint.js.map +1 -0
  106. package/dist/page-heads-BfjWQvau.d.ts +108 -0
  107. package/dist/{page-heads-6y-CARRQ.js → page-heads-BgbaIjj9.js} +3 -3
  108. package/dist/page-heads-BgbaIjj9.js.map +1 -0
  109. package/dist/pi-Bvw6J0gh.js +56795 -0
  110. package/dist/pi-Bvw6J0gh.js.map +1 -0
  111. package/dist/pi-messages-CejiVYvO.js +308 -0
  112. package/dist/pi-messages-CejiVYvO.js.map +1 -0
  113. package/dist/{projections-DeEFe7XT.d.ts → projections-Bk-qOOsR.d.ts} +2 -2
  114. package/dist/provider-env-t38GK5FF.js +39 -0
  115. package/dist/provider-env-t38GK5FF.js.map +1 -0
  116. package/dist/provider-retry-DzKoh1X7.js +80 -0
  117. package/dist/provider-retry-DzKoh1X7.js.map +1 -0
  118. package/dist/react.d.ts +3 -2
  119. package/dist/react.js +2 -1
  120. package/dist/react.js.map +1 -1
  121. package/dist/rolldown-runtime-B-lAHAz2.js +37 -0
  122. package/dist/sanitize-unicode-Ds14l9Om.js +28 -0
  123. package/dist/sanitize-unicode-Ds14l9Om.js.map +1 -0
  124. package/dist/sdk-C9_wiO6w.js +12503 -0
  125. package/dist/sdk-C9_wiO6w.js.map +1 -0
  126. package/dist/state-BuJP_3Lr.js +28102 -0
  127. package/dist/state-BuJP_3Lr.js.map +1 -0
  128. package/dist/system-one-shared-Dl10ZF7Z.js +167 -0
  129. package/dist/system-one-shared-Dl10ZF7Z.js.map +1 -0
  130. package/dist/tanstack-start/index.d.ts +29 -13
  131. package/dist/tanstack-start/index.js +391 -42
  132. package/dist/tanstack-start/index.js.map +1 -1
  133. package/dist/tanstack-start/markdown.d.ts +12 -0
  134. package/dist/tanstack-start/markdown.js +149 -0
  135. package/dist/tanstack-start/markdown.js.map +1 -0
  136. package/dist/tanstack-start/prerender-worker.d.ts +2 -0
  137. package/dist/tanstack-start/prerender-worker.js +7 -0
  138. package/dist/tanstack-start/prerender-worker.js.map +1 -0
  139. package/dist/tanstack-start/react.d.ts +7 -0
  140. package/dist/tanstack-start/react.js +12 -0
  141. package/dist/tanstack-start/react.js.map +1 -0
  142. package/dist/tanstack-start/server.d.ts +9 -3
  143. package/dist/tanstack-start/server.js +26 -2
  144. package/dist/tanstack-start/server.js.map +1 -1
  145. package/dist/transform-messages-BLJ8EfK6.js +468 -0
  146. package/dist/transform-messages-BLJ8EfK6.js.map +1 -0
  147. package/dist/typesafe-system-one-CwEWMV8P.js +25 -0
  148. package/dist/typesafe-system-one-CwEWMV8P.js.map +1 -0
  149. package/dist/{vite-graph-loader-01p1WxEq.js → vite-graph-loader-CsGiYNWE.js} +6 -5
  150. package/dist/vite-graph-loader-CsGiYNWE.js.map +1 -0
  151. package/dist/vite-graph-loader-DZCwejuJ.d.ts +133 -0
  152. package/package.json +47 -10
  153. package/dist/checks-uZk5Em9A.js.map +0 -1
  154. package/dist/graph-Bcsourlv.js.map +0 -1
  155. package/dist/graph-BxCY90vq.d.ts +0 -104
  156. package/dist/graph-CBIY71w6.d.ts +0 -57
  157. package/dist/page-heads-6y-CARRQ.js.map +0 -1
  158. package/dist/page-heads-DNkjMUEN.d.ts +0 -21
  159. package/dist/vite-graph-loader-01p1WxEq.js.map +0 -1
  160. package/dist/vite-graph-loader-Btgjz5RH.d.ts +0 -56
@@ -0,0 +1,124 @@
1
+ import { t as getProviderEnvValue } from "./provider-env-t38GK5FF.js";
2
+ //#region node_modules/@earendil-works/pi-ai/dist/env-api-keys.js
3
+ var __rewriteRelativeImportExtension = function(path, preserveJsx) {
4
+ if (typeof path === "string" && /^\.\.?\//.test(path)) return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function(m, tsx, d, ext, cm) {
5
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : d + ext + "." + cm.toLowerCase() + "js";
6
+ });
7
+ return path;
8
+ };
9
+ let _existsSync = null;
10
+ let _homedir = null;
11
+ let _join = null;
12
+ const dynamicImport = (specifier) => import(__rewriteRelativeImportExtension(specifier));
13
+ const NODE_FS_SPECIFIER = "node:fs";
14
+ const NODE_OS_SPECIFIER = "node:os";
15
+ const NODE_PATH_SPECIFIER = "node:path";
16
+ if (typeof process !== "undefined" && (process.versions?.node || process.versions?.bun)) {
17
+ dynamicImport(NODE_FS_SPECIFIER).then((m) => {
18
+ _existsSync = m.existsSync;
19
+ });
20
+ dynamicImport(NODE_OS_SPECIFIER).then((m) => {
21
+ _homedir = m.homedir;
22
+ });
23
+ dynamicImport(NODE_PATH_SPECIFIER).then((m) => {
24
+ _join = m.join;
25
+ });
26
+ }
27
+ const ANTHROPIC_AUTH_TOKEN_ENV = "ANTHROPIC_AUTH_TOKEN";
28
+ const ANTHROPIC_OAUTH_TOKEN_ENV = "ANTHROPIC_OAUTH_TOKEN";
29
+ const ANTHROPIC_API_KEY_ENV = "ANTHROPIC_API_KEY";
30
+ const ANTHROPIC_FEDERATION_RULE_ID_ENV = "ANTHROPIC_FEDERATION_RULE_ID";
31
+ const ANTHROPIC_ORGANIZATION_ID_ENV = "ANTHROPIC_ORGANIZATION_ID";
32
+ const ANTHROPIC_SERVICE_ACCOUNT_ID_ENV = "ANTHROPIC_SERVICE_ACCOUNT_ID";
33
+ const ANTHROPIC_IDENTITY_TOKEN_FILE_ENV = "ANTHROPIC_IDENTITY_TOKEN_FILE";
34
+ const ANTHROPIC_WORKSPACE_ID_ENV = "ANTHROPIC_WORKSPACE_ID";
35
+ let cachedVertexAdcCredentialsExists = null;
36
+ function hasVertexAdcCredentials(env) {
37
+ const explicitCredentialsPath = env?.GOOGLE_APPLICATION_CREDENTIALS;
38
+ if (explicitCredentialsPath) return _existsSync ? _existsSync(explicitCredentialsPath) : false;
39
+ if (cachedVertexAdcCredentialsExists === null) {
40
+ if (!_existsSync || !_homedir || !_join) {
41
+ if (!(typeof process !== "undefined" && (process.versions?.node || process.versions?.bun))) cachedVertexAdcCredentialsExists = false;
42
+ return false;
43
+ }
44
+ const gacPath = getProviderEnvValue("GOOGLE_APPLICATION_CREDENTIALS", env);
45
+ if (gacPath) cachedVertexAdcCredentialsExists = _existsSync(gacPath);
46
+ else cachedVertexAdcCredentialsExists = _existsSync(_join(_homedir(), ".config", "gcloud", "application_default_credentials.json"));
47
+ }
48
+ return cachedVertexAdcCredentialsExists;
49
+ }
50
+ function getApiKeyEnvVars(provider) {
51
+ if (provider === "github-copilot") return ["COPILOT_GITHUB_TOKEN"];
52
+ if (provider === "anthropic") return [
53
+ ANTHROPIC_AUTH_TOKEN_ENV,
54
+ ANTHROPIC_OAUTH_TOKEN_ENV,
55
+ ANTHROPIC_API_KEY_ENV
56
+ ];
57
+ const envVar = {
58
+ "ant-ling": "ANT_LING_API_KEY",
59
+ "qwen-token-plan": "QWEN_TOKEN_PLAN_API_KEY",
60
+ "qwen-token-plan-cn": "QWEN_TOKEN_PLAN_CN_API_KEY",
61
+ "qwen-token-plan-individual": "QWEN_TOKEN_PLAN_API_KEY",
62
+ openai: "OPENAI_API_KEY",
63
+ "azure-openai-responses": "AZURE_OPENAI_API_KEY",
64
+ nvidia: "NVIDIA_API_KEY",
65
+ deepseek: "DEEPSEEK_API_KEY",
66
+ google: "GEMINI_API_KEY",
67
+ "google-vertex": "GOOGLE_CLOUD_API_KEY",
68
+ groq: "GROQ_API_KEY",
69
+ cerebras: "CEREBRAS_API_KEY",
70
+ xai: "XAI_API_KEY",
71
+ typesafe: "TYPESAFE_API_KEY",
72
+ radius: "RADIUS_API_KEY",
73
+ openrouter: "OPENROUTER_API_KEY",
74
+ "vercel-ai-gateway": "AI_GATEWAY_API_KEY",
75
+ zai: "ZAI_API_KEY",
76
+ "zai-coding-cn": "ZAI_CODING_CN_API_KEY",
77
+ mistral: "MISTRAL_API_KEY",
78
+ minimax: "MINIMAX_API_KEY",
79
+ "minimax-cn": "MINIMAX_CN_API_KEY",
80
+ moonshotai: "MOONSHOT_API_KEY",
81
+ "moonshotai-cn": "MOONSHOT_API_KEY",
82
+ huggingface: "HF_TOKEN",
83
+ fireworks: "FIREWORKS_API_KEY",
84
+ together: "TOGETHER_API_KEY",
85
+ baseten: "BASETEN_API_KEY",
86
+ opencode: "OPENCODE_API_KEY",
87
+ "opencode-go": "OPENCODE_API_KEY",
88
+ "kimi-coding": "KIMI_API_KEY",
89
+ meta: "META_API_KEY",
90
+ "cloudflare-workers-ai": "CLOUDFLARE_API_KEY",
91
+ "cloudflare-ai-gateway": "CLOUDFLARE_API_KEY",
92
+ xiaomi: "XIAOMI_API_KEY",
93
+ "xiaomi-token-plan-cn": "XIAOMI_TOKEN_PLAN_CN_API_KEY",
94
+ "xiaomi-token-plan-ams": "XIAOMI_TOKEN_PLAN_AMS_API_KEY",
95
+ "xiaomi-token-plan-sgp": "XIAOMI_TOKEN_PLAN_SGP_API_KEY"
96
+ }[provider];
97
+ return envVar ? [envVar] : void 0;
98
+ }
99
+ function findEnvKeys(provider, env) {
100
+ const envVars = getApiKeyEnvVars(provider);
101
+ if (!envVars) return void 0;
102
+ const found = envVars.filter((envVar) => !!getProviderEnvValue(envVar, env));
103
+ return found.length > 0 ? found : void 0;
104
+ }
105
+ function getEnvApiKey(provider, env) {
106
+ const envKeys = findEnvKeys(provider, env);
107
+ if (envKeys?.[0]) {
108
+ const apiKeyEnv = provider === "anthropic" ? envKeys.find((key) => key !== ANTHROPIC_AUTH_TOKEN_ENV) : envKeys[0];
109
+ if (apiKeyEnv) return getProviderEnvValue(apiKeyEnv, env);
110
+ }
111
+ if (provider === "google-vertex") {
112
+ const hasCredentials = hasVertexAdcCredentials(env);
113
+ const hasProject = !!(getProviderEnvValue("GOOGLE_CLOUD_PROJECT", env) || getProviderEnvValue("GCLOUD_PROJECT", env));
114
+ const hasLocation = !!getProviderEnvValue("GOOGLE_CLOUD_LOCATION", env);
115
+ if (hasCredentials && hasProject && hasLocation) return "<authenticated>";
116
+ }
117
+ if (provider === "amazon-bedrock") {
118
+ if (getProviderEnvValue("AWS_PROFILE", env) || getProviderEnvValue("AWS_ACCESS_KEY_ID", env) && getProviderEnvValue("AWS_SECRET_ACCESS_KEY", env) || getProviderEnvValue("AWS_BEARER_TOKEN_BEDROCK", env) || getProviderEnvValue("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI", env) || getProviderEnvValue("AWS_CONTAINER_CREDENTIALS_FULL_URI", env) || getProviderEnvValue("AWS_WEB_IDENTITY_TOKEN_FILE", env)) return "<authenticated>";
119
+ }
120
+ }
121
+ //#endregion
122
+ export { ANTHROPIC_OAUTH_TOKEN_ENV as a, ANTHROPIC_WORKSPACE_ID_ENV as c, ANTHROPIC_IDENTITY_TOKEN_FILE_ENV as i, findEnvKeys as l, ANTHROPIC_AUTH_TOKEN_ENV as n, ANTHROPIC_ORGANIZATION_ID_ENV as o, ANTHROPIC_FEDERATION_RULE_ID_ENV as r, ANTHROPIC_SERVICE_ACCOUNT_ID_ENV as s, ANTHROPIC_API_KEY_ENV as t, getEnvApiKey as u };
123
+
124
+ //# sourceMappingURL=env-api-keys-C-OA0yM-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-api-keys-C-OA0yM-.js","names":[],"sources":["../node_modules/@earendil-works/pi-ai/dist/env-api-keys.js"],"sourcesContent":["var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n};\n// NEVER convert to top-level imports - breaks browser/Vite builds\nlet _existsSync = null;\nlet _homedir = null;\nlet _join = null;\nconst dynamicImport = (specifier) => import(__rewriteRelativeImportExtension(specifier));\nconst NODE_FS_SPECIFIER = \"node:\" + \"fs\";\nconst NODE_OS_SPECIFIER = \"node:\" + \"os\";\nconst NODE_PATH_SPECIFIER = \"node:\" + \"path\";\n// Eagerly load in Node.js/Bun environment only\nif (typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun)) {\n dynamicImport(NODE_FS_SPECIFIER).then((m) => {\n _existsSync = m.existsSync;\n });\n dynamicImport(NODE_OS_SPECIFIER).then((m) => {\n _homedir = m.homedir;\n });\n dynamicImport(NODE_PATH_SPECIFIER).then((m) => {\n _join = m.join;\n });\n}\nimport { getProviderEnvValue } from \"./utils/provider-env.js\";\nexport const ANTHROPIC_AUTH_TOKEN_ENV = \"ANTHROPIC_AUTH_TOKEN\";\nexport const ANTHROPIC_OAUTH_TOKEN_ENV = \"ANTHROPIC_OAUTH_TOKEN\";\nexport const ANTHROPIC_API_KEY_ENV = \"ANTHROPIC_API_KEY\";\nexport const ANTHROPIC_FEDERATION_RULE_ID_ENV = \"ANTHROPIC_FEDERATION_RULE_ID\";\nexport const ANTHROPIC_ORGANIZATION_ID_ENV = \"ANTHROPIC_ORGANIZATION_ID\";\nexport const ANTHROPIC_SERVICE_ACCOUNT_ID_ENV = \"ANTHROPIC_SERVICE_ACCOUNT_ID\";\nexport const ANTHROPIC_IDENTITY_TOKEN_FILE_ENV = \"ANTHROPIC_IDENTITY_TOKEN_FILE\";\nexport const ANTHROPIC_WORKSPACE_ID_ENV = \"ANTHROPIC_WORKSPACE_ID\";\nlet cachedVertexAdcCredentialsExists = null;\nfunction hasVertexAdcCredentials(env) {\n const explicitCredentialsPath = env?.GOOGLE_APPLICATION_CREDENTIALS;\n if (explicitCredentialsPath) {\n return _existsSync ? _existsSync(explicitCredentialsPath) : false;\n }\n if (cachedVertexAdcCredentialsExists === null) {\n // If node modules haven't loaded yet (async import race at startup),\n // return false WITHOUT caching so the next call retries once they're ready.\n // Only cache false permanently in a browser environment where fs is never available.\n if (!_existsSync || !_homedir || !_join) {\n const isNode = typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun);\n if (!isNode) {\n // Definitively in a browser — safe to cache false permanently\n cachedVertexAdcCredentialsExists = false;\n }\n return false;\n }\n // Check GOOGLE_APPLICATION_CREDENTIALS env var first (standard way)\n const gacPath = getProviderEnvValue(\"GOOGLE_APPLICATION_CREDENTIALS\", env);\n if (gacPath) {\n cachedVertexAdcCredentialsExists = _existsSync(gacPath);\n }\n else {\n // Fall back to default ADC path (lazy evaluation)\n cachedVertexAdcCredentialsExists = _existsSync(_join(_homedir(), \".config\", \"gcloud\", \"application_default_credentials.json\"));\n }\n }\n return cachedVertexAdcCredentialsExists;\n}\nfunction getApiKeyEnvVars(provider) {\n if (provider === \"github-copilot\") {\n return [\"COPILOT_GITHUB_TOKEN\"];\n }\n // ANTHROPIC_AUTH_TOKEN participates in env discovery/status, but\n // getEnvApiKey() skips it because requests must pass it as Authorization: Bearer.\n if (provider === \"anthropic\") {\n return [ANTHROPIC_AUTH_TOKEN_ENV, ANTHROPIC_OAUTH_TOKEN_ENV, ANTHROPIC_API_KEY_ENV];\n }\n const envMap = {\n \"ant-ling\": \"ANT_LING_API_KEY\",\n \"qwen-token-plan\": \"QWEN_TOKEN_PLAN_API_KEY\",\n \"qwen-token-plan-cn\": \"QWEN_TOKEN_PLAN_CN_API_KEY\",\n \"qwen-token-plan-individual\": \"QWEN_TOKEN_PLAN_API_KEY\",\n openai: \"OPENAI_API_KEY\",\n \"azure-openai-responses\": \"AZURE_OPENAI_API_KEY\",\n nvidia: \"NVIDIA_API_KEY\",\n deepseek: \"DEEPSEEK_API_KEY\",\n google: \"GEMINI_API_KEY\",\n \"google-vertex\": \"GOOGLE_CLOUD_API_KEY\",\n groq: \"GROQ_API_KEY\",\n cerebras: \"CEREBRAS_API_KEY\",\n xai: \"XAI_API_KEY\",\n typesafe: \"TYPESAFE_API_KEY\",\n radius: \"RADIUS_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n \"vercel-ai-gateway\": \"AI_GATEWAY_API_KEY\",\n zai: \"ZAI_API_KEY\",\n \"zai-coding-cn\": \"ZAI_CODING_CN_API_KEY\",\n mistral: \"MISTRAL_API_KEY\",\n minimax: \"MINIMAX_API_KEY\",\n \"minimax-cn\": \"MINIMAX_CN_API_KEY\",\n moonshotai: \"MOONSHOT_API_KEY\",\n \"moonshotai-cn\": \"MOONSHOT_API_KEY\",\n huggingface: \"HF_TOKEN\",\n fireworks: \"FIREWORKS_API_KEY\",\n together: \"TOGETHER_API_KEY\",\n baseten: \"BASETEN_API_KEY\",\n opencode: \"OPENCODE_API_KEY\",\n \"opencode-go\": \"OPENCODE_API_KEY\",\n \"kimi-coding\": \"KIMI_API_KEY\",\n meta: \"META_API_KEY\",\n \"cloudflare-workers-ai\": \"CLOUDFLARE_API_KEY\",\n \"cloudflare-ai-gateway\": \"CLOUDFLARE_API_KEY\",\n xiaomi: \"XIAOMI_API_KEY\",\n \"xiaomi-token-plan-cn\": \"XIAOMI_TOKEN_PLAN_CN_API_KEY\",\n \"xiaomi-token-plan-ams\": \"XIAOMI_TOKEN_PLAN_AMS_API_KEY\",\n \"xiaomi-token-plan-sgp\": \"XIAOMI_TOKEN_PLAN_SGP_API_KEY\",\n };\n const envVar = envMap[provider];\n return envVar ? [envVar] : undefined;\n}\nexport function findEnvKeys(provider, env) {\n const envVars = getApiKeyEnvVars(provider);\n if (!envVars)\n return undefined;\n const found = envVars.filter((envVar) => !!getProviderEnvValue(envVar, env));\n return found.length > 0 ? found : undefined;\n}\nexport function getEnvApiKey(provider, env) {\n const envKeys = findEnvKeys(provider, env);\n if (envKeys?.[0]) {\n const apiKeyEnv = provider === \"anthropic\" ? envKeys.find((key) => key !== ANTHROPIC_AUTH_TOKEN_ENV) : envKeys[0];\n if (apiKeyEnv)\n return getProviderEnvValue(apiKeyEnv, env);\n }\n // Vertex AI supports either an explicit API key or Application Default Credentials.\n // Auth is configured via `gcloud auth application-default login`.\n if (provider === \"google-vertex\") {\n const hasCredentials = hasVertexAdcCredentials(env);\n const hasProject = !!(getProviderEnvValue(\"GOOGLE_CLOUD_PROJECT\", env) || getProviderEnvValue(\"GCLOUD_PROJECT\", env));\n const hasLocation = !!getProviderEnvValue(\"GOOGLE_CLOUD_LOCATION\", env);\n if (hasCredentials && hasProject && hasLocation) {\n return \"<authenticated>\";\n }\n }\n if (provider === \"amazon-bedrock\") {\n // Amazon Bedrock supports multiple credential sources:\n // 1. AWS_PROFILE - named profile from ~/.aws/credentials\n // 2. AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY - standard IAM keys\n // 3. AWS_BEARER_TOKEN_BEDROCK - Bedrock bearer token\n // 4. AWS_CONTAINER_CREDENTIALS_RELATIVE_URI - ECS task roles\n // 5. AWS_CONTAINER_CREDENTIALS_FULL_URI - ECS task roles (full URI)\n // 6. AWS_WEB_IDENTITY_TOKEN_FILE - IRSA (IAM Roles for Service Accounts)\n if (getProviderEnvValue(\"AWS_PROFILE\", env) ||\n (getProviderEnvValue(\"AWS_ACCESS_KEY_ID\", env) && getProviderEnvValue(\"AWS_SECRET_ACCESS_KEY\", env)) ||\n getProviderEnvValue(\"AWS_BEARER_TOKEN_BEDROCK\", env) ||\n getProviderEnvValue(\"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\", env) ||\n getProviderEnvValue(\"AWS_CONTAINER_CREDENTIALS_FULL_URI\", env) ||\n getProviderEnvValue(\"AWS_WEB_IDENTITY_TOKEN_FILE\", env)) {\n return \"<authenticated>\";\n }\n }\n return undefined;\n}\n//# sourceMappingURL=env-api-keys.js.map"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ //#region node_modules/@earendil-works/pi-ai/dist/utils/error-body.js
2
+ const MAX_PROVIDER_ERROR_BODY_CHARS = 4e3;
3
+ function normalizeProviderError(error) {
4
+ if (!(error instanceof Error)) return {
5
+ message: safeJsonStringify(error),
6
+ messageCarriesBody: false
7
+ };
8
+ const sdkError = error;
9
+ const status = extractStatus(sdkError);
10
+ const body = extractBody(sdkError);
11
+ const messageCarriesBody = body === void 0 || error.message.includes(body);
12
+ return {
13
+ status,
14
+ body,
15
+ message: error.message,
16
+ messageCarriesBody
17
+ };
18
+ }
19
+ /**
20
+ * Probe the HTTP status, first numeric hit wins, in SDK-field order:
21
+ * `statusCode` (Mistral) → `status` (`openai`, `@google/genai`) →
22
+ * `$metadata.httpStatusCode` (Bedrock) → `$response.statusCode` (Bedrock).
23
+ */
24
+ function extractStatus(error) {
25
+ if (typeof error.statusCode === "number") return error.statusCode;
26
+ if (typeof error.status === "number") return error.status;
27
+ if (typeof error.$metadata?.httpStatusCode === "number") return error.$metadata.httpStatusCode;
28
+ if (typeof error.$response?.statusCode === "number") return error.$response.statusCode;
29
+ }
30
+ /**
31
+ * Probe the raw body reason, first usable hit wins, in SDK-field order:
32
+ * `body` string (Mistral) → `error` parsed JSON body object (`openai` SDK's
33
+ * `this.error`) → `$response.body` (Bedrock). Empty objects and unread response
34
+ * streams are treated as no body so they do not surface as `"{}"` or serialized
35
+ * stream internals. The chosen body is truncated to the cap.
36
+ */
37
+ function extractBody(error) {
38
+ const bodyText = pickBodyText(error);
39
+ if (bodyText === void 0) return void 0;
40
+ const trimmed = bodyText.trim();
41
+ if (trimmed.length === 0) return void 0;
42
+ return truncateErrorText(trimmed, MAX_PROVIDER_ERROR_BODY_CHARS);
43
+ }
44
+ function pickBodyText(error) {
45
+ if (typeof error.body === "string") return error.body;
46
+ if (isPlainNonEmptyObject(error.error)) return safeJsonStringify(error.error);
47
+ const responseBody = error.$response?.body;
48
+ if (typeof responseBody === "string") return responseBody;
49
+ if (isReadableStreamLike(responseBody)) return void 0;
50
+ if (isPlainNonEmptyObject(responseBody)) return safeJsonStringify(responseBody);
51
+ }
52
+ function isReadableStreamLike(value) {
53
+ return typeof value === "object" && value !== null && "pipe" in value && typeof value.pipe === "function";
54
+ }
55
+ /**
56
+ * Only a PLAIN object counts as an HTTP body. SDK error fields can hold class
57
+ * instances instead of parsed bodies — AWS SDK v3's `$response.body` is an
58
+ * HTTP stream/response wrapper object, and stringifying one produced garbage
59
+ * like `{"_events":...}` as the "body", which then REPLACED `error.message`
60
+ * in the composed display string. `error.message` is where the SDK puts the
61
+ * real deserialized exception text ("Input is too long...", schema validation
62
+ * details, ...), so the one useful string was discarded for noise. A class
63
+ * instance yields no body, `messageCarriesBody` stays true, and the real
64
+ * message survives. Complements the `pipe` sniffing above: web
65
+ * ReadableStreams (pipeTo/pipeThrough, no `pipe`) and non-stream SDK wrapper
66
+ * classes fail the prototype check, while parsed JSON bodies (plain objects
67
+ * by construction) still pass.
68
+ */
69
+ function isPlainNonEmptyObject(value) {
70
+ if (typeof value !== "object" || value === null) return false;
71
+ const proto = Object.getPrototypeOf(value);
72
+ if (proto !== Object.prototype && proto !== null) return false;
73
+ return Object.keys(value).length > 0;
74
+ }
75
+ /**
76
+ * Compose a display string from a normalized error. When the message already
77
+ * carries the body (Anthropic / `@google/genai` happy path) or no body/status
78
+ * was extracted, the message is returned unchanged. Otherwise the status and
79
+ * body are surfaced, with an optional provider prefix.
80
+ *
81
+ * - no prefix: `"<status>: <body>"`
82
+ * - prefix: `"<prefix> (<status>): <body>"`
83
+ */
84
+ function formatProviderError(norm, prefix) {
85
+ if (norm.messageCarriesBody || norm.status === void 0 || norm.body === void 0) return prefix !== void 0 && norm.status !== void 0 ? `${prefix} (${norm.status}): ${norm.message}` : norm.message;
86
+ return prefix !== void 0 ? `${prefix} (${norm.status}): ${norm.body}` : `${norm.status}: ${norm.body}`;
87
+ }
88
+ function truncateErrorText(text, maxChars) {
89
+ if (text.length <= maxChars) return text;
90
+ return `${text.slice(0, maxChars)}... [truncated ${text.length - maxChars} chars]`;
91
+ }
92
+ function safeJsonStringify(value) {
93
+ try {
94
+ const serialized = JSON.stringify(value);
95
+ return serialized === void 0 ? String(value) : serialized;
96
+ } catch {
97
+ return String(value);
98
+ }
99
+ }
100
+ //#endregion
101
+ export { normalizeProviderError as n, formatProviderError as t };
102
+
103
+ //# sourceMappingURL=error-body-CyiejW4b.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-body-CyiejW4b.js","names":[],"sources":["../node_modules/@earendil-works/pi-ai/dist/utils/error-body.js"],"sourcesContent":["// Shared normalization for provider HTTP error objects.\n//\n// Endpoints behind a proxy / gateway may return a non-2xx response whose body\n// the provider SDK cannot fold into `error.message`. The SDK error object still\n// carries the HTTP status and the raw/parsed body, but under SDK-specific field\n// names. Provider catch blocks that read only `error.message` therefore drop\n// the body and surface opaque messages like `\"403 status code (no body)\"` or\n// collapse to `\"Unknown: UnknownError\"`.\n//\n// `normalizeProviderError` probes the known SDK field shapes (Mistral,\n// `openai`, `@google/genai`, AWS Bedrock) and returns a struct each provider\n// composes into its display string. The `messageCarriesBody` flag captures the\n// Anthropic / `@google/genai` happy path where the SDK already folded the body\n// into the message, so providers can preserve it without double-printing.\nexport const MAX_PROVIDER_ERROR_BODY_CHARS = 4000;\nexport function normalizeProviderError(error) {\n if (!(error instanceof Error)) {\n return { message: safeJsonStringify(error), messageCarriesBody: false };\n }\n const sdkError = error;\n const status = extractStatus(sdkError);\n const body = extractBody(sdkError);\n const messageCarriesBody = body === undefined || error.message.includes(body);\n return {\n status,\n body,\n message: error.message,\n messageCarriesBody,\n };\n}\n/**\n * Probe the HTTP status, first numeric hit wins, in SDK-field order:\n * `statusCode` (Mistral) → `status` (`openai`, `@google/genai`) →\n * `$metadata.httpStatusCode` (Bedrock) → `$response.statusCode` (Bedrock).\n */\nfunction extractStatus(error) {\n if (typeof error.statusCode === \"number\")\n return error.statusCode;\n if (typeof error.status === \"number\")\n return error.status;\n if (typeof error.$metadata?.httpStatusCode === \"number\")\n return error.$metadata.httpStatusCode;\n if (typeof error.$response?.statusCode === \"number\")\n return error.$response.statusCode;\n return undefined;\n}\n/**\n * Probe the raw body reason, first usable hit wins, in SDK-field order:\n * `body` string (Mistral) → `error` parsed JSON body object (`openai` SDK's\n * `this.error`) → `$response.body` (Bedrock). Empty objects and unread response\n * streams are treated as no body so they do not surface as `\"{}\"` or serialized\n * stream internals. The chosen body is truncated to the cap.\n */\nfunction extractBody(error) {\n const bodyText = pickBodyText(error);\n if (bodyText === undefined)\n return undefined;\n const trimmed = bodyText.trim();\n if (trimmed.length === 0)\n return undefined;\n return truncateErrorText(trimmed, MAX_PROVIDER_ERROR_BODY_CHARS);\n}\nfunction pickBodyText(error) {\n if (typeof error.body === \"string\")\n return error.body;\n if (isPlainNonEmptyObject(error.error))\n return safeJsonStringify(error.error);\n const responseBody = error.$response?.body;\n if (typeof responseBody === \"string\")\n return responseBody;\n if (isReadableStreamLike(responseBody))\n return undefined;\n if (isPlainNonEmptyObject(responseBody))\n return safeJsonStringify(responseBody);\n return undefined;\n}\nfunction isReadableStreamLike(value) {\n return typeof value === \"object\" && value !== null && \"pipe\" in value && typeof value.pipe === \"function\";\n}\n/**\n * Only a PLAIN object counts as an HTTP body. SDK error fields can hold class\n * instances instead of parsed bodies — AWS SDK v3's `$response.body` is an\n * HTTP stream/response wrapper object, and stringifying one produced garbage\n * like `{\"_events\":...}` as the \"body\", which then REPLACED `error.message`\n * in the composed display string. `error.message` is where the SDK puts the\n * real deserialized exception text (\"Input is too long...\", schema validation\n * details, ...), so the one useful string was discarded for noise. A class\n * instance yields no body, `messageCarriesBody` stays true, and the real\n * message survives. Complements the `pipe` sniffing above: web\n * ReadableStreams (pipeTo/pipeThrough, no `pipe`) and non-stream SDK wrapper\n * classes fail the prototype check, while parsed JSON bodies (plain objects\n * by construction) still pass.\n */\nfunction isPlainNonEmptyObject(value) {\n if (typeof value !== \"object\" || value === null)\n return false;\n const proto = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto !== null)\n return false;\n return Object.keys(value).length > 0;\n}\n/**\n * Compose a display string from a normalized error. When the message already\n * carries the body (Anthropic / `@google/genai` happy path) or no body/status\n * was extracted, the message is returned unchanged. Otherwise the status and\n * body are surfaced, with an optional provider prefix.\n *\n * - no prefix: `\"<status>: <body>\"`\n * - prefix: `\"<prefix> (<status>): <body>\"`\n */\nexport function formatProviderError(norm, prefix) {\n if (norm.messageCarriesBody || norm.status === undefined || norm.body === undefined) {\n return prefix !== undefined && norm.status !== undefined\n ? `${prefix} (${norm.status}): ${norm.message}`\n : norm.message;\n }\n return prefix !== undefined ? `${prefix} (${norm.status}): ${norm.body}` : `${norm.status}: ${norm.body}`;\n}\nexport function truncateErrorText(text, maxChars) {\n if (text.length <= maxChars)\n return text;\n return `${text.slice(0, maxChars)}... [truncated ${text.length - maxChars} chars]`;\n}\nexport function safeJsonStringify(value) {\n try {\n const serialized = JSON.stringify(value);\n return serialized === undefined ? String(value) : serialized;\n }\n catch {\n return String(value);\n }\n}\n//# sourceMappingURL=error-body.js.map"],"x_google_ignoreList":[0],"mappings":";AAcA,MAAa,gCAAgC;AAC7C,SAAgB,uBAAuB,OAAO;CAC1C,IAAI,EAAE,iBAAiB,QACnB,OAAO;EAAE,SAAS,kBAAkB,KAAK;EAAG,oBAAoB;CAAM;CAE1E,MAAM,WAAW;CACjB,MAAM,SAAS,cAAc,QAAQ;CACrC,MAAM,OAAO,YAAY,QAAQ;CACjC,MAAM,qBAAqB,SAAS,KAAA,KAAa,MAAM,QAAQ,SAAS,IAAI;CAC5E,OAAO;EACH;EACA;EACA,SAAS,MAAM;EACf;CACJ;AACJ;;;;;;AAMA,SAAS,cAAc,OAAO;CAC1B,IAAI,OAAO,MAAM,eAAe,UAC5B,OAAO,MAAM;CACjB,IAAI,OAAO,MAAM,WAAW,UACxB,OAAO,MAAM;CACjB,IAAI,OAAO,MAAM,WAAW,mBAAmB,UAC3C,OAAO,MAAM,UAAU;CAC3B,IAAI,OAAO,MAAM,WAAW,eAAe,UACvC,OAAO,MAAM,UAAU;AAE/B;;;;;;;;AAQA,SAAS,YAAY,OAAO;CACxB,MAAM,WAAW,aAAa,KAAK;CACnC,IAAI,aAAa,KAAA,GACb,OAAO,KAAA;CACX,MAAM,UAAU,SAAS,KAAK;CAC9B,IAAI,QAAQ,WAAW,GACnB,OAAO,KAAA;CACX,OAAO,kBAAkB,SAAS,6BAA6B;AACnE;AACA,SAAS,aAAa,OAAO;CACzB,IAAI,OAAO,MAAM,SAAS,UACtB,OAAO,MAAM;CACjB,IAAI,sBAAsB,MAAM,KAAK,GACjC,OAAO,kBAAkB,MAAM,KAAK;CACxC,MAAM,eAAe,MAAM,WAAW;CACtC,IAAI,OAAO,iBAAiB,UACxB,OAAO;CACX,IAAI,qBAAqB,YAAY,GACjC,OAAO,KAAA;CACX,IAAI,sBAAsB,YAAY,GAClC,OAAO,kBAAkB,YAAY;AAE7C;AACA,SAAS,qBAAqB,OAAO;CACjC,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAS,OAAO,MAAM,SAAS;AACnG;;;;;;;;;;;;;;;AAeA,SAAS,sBAAsB,OAAO;CAClC,IAAI,OAAO,UAAU,YAAY,UAAU,MACvC,OAAO;CACX,MAAM,QAAQ,OAAO,eAAe,KAAK;CACzC,IAAI,UAAU,OAAO,aAAa,UAAU,MACxC,OAAO;CACX,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS;AACvC;;;;;;;;;;AAUA,SAAgB,oBAAoB,MAAM,QAAQ;CAC9C,IAAI,KAAK,sBAAsB,KAAK,WAAW,KAAA,KAAa,KAAK,SAAS,KAAA,GACtE,OAAO,WAAW,KAAA,KAAa,KAAK,WAAW,KAAA,IACzC,GAAG,OAAO,IAAI,KAAK,OAAO,KAAK,KAAK,YACpC,KAAK;CAEf,OAAO,WAAW,KAAA,IAAY,GAAG,OAAO,IAAI,KAAK,OAAO,KAAK,KAAK,SAAS,GAAG,KAAK,OAAO,IAAI,KAAK;AACvG;AACA,SAAgB,kBAAkB,MAAM,UAAU;CAC9C,IAAI,KAAK,UAAU,UACf,OAAO;CACX,OAAO,GAAG,KAAK,MAAM,GAAG,QAAQ,EAAE,iBAAiB,KAAK,SAAS,SAAS;AAC9E;AACA,SAAgB,kBAAkB,OAAO;CACrC,IAAI;EACA,MAAM,aAAa,KAAK,UAAU,KAAK;EACvC,OAAO,eAAe,KAAA,IAAY,OAAO,KAAK,IAAI;CACtD,QACM;EACF,OAAO,OAAO,KAAK;CACvB;AACJ"}
@@ -0,0 +1,115 @@
1
+ //#region src/markdown/facts.ts
2
+ const registeredFacts = /* @__PURE__ */ new Map();
3
+ function isJson(value, parents = /* @__PURE__ */ new Set()) {
4
+ if (value === null || typeof value === "string" || typeof value === "boolean") return true;
5
+ if (typeof value === "number") return Number.isFinite(value);
6
+ if (typeof value !== "object" || parents.has(value)) return false;
7
+ const prototype = Object.getPrototypeOf(value);
8
+ if (!Array.isArray(value) && prototype !== null && prototype !== Object.prototype) return false;
9
+ parents.add(value);
10
+ const valid = (Array.isArray(value) ? Array.from(value) : Object.values(value)).every((entry) => isJson(entry, parents));
11
+ parents.delete(value);
12
+ return valid;
13
+ }
14
+ function validateDefinition(value) {
15
+ if (typeof value !== "object" || value === null || Array.isArray(value)) throw new Error("Expected object");
16
+ for (const key of [
17
+ "kind",
18
+ "value",
19
+ "text"
20
+ ]) if (!(key in value)) throw new Error(`Missing key\n at ["${key}"]`);
21
+ if (!("kind" in value) || ![
22
+ "number",
23
+ "money",
24
+ "list",
25
+ "text"
26
+ ].includes(String(value.kind))) throw new Error("Expected \"number\" | \"money\" | \"list\" | \"text\"\n at [\"kind\"]");
27
+ if (!("value" in value) || !isJson(value.value)) throw new Error("Expected JSON value\n at [\"value\"]");
28
+ if (!("text" in value) || typeof value.text !== "string") throw new Error("Expected string\n at [\"text\"]");
29
+ let items;
30
+ if ("items" in value) {
31
+ if (!Array.isArray(value.items)) throw new Error("Expected array\n at [\"items\"]");
32
+ items = Array.from(value.items, (item, index) => {
33
+ if (typeof item !== "string") throw new Error(`Expected string\n at ["items"][${index}]`);
34
+ return item;
35
+ });
36
+ }
37
+ const kind = value.kind;
38
+ if (kind !== "number" && kind !== "money" && kind !== "list" && kind !== "text") throw new Error("Expected \"number\" | \"money\" | \"list\" | \"text\"\n at [\"kind\"]");
39
+ return {
40
+ kind,
41
+ value: value.value,
42
+ text: value.text,
43
+ ...items === void 0 ? {} : { items }
44
+ };
45
+ }
46
+ /** Decode facts loaded from an application module before shipping them to the runtime. */
47
+ function decodeFacts(input) {
48
+ if (typeof input !== "object" || input === null || Array.isArray(input)) throw new Error("Document facts must be an object");
49
+ return Object.fromEntries(Object.entries(input).map(([id, definition]) => {
50
+ if (!id) throw new Error("A document fact needs a nonempty id");
51
+ return [id, validateDefinition(definition)];
52
+ }));
53
+ }
54
+ /** Register code-owned values for ordinary React rendering as well as capture. */
55
+ function defineFacts(facts) {
56
+ for (const [id, definition] of Object.entries(facts)) {
57
+ if (!id) throw new Error("A document fact needs a nonempty id");
58
+ registeredFacts.set(id, validateDefinition(definition));
59
+ }
60
+ return facts;
61
+ }
62
+ function finite(value) {
63
+ if (!Number.isFinite(value)) throw new Error(`Document fact must be finite: ${value}`);
64
+ return value;
65
+ }
66
+ const fact = {
67
+ number(value, options) {
68
+ const validated = finite(value);
69
+ return {
70
+ kind: "number",
71
+ value: validated,
72
+ text: new Intl.NumberFormat("en-US", options).format(validated)
73
+ };
74
+ },
75
+ money(value, options = {}) {
76
+ const validated = finite(value);
77
+ const text = new Intl.NumberFormat("en-US", {
78
+ style: "currency",
79
+ currency: options.currency ?? "USD"
80
+ }).format(validated);
81
+ return {
82
+ kind: "money",
83
+ value: validated,
84
+ text: options.per === void 0 ? text : `${text} per ${options.per}`
85
+ };
86
+ },
87
+ list(values, options) {
88
+ const items = values.map((value) => options === void 0 ? String(value) : options.format(value));
89
+ return {
90
+ kind: "list",
91
+ value: [...values],
92
+ items,
93
+ text: new Intl.ListFormat("en-US", {
94
+ style: "long",
95
+ type: "conjunction"
96
+ }).format(items)
97
+ };
98
+ },
99
+ text(value) {
100
+ return {
101
+ kind: "text",
102
+ value,
103
+ text: value
104
+ };
105
+ }
106
+ };
107
+ function resolveFact(id, facts) {
108
+ const value = facts === void 0 ? registeredFacts.get(id) : facts[id];
109
+ if (value === void 0) throw new Error(`Unknown document fact "${id}"; register it with defineFacts`);
110
+ return value;
111
+ }
112
+ //#endregion
113
+ export { resolveFact as i, defineFacts as n, fact as r, decodeFacts as t };
114
+
115
+ //# sourceMappingURL=facts-1OKclPOk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facts-1OKclPOk.js","names":[],"sources":["../src/markdown/facts.ts"],"sourcesContent":["export type Json = null | boolean | number | string | ReadonlyArray<Json> | { readonly [key: string]: Json };\nexport interface FactDefinition {\n readonly kind: \"number\" | \"money\" | \"list\" | \"text\";\n readonly value: Json;\n readonly text: string;\n readonly items?: ReadonlyArray<string>;\n}\nexport type Facts = Readonly<Record<string, FactDefinition>>;\nconst registeredFacts = new Map<string, FactDefinition>();\n\nfunction isJson(value: unknown, parents = new Set<object>()): value is Json {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") return true;\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\" || parents.has(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n if (!Array.isArray(value) && prototype !== null && prototype !== Object.prototype) return false;\n parents.add(value);\n const entries = Array.isArray(value) ? Array.from(value) : Object.values(value);\n const valid = entries.every((entry) => isJson(entry, parents));\n parents.delete(value);\n return valid;\n}\nfunction validateDefinition(value: unknown): FactDefinition {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) throw new Error(\"Expected object\");\n for (const key of [\"kind\", \"value\", \"text\"]) {\n if (!(key in value)) throw new Error(`Missing key\\n at [\"${key}\"]`);\n }\n if (!(\"kind\" in value) || ![\"number\", \"money\", \"list\", \"text\"].includes(String(value.kind)))\n throw new Error('Expected \"number\" | \"money\" | \"list\" | \"text\"\\n at [\"kind\"]');\n if (!(\"value\" in value) || !isJson(value.value)) throw new Error('Expected JSON value\\n at [\"value\"]');\n if (!(\"text\" in value) || typeof value.text !== \"string\") throw new Error('Expected string\\n at [\"text\"]');\n let items: Array<string> | undefined;\n if (\"items\" in value) {\n if (!Array.isArray(value.items)) throw new Error('Expected array\\n at [\"items\"]');\n items = Array.from(value.items, (item, index) => {\n if (typeof item !== \"string\") throw new Error(`Expected string\\n at [\"items\"][${index}]`);\n return item;\n });\n }\n const kind = value.kind;\n if (kind !== \"number\" && kind !== \"money\" && kind !== \"list\" && kind !== \"text\")\n throw new Error('Expected \"number\" | \"money\" | \"list\" | \"text\"\\n at [\"kind\"]');\n return { kind, value: value.value, text: value.text, ...(items === undefined ? {} : { items }) };\n}\n\n/** Decode facts loaded from an application module before shipping them to the runtime. */\nexport function decodeFacts(input: unknown): Facts {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw new Error(\"Document facts must be an object\");\n }\n return Object.fromEntries(Object.entries(input).map(([id, definition]) => {\n if (!id) throw new Error(\"A document fact needs a nonempty id\");\n return [id, validateDefinition(definition)];\n }));\n}\n\n/** Register code-owned values for ordinary React rendering as well as capture. */\nexport function defineFacts<const F extends Facts>(facts: F): F {\n for (const [id, definition] of Object.entries(facts)) {\n if (!id) throw new Error(\"A document fact needs a nonempty id\");\n registeredFacts.set(id, validateDefinition(definition));\n }\n return facts;\n}\nfunction finite(value: number): number {\n if (!Number.isFinite(value)) throw new Error(`Document fact must be finite: ${value}`);\n return value;\n}\nexport const fact = {\n number(value: number, options?: Intl.NumberFormatOptions): FactDefinition {\n const validated = finite(value);\n return { kind: \"number\", value: validated, text: new Intl.NumberFormat(\"en-US\", options).format(validated) };\n },\n money(value: number, options: { currency?: string; per?: string } = {}): FactDefinition {\n const validated = finite(value);\n const text = new Intl.NumberFormat(\"en-US\", {\n style: \"currency\", currency: options.currency ?? \"USD\",\n }).format(validated);\n return { kind: \"money\", value: validated, text: options.per === undefined ? text : `${text} per ${options.per}` };\n },\n list<T extends Json>(values: ReadonlyArray<T>, options?: { format: (value: T) => string }): FactDefinition {\n const items = values.map((value) => options === undefined ? String(value) : options.format(value));\n return { kind: \"list\", value: [...values], items, text: new Intl.ListFormat(\"en-US\", { style: \"long\", type: \"conjunction\" }).format(items) };\n },\n text(value: string): FactDefinition { return { kind: \"text\", value, text: value }; },\n};\nexport function resolveFact(id: string, facts?: Facts): FactDefinition {\n const value = facts === undefined ? registeredFacts.get(id) : facts[id];\n if (value === undefined) throw new Error(`Unknown document fact \"${id}\"; register it with defineFacts`);\n return value;\n}\n"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ //#region node_modules/@earendil-works/pi-ai/dist/api/github-copilot-headers.js
2
+ function inferCopilotInitiator(messages) {
3
+ const last = messages[messages.length - 1];
4
+ return last && last.role !== "user" ? "agent" : "user";
5
+ }
6
+ function hasCopilotVisionInput(messages) {
7
+ return messages.some((msg) => {
8
+ if (msg.role === "user" && Array.isArray(msg.content)) return msg.content.some((c) => c.type === "image");
9
+ if (msg.role === "toolResult" && Array.isArray(msg.content)) return msg.content.some((c) => c.type === "image");
10
+ return false;
11
+ });
12
+ }
13
+ function buildCopilotDynamicHeaders(params) {
14
+ const headers = {
15
+ "X-Initiator": inferCopilotInitiator(params.messages),
16
+ "Openai-Intent": "conversation-edits"
17
+ };
18
+ if (params.hasImages) headers["Copilot-Vision-Request"] = "true";
19
+ return headers;
20
+ }
21
+ //#endregion
22
+ export { hasCopilotVisionInput as n, buildCopilotDynamicHeaders as t };
23
+
24
+ //# sourceMappingURL=github-copilot-headers-CEpMOpQF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-copilot-headers-CEpMOpQF.js","names":[],"sources":["../node_modules/@earendil-works/pi-ai/dist/api/github-copilot-headers.js"],"sourcesContent":["// Copilot expects X-Initiator to indicate whether the request is user-initiated\n// or agent-initiated (e.g. follow-up after assistant/tool messages).\nexport function inferCopilotInitiator(messages) {\n const last = messages[messages.length - 1];\n return last && last.role !== \"user\" ? \"agent\" : \"user\";\n}\n// Copilot requires Copilot-Vision-Request header when sending images\nexport function hasCopilotVisionInput(messages) {\n return messages.some((msg) => {\n if (msg.role === \"user\" && Array.isArray(msg.content)) {\n return msg.content.some((c) => c.type === \"image\");\n }\n if (msg.role === \"toolResult\" && Array.isArray(msg.content)) {\n return msg.content.some((c) => c.type === \"image\");\n }\n return false;\n });\n}\nexport function buildCopilotDynamicHeaders(params) {\n const headers = {\n \"X-Initiator\": inferCopilotInitiator(params.messages),\n \"Openai-Intent\": \"conversation-edits\",\n };\n if (params.hasImages) {\n headers[\"Copilot-Vision-Request\"] = \"true\";\n }\n return headers;\n}\n//# sourceMappingURL=github-copilot-headers.js.map"],"x_google_ignoreList":[0],"mappings":";AAEA,SAAgB,sBAAsB,UAAU;CAC5C,MAAM,OAAO,SAAS,SAAS,SAAS;CACxC,OAAO,QAAQ,KAAK,SAAS,SAAS,UAAU;AACpD;AAEA,SAAgB,sBAAsB,UAAU;CAC5C,OAAO,SAAS,MAAM,QAAQ;EAC1B,IAAI,IAAI,SAAS,UAAU,MAAM,QAAQ,IAAI,OAAO,GAChD,OAAO,IAAI,QAAQ,MAAM,MAAM,EAAE,SAAS,OAAO;EAErD,IAAI,IAAI,SAAS,gBAAgB,MAAM,QAAQ,IAAI,OAAO,GACtD,OAAO,IAAI,QAAQ,MAAM,MAAM,EAAE,SAAS,OAAO;EAErD,OAAO;CACX,CAAC;AACL;AACA,SAAgB,2BAA2B,QAAQ;CAC/C,MAAM,UAAU;EACZ,eAAe,sBAAsB,OAAO,QAAQ;EACpD,iBAAiB;CACrB;CACA,IAAI,OAAO,WACP,QAAQ,4BAA4B;CAExC,OAAO;AACX"}