@doxbrix/doxloop 0.1.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 (152) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/LICENSE +93 -0
  3. package/README.md +576 -0
  4. package/SECURITY.md +15 -0
  5. package/assets/brand/README.md +8 -0
  6. package/assets/brand/doxloop-favicon.png +0 -0
  7. package/assets/brand/doxloop-logo-dark.png +0 -0
  8. package/assets/brand/doxloop-logo-light.png +0 -0
  9. package/assets/doxbrix-preview.css +6672 -0
  10. package/dist/agents.d.ts +26 -0
  11. package/dist/agents.d.ts.map +1 -0
  12. package/dist/agents.js +258 -0
  13. package/dist/agents.js.map +1 -0
  14. package/dist/args.d.ts +8 -0
  15. package/dist/args.d.ts.map +1 -0
  16. package/dist/args.js +95 -0
  17. package/dist/args.js.map +1 -0
  18. package/dist/artifact-deploy.d.ts +8 -0
  19. package/dist/artifact-deploy.d.ts.map +1 -0
  20. package/dist/artifact-deploy.js +240 -0
  21. package/dist/artifact-deploy.js.map +1 -0
  22. package/dist/auth.d.ts +17 -0
  23. package/dist/auth.d.ts.map +1 -0
  24. package/dist/auth.js +245 -0
  25. package/dist/auth.js.map +1 -0
  26. package/dist/author.d.ts +30 -0
  27. package/dist/author.d.ts.map +1 -0
  28. package/dist/author.js +195 -0
  29. package/dist/author.js.map +1 -0
  30. package/dist/capture.d.ts +10 -0
  31. package/dist/capture.d.ts.map +1 -0
  32. package/dist/capture.js +299 -0
  33. package/dist/capture.js.map +1 -0
  34. package/dist/cli.d.ts +3 -0
  35. package/dist/cli.d.ts.map +1 -0
  36. package/dist/cli.js +558 -0
  37. package/dist/cli.js.map +1 -0
  38. package/dist/deploy.d.ts +22 -0
  39. package/dist/deploy.d.ts.map +1 -0
  40. package/dist/deploy.js +136 -0
  41. package/dist/deploy.js.map +1 -0
  42. package/dist/doctor.d.ts +18 -0
  43. package/dist/doctor.d.ts.map +1 -0
  44. package/dist/doctor.js +222 -0
  45. package/dist/doctor.js.map +1 -0
  46. package/dist/doxbrix-markdown.d.ts +20 -0
  47. package/dist/doxbrix-markdown.d.ts.map +1 -0
  48. package/dist/doxbrix-markdown.js +873 -0
  49. package/dist/doxbrix-markdown.js.map +1 -0
  50. package/dist/errors.d.ts +8 -0
  51. package/dist/errors.d.ts.map +1 -0
  52. package/dist/errors.js +15 -0
  53. package/dist/errors.js.map +1 -0
  54. package/dist/fs.d.ts +6 -0
  55. package/dist/fs.d.ts.map +1 -0
  56. package/dist/fs.js +77 -0
  57. package/dist/fs.js.map +1 -0
  58. package/dist/generator-api.d.ts +69 -0
  59. package/dist/generator-api.d.ts.map +1 -0
  60. package/dist/generator-api.js +6 -0
  61. package/dist/generator-api.js.map +1 -0
  62. package/dist/generator-manager.d.ts +13 -0
  63. package/dist/generator-manager.d.ts.map +1 -0
  64. package/dist/generator-manager.js +155 -0
  65. package/dist/generator-manager.js.map +1 -0
  66. package/dist/generator-runtime.d.ts +24 -0
  67. package/dist/generator-runtime.d.ts.map +1 -0
  68. package/dist/generator-runtime.js +265 -0
  69. package/dist/generator-runtime.js.map +1 -0
  70. package/dist/generators.d.ts +21 -0
  71. package/dist/generators.d.ts.map +1 -0
  72. package/dist/generators.js +202 -0
  73. package/dist/generators.js.map +1 -0
  74. package/dist/preview.d.ts +21 -0
  75. package/dist/preview.d.ts.map +1 -0
  76. package/dist/preview.js +691 -0
  77. package/dist/preview.js.map +1 -0
  78. package/dist/progress.d.ts +19 -0
  79. package/dist/progress.d.ts.map +1 -0
  80. package/dist/progress.js +70 -0
  81. package/dist/progress.js.map +1 -0
  82. package/dist/project.d.ts +37 -0
  83. package/dist/project.d.ts.map +1 -0
  84. package/dist/project.js +499 -0
  85. package/dist/project.js.map +1 -0
  86. package/dist/sync.d.ts +7 -0
  87. package/dist/sync.d.ts.map +1 -0
  88. package/dist/sync.js +221 -0
  89. package/dist/sync.js.map +1 -0
  90. package/dist/types.d.ts +141 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +2 -0
  93. package/dist/types.js.map +1 -0
  94. package/dist/validation.d.ts +4 -0
  95. package/dist/validation.d.ts.map +1 -0
  96. package/dist/validation.js +478 -0
  97. package/dist/validation.js.map +1 -0
  98. package/dist/version.d.ts +3 -0
  99. package/dist/version.d.ts.map +1 -0
  100. package/dist/version.js +5 -0
  101. package/dist/version.js.map +1 -0
  102. package/docs/agent-compatibility.md +41 -0
  103. package/docs/ci-and-automation.md +56 -0
  104. package/docs/doxbrix-http-api.md +182 -0
  105. package/docs/generator-authoring.md +59 -0
  106. package/docs/generator-selection.md +25 -0
  107. package/docs/project-format.md +97 -0
  108. package/docs/security-model.md +90 -0
  109. package/docs/troubleshooting.md +103 -0
  110. package/package.json +87 -0
  111. package/skills/doxloop-authoring/SKILL.md +381 -0
  112. package/skills/doxloop-authoring/agents/openai.yaml +4 -0
  113. package/skills/doxloop-authoring/assets/screenshot-highlight.js +83 -0
  114. package/skills/doxloop-authoring/references/accessibility.md +54 -0
  115. package/skills/doxloop-authoring/references/audience-flavors.md +93 -0
  116. package/skills/doxloop-authoring/references/branding.md +50 -0
  117. package/skills/doxloop-authoring/references/documentation-types.md +236 -0
  118. package/skills/doxloop-authoring/references/domain-ai-ml.md +67 -0
  119. package/skills/doxloop-authoring/references/domain-api-platform.md +68 -0
  120. package/skills/doxloop-authoring/references/domain-cli-tool.md +65 -0
  121. package/skills/doxloop-authoring/references/domain-data-platform.md +65 -0
  122. package/skills/doxloop-authoring/references/domain-developer-library.md +63 -0
  123. package/skills/doxloop-authoring/references/domain-ecommerce.md +63 -0
  124. package/skills/doxloop-authoring/references/domain-infrastructure-devops.md +67 -0
  125. package/skills/doxloop-authoring/references/domain-payments-fintech.md +69 -0
  126. package/skills/doxloop-authoring/references/domain-saas.md +71 -0
  127. package/skills/doxloop-authoring/references/domain-security-identity.md +65 -0
  128. package/skills/doxloop-authoring/references/editorial-style.md +105 -0
  129. package/skills/doxloop-authoring/references/examples-and-evidence.md +71 -0
  130. package/skills/doxloop-authoring/references/navigation-architecture.md +152 -0
  131. package/skills/doxloop-authoring/references/project-format.md +119 -0
  132. package/skills/doxloop-authoring/references/quality.md +122 -0
  133. package/skills/doxloop-authoring/references/reference-sites.md +207 -0
  134. package/skills/doxloop-authoring/references/screenshots.md +251 -0
  135. package/skills/doxloop-authoring/references/template-routing.md +94 -0
  136. package/skills/doxloop-authoring/references/type-administrator-guide.md +59 -0
  137. package/skills/doxloop-authoring/references/type-api-reference.md +66 -0
  138. package/skills/doxloop-authoring/references/type-architecture-concepts.md +61 -0
  139. package/skills/doxloop-authoring/references/type-cli-manual.md +61 -0
  140. package/skills/doxloop-authoring/references/type-deployment-operations.md +64 -0
  141. package/skills/doxloop-authoring/references/type-developer-portal.md +69 -0
  142. package/skills/doxloop-authoring/references/type-getting-started.md +59 -0
  143. package/skills/doxloop-authoring/references/type-integration-guide.md +59 -0
  144. package/skills/doxloop-authoring/references/type-migration-release.md +66 -0
  145. package/skills/doxloop-authoring/references/type-sdk-guide.md +63 -0
  146. package/skills/doxloop-authoring/references/type-troubleshooting-kb.md +63 -0
  147. package/skills/doxloop-authoring/references/type-user-guide.md +59 -0
  148. package/skills/doxloop-doxbrix/SKILL.md +83 -0
  149. package/skills/doxloop-doxbrix/agents/openai.yaml +4 -0
  150. package/skills/doxloop-doxbrix/references/api-endpoints.md +128 -0
  151. package/skills/doxloop-doxbrix/references/components.md +137 -0
  152. package/skills/doxloop-doxbrix/references/manifest.md +117 -0
@@ -0,0 +1,240 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { createHash } from 'node:crypto';
3
+ import { lstat, readdir, readFile } from 'node:fs/promises';
4
+ import { basename, extname, relative, resolve, sep } from 'node:path';
5
+ import { zipSync } from 'fflate';
6
+ import { apiUrl, authenticatedRequest, authenticatedRequestOptional } from './auth.js';
7
+ import { DoxloopError } from './errors.js';
8
+ import { loadGeneratorAdapter } from './generators.js';
9
+ import { loadProject } from './project.js';
10
+ import { createStepList, formatDuration } from './progress.js';
11
+ import { validateProject } from './validation.js';
12
+ const MAX_ZIP_BYTES = 100 * 1024 * 1024;
13
+ const MAX_FILES = 20_000;
14
+ const MAX_UNCOMPRESSED_BYTES = 300 * 1024 * 1024;
15
+ const MAX_FILE_BYTES = 50 * 1024 * 1024;
16
+ const POLL_TIMEOUT_MS = 20 * 60_000;
17
+ export async function deployGeneratedSite(options) {
18
+ const project = await loadProject(options.root);
19
+ const adapter = await loadGeneratorAdapter(options.root, project);
20
+ const steps = createStepList();
21
+ process.stdout.write(`Deploying "${options.name}" → ${apiUrl(options.apiUrl)}\n\n`);
22
+ try {
23
+ const validating = steps.start('Validating documentation');
24
+ const validation = await validateProject(options.root);
25
+ if (validation.errors > 0) {
26
+ throw new DoxloopError(`Deployment stopped because documentation has ${validation.errors} validation error${validation.errors === 1 ? '' : 's'}. Run \`doxloop test\`.`);
27
+ }
28
+ validating.done('Validated documentation');
29
+ let target;
30
+ let siteUrl = process.env.DOXLOOP_SITE_URL || 'https://example.com';
31
+ if (!options.dryRun) {
32
+ const locating = steps.start('Locating project');
33
+ const existing = await authenticatedRequestOptional(`/api/v1/projects/${encodeURIComponent(options.slug)}`, { method: 'GET' }, options.apiUrl);
34
+ if (existing?.project) {
35
+ target = existing.project;
36
+ assertArtifactProject(target, project.generator);
37
+ locating.done(`Found project "${target.name}" (${target.slug})`);
38
+ }
39
+ else {
40
+ const created = await authenticatedRequest('/api/v1/projects', {
41
+ method: 'POST',
42
+ headers: { 'Content-Type': 'application/json' },
43
+ body: JSON.stringify({
44
+ name: options.name,
45
+ slug: options.slug,
46
+ seedTemplate: false,
47
+ connectedArtifact: { generator: project.generator },
48
+ }),
49
+ }, options.apiUrl);
50
+ target = created.project;
51
+ assertArtifactProject(target, project.generator);
52
+ locating.done(`Created hosted project "${target.name}" (${target.slug})`);
53
+ }
54
+ if (!target.hostedUrl)
55
+ throw new DoxloopError('Doxbrix did not return a hosted site URL for this project.');
56
+ siteUrl = target.hostedUrl;
57
+ }
58
+ const building = steps.start(`Building ${adapter.displayName} site locally`);
59
+ await runLocalBuild(adapter.id, adapter.build.command, options.root, siteUrl);
60
+ const outputRoot = containedOutput(options.root, adapter.build.outputDir);
61
+ const packaged = await packageStaticOutput(outputRoot);
62
+ building.done(`Built ${adapter.displayName} artifact`, `${packaged.files} files, ${formatBytes(packaged.archive.byteLength)}${packaged.omittedSourceMaps ? `, omitted ${packaged.omittedSourceMaps} source maps` : ''}`);
63
+ if (options.dryRun) {
64
+ process.stdout.write(`\nDeployment is valid.\nGenerator: ${project.generator}\nOutput: ${adapter.build.outputDir}\nFiles: ${packaged.files}\nArtifact: ${formatBytes(packaged.archive.byteLength)}\nSHA-256: ${packaged.sha256}\nNo data was uploaded.\n`);
65
+ return;
66
+ }
67
+ if (!target)
68
+ throw new DoxloopError('Doxbrix project resolution failed.');
69
+ const reserving = steps.start('Reserving secure upload');
70
+ const reserved = await authenticatedRequest(`/api/v1/projects/${encodeURIComponent(target.id)}/deployments`, {
71
+ method: 'POST',
72
+ headers: { 'Content-Type': 'application/json' },
73
+ body: JSON.stringify({ bytes: packaged.archive.byteLength, sha256: packaged.sha256 }),
74
+ }, options.apiUrl);
75
+ if (reserved.deployment.alreadyRunning || !reserved.deployment.upload) {
76
+ throw new DoxloopError(`A deployment is already running for this project (${reserved.deployment.buildId}).`);
77
+ }
78
+ reserving.done('Reserved checksum-bound upload');
79
+ const uploading = steps.start('Uploading static artifact');
80
+ await uploadArtifact(reserved.deployment.upload, packaged.archive);
81
+ uploading.done('Uploaded static artifact', formatBytes(packaged.archive.byteLength));
82
+ const deploying = steps.start('Indexing and deploying on Doxbrix');
83
+ await authenticatedRequest(`/api/v1/projects/${encodeURIComponent(target.id)}/deployments/${encodeURIComponent(reserved.deployment.buildId)}/complete`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}' }, options.apiUrl);
84
+ const result = await waitForDeployment(target.id, reserved.deployment.buildId, options.apiUrl);
85
+ if (result.status !== 'ready')
86
+ throw new DoxloopError(result.error || `Deployment ended with status ${result.status}.`);
87
+ deploying.done('Deployed', `${result.fileCount ?? packaged.files} files, ${result.pagesIndexed ?? 0} pages indexed · ${formatDuration(deploying.durationMs)}`);
88
+ process.stdout.write(`\n${result.hostedUrl || target.hostedUrl}\n`);
89
+ }
90
+ catch (error) {
91
+ steps.failActive();
92
+ throw error;
93
+ }
94
+ }
95
+ function assertArtifactProject(project, generator) {
96
+ if (project.kind !== 'connected' || project.source !== 'bundle') {
97
+ throw new DoxloopError(`Project "${project.slug}" already exists but is not a Connected Docs artifact project. Choose another --slug.`);
98
+ }
99
+ if (project.generator !== generator) {
100
+ throw new DoxloopError(`Project "${project.slug}" expects generator "${project.generator ?? 'unknown'}", but this Doxloop project uses "${generator}". Choose another --slug.`);
101
+ }
102
+ }
103
+ function containedOutput(root, outputDir) {
104
+ const base = resolve(root);
105
+ const output = resolve(base, outputDir);
106
+ if (output === base || !output.startsWith(`${base}${sep}`)) {
107
+ throw new DoxloopError(`Generator output directory must be inside the project: ${outputDir}`);
108
+ }
109
+ return output;
110
+ }
111
+ async function runLocalBuild(generator, command, root, siteUrl) {
112
+ const environment = { ...process.env, DOXLOOP_SITE_URL: siteUrl, SITE_URL: siteUrl };
113
+ delete environment.DOXLOOP_TOKEN;
114
+ delete environment.DOXBRIX_TOKEN;
115
+ const effectiveCommand = generator === 'hugo'
116
+ ? `${command} --baseURL ${JSON.stringify(`${siteUrl.replace(/\/$/, '')}/`)}`
117
+ : generator === 'jekyll'
118
+ ? `${command} --url ${JSON.stringify(siteUrl.replace(/\/$/, ''))}`
119
+ : command;
120
+ const code = await new Promise((resolveExit, reject) => {
121
+ const child = spawn(effectiveCommand, {
122
+ cwd: root,
123
+ env: environment,
124
+ shell: true,
125
+ stdio: 'inherit',
126
+ });
127
+ child.once('error', reject);
128
+ child.once('exit', (value) => resolveExit(value ?? 1));
129
+ });
130
+ if (code !== 0) {
131
+ throw new DoxloopError(`Local generator build failed (exit ${code}). Doxloop does not install dependencies during deploy; install them and run \`${command}\` locally to diagnose.`);
132
+ }
133
+ }
134
+ async function packageStaticOutput(root) {
135
+ let rootStat;
136
+ try {
137
+ rootStat = await lstat(root);
138
+ }
139
+ catch {
140
+ throw new DoxloopError(`Generator build output was not found: ${root}`);
141
+ }
142
+ if (!rootStat.isDirectory() || rootStat.isSymbolicLink())
143
+ throw new DoxloopError('Generator build output must be a real directory, not a symbolic link.');
144
+ const entries = {};
145
+ let files = 0;
146
+ let bytes = 0;
147
+ let omittedSourceMaps = 0;
148
+ let hasIndex = false;
149
+ const visit = async (directory) => {
150
+ for (const item of await readdir(directory, { withFileTypes: true })) {
151
+ const absolute = resolve(directory, item.name);
152
+ const path = relative(root, absolute).split(sep).join('/');
153
+ const stat = await lstat(absolute);
154
+ if (stat.isSymbolicLink())
155
+ throw new DoxloopError(`Build output contains a symbolic link, which cannot be deployed safely: ${path}`);
156
+ if (stat.isDirectory()) {
157
+ await visit(absolute);
158
+ continue;
159
+ }
160
+ if (!stat.isFile())
161
+ throw new DoxloopError(`Build output contains an unsupported file type: ${path}`);
162
+ if (extname(path).toLowerCase() === '.map') {
163
+ omittedSourceMaps++;
164
+ continue;
165
+ }
166
+ assertSafeArtifactName(path);
167
+ if (stat.size > MAX_FILE_BYTES)
168
+ throw new DoxloopError(`Build output file exceeds ${formatBytes(MAX_FILE_BYTES)}: ${path}`);
169
+ files++;
170
+ bytes += stat.size;
171
+ if (files > MAX_FILES)
172
+ throw new DoxloopError(`Build output contains more than ${MAX_FILES} files.`);
173
+ if (bytes > MAX_UNCOMPRESSED_BYTES)
174
+ throw new DoxloopError(`Build output exceeds ${formatBytes(MAX_UNCOMPRESSED_BYTES)} before compression.`);
175
+ const data = await readFile(absolute);
176
+ const text = data.toString('utf8');
177
+ if (/-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/.test(text)) {
178
+ throw new DoxloopError(`Build output appears to contain a private key: ${path}`);
179
+ }
180
+ const activeTokens = [process.env.DOXLOOP_TOKEN, process.env.DOXBRIX_TOKEN].filter((value) => Boolean(value && value.length >= 12));
181
+ if (activeTokens.some((token) => text.includes(token)) || /\bdxb_[A-Za-z0-9_-]{20,}\b/.test(text)) {
182
+ throw new DoxloopError(`Build output appears to contain a Doxbrix access token: ${path}`);
183
+ }
184
+ entries[path] = new Uint8Array(data);
185
+ if (path === 'index.html')
186
+ hasIndex = true;
187
+ }
188
+ };
189
+ await visit(root);
190
+ if (!hasIndex)
191
+ throw new DoxloopError('Generator output does not contain a root index.html file.');
192
+ if (files === 0)
193
+ throw new DoxloopError('Generator produced no deployable files.');
194
+ const archive = zipSync(entries, { level: 6 });
195
+ if (archive.byteLength > MAX_ZIP_BYTES)
196
+ throw new DoxloopError(`Compressed artifact exceeds ${formatBytes(MAX_ZIP_BYTES)}.`);
197
+ return { archive, files, omittedSourceMaps, sha256: createHash('sha256').update(archive).digest('hex') };
198
+ }
199
+ function assertSafeArtifactName(path) {
200
+ const name = basename(path).toLowerCase();
201
+ if (name === '.env' || name.startsWith('.env.') || name === 'id_rsa' || name === 'id_ed25519' ||
202
+ name === 'credentials' || name.endsWith('.pem') || name.endsWith('.key') || name.endsWith('.p12') || name.endsWith('.pfx')) {
203
+ throw new DoxloopError(`Build output contains a likely secret file: ${path}`);
204
+ }
205
+ }
206
+ async function uploadArtifact(upload, bytes) {
207
+ let response;
208
+ try {
209
+ response = await fetch(upload.url, {
210
+ method: upload.method,
211
+ headers: upload.headers,
212
+ body: bytes,
213
+ redirect: 'error',
214
+ });
215
+ }
216
+ catch (error) {
217
+ throw new DoxloopError(`Artifact upload failed: ${error instanceof Error ? error.message : String(error)}`);
218
+ }
219
+ if (!response.ok)
220
+ throw new DoxloopError(`Artifact upload failed: ${response.status} ${response.statusText}`);
221
+ }
222
+ async function waitForDeployment(projectId, buildId, override) {
223
+ const deadline = Date.now() + POLL_TIMEOUT_MS;
224
+ for (;;) {
225
+ const response = await authenticatedRequest(`/api/v1/projects/${encodeURIComponent(projectId)}/deployments/${encodeURIComponent(buildId)}`, { method: 'GET' }, override);
226
+ if (response.deployment.status === 'ready' || response.deployment.status === 'failed' || response.deployment.status === 'canceled')
227
+ return response.deployment;
228
+ if (Date.now() >= deadline)
229
+ throw new DoxloopError(`Deployment is still running after ${POLL_TIMEOUT_MS / 60_000} minutes. Check it in Doxbrix: ${apiUrl(override)}`);
230
+ await new Promise((resolveWait) => setTimeout(resolveWait, 2_000));
231
+ }
232
+ }
233
+ function formatBytes(bytes) {
234
+ if (bytes < 1024)
235
+ return `${bytes} B`;
236
+ if (bytes < 1024 * 1024)
237
+ return `${(bytes / 1024).toFixed(1)} KiB`;
238
+ return `${(bytes / 1024 / 1024).toFixed(1)} MiB`;
239
+ }
240
+ //# sourceMappingURL=artifact-deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-deploy.js","sourceRoot":"","sources":["../src/artifact-deploy.ts"],"names":[],"mappings":"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"}
package/dist/auth.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ interface UserConfig {
2
+ apiUrl: string;
3
+ token?: string;
4
+ }
5
+ export declare function apiUrl(override?: string): string;
6
+ export declare function loadUserConfig(): Promise<UserConfig>;
7
+ export declare function saveToken(token: string, baseUrl: string): Promise<void>;
8
+ export declare function logout(): Promise<void>;
9
+ export declare function login(options: {
10
+ apiUrl?: string;
11
+ token?: string;
12
+ }): Promise<void>;
13
+ export declare function whoami(override?: string): Promise<void>;
14
+ export declare function authenticatedRequest<T>(path: string, init: RequestInit, override?: string): Promise<T>;
15
+ export declare function authenticatedRequestOptional<T>(path: string, init: RequestInit, override?: string): Promise<T | undefined>;
16
+ export {};
17
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAWA,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAqBD,wBAAgB,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAwBhD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,CAS1D;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7E;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAE5C;AAED,wBAAsB,KAAK,CAAC,OAAO,EAAE;IACnC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDhB;AA+DD,wBAAsB,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS7D;AAED,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,CAAC,CAGZ;AAED,wBAAsB,4BAA4B,CAAC,CAAC,EAClD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAExB"}
package/dist/auth.js ADDED
@@ -0,0 +1,245 @@
1
+ import { chmod, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
2
+ import { homedir, hostname } from 'node:os';
3
+ import { dirname, join } from 'node:path';
4
+ import { spawn } from 'node:child_process';
5
+ import { DoxloopError } from './errors.js';
6
+ import { pathExists } from './fs.js';
7
+ const DEFAULT_API_URL = 'https://app.doxbrix.com';
8
+ const TOKEN_PREFIX = 'dxb_';
9
+ const DEVICE_SCOPES = ['docs:read', 'docs:write', 'project:read', 'project:admin'];
10
+ export function apiUrl(override) {
11
+ const raw = override ?? process.env.DOXLOOP_API_URL ?? DEFAULT_API_URL;
12
+ let parsed;
13
+ try {
14
+ parsed = new URL(raw);
15
+ }
16
+ catch {
17
+ throw new DoxloopError(`Invalid Doxbrix API URL: ${raw}`, 2);
18
+ }
19
+ if (parsed.username || parsed.password || parsed.search || parsed.hash) {
20
+ throw new DoxloopError('The Doxbrix API URL cannot contain credentials, a query, or a fragment.', 2);
21
+ }
22
+ if (parsed.protocol !== 'https:' &&
23
+ !(parsed.protocol === 'http:' && isLoopbackHost(parsed.hostname))) {
24
+ throw new DoxloopError('The Doxbrix API URL must use HTTPS. HTTP is allowed only for localhost development.', 2);
25
+ }
26
+ return parsed.toString().replace(/\/+$/, '');
27
+ }
28
+ export async function loadUserConfig() {
29
+ const path = configPath();
30
+ if (!(await pathExists(path)))
31
+ return { apiUrl: apiUrl() };
32
+ try {
33
+ const parsed = JSON.parse(await readFile(path, 'utf8'));
34
+ return { apiUrl: apiUrl(parsed.apiUrl), ...(parsed.token ? { token: parsed.token } : {}) };
35
+ }
36
+ catch {
37
+ throw new DoxloopError(`Cannot read Doxloop credentials at ${path}.`);
38
+ }
39
+ }
40
+ export async function saveToken(token, baseUrl) {
41
+ const path = configPath();
42
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
43
+ await writeFile(path, `${JSON.stringify({ apiUrl: baseUrl, token }, null, 2)}\n`, {
44
+ encoding: 'utf8',
45
+ mode: 0o600,
46
+ });
47
+ if (process.platform !== 'win32')
48
+ await chmod(path, 0o600);
49
+ }
50
+ export async function logout() {
51
+ await rm(configPath(), { force: true });
52
+ }
53
+ export async function login(options) {
54
+ const baseUrl = apiUrl(options.apiUrl);
55
+ const directToken = options.token ?? process.env.DOXLOOP_TOKEN ?? process.env.DOXBRIX_TOKEN;
56
+ if (directToken) {
57
+ await verifyAndSaveToken(baseUrl, directToken);
58
+ return;
59
+ }
60
+ let start;
61
+ try {
62
+ start = await requestJson(`${baseUrl}/api/v1/auth/device/start`, {
63
+ method: 'POST',
64
+ headers: { 'Content-Type': 'application/json' },
65
+ body: JSON.stringify({ name: `doxloop @ ${hostname()}`, scopes: DEVICE_SCOPES }),
66
+ });
67
+ }
68
+ catch {
69
+ // The server may not offer the device flow; fall back to token paste.
70
+ start = undefined;
71
+ }
72
+ if (!start) {
73
+ process.stdout.write(`Browser sign-in is unavailable.\nCreate a token at ${baseUrl}/settings/tokens and paste it below.\n`);
74
+ if (!process.stdin.isTTY) {
75
+ throw new DoxloopError('Pass --token dxb_… (stdin is not a TTY).');
76
+ }
77
+ await verifyAndSaveToken(baseUrl, await readSecret('Token: '));
78
+ return;
79
+ }
80
+ process.stdout.write(`Open ${start.verificationUri}\nEnter code: ${start.userCode}\n`);
81
+ openBrowser(`${start.verificationUri}?code=${encodeURIComponent(start.userCode)}`);
82
+ const deadline = Date.now() + start.expiresIn * 1000;
83
+ while (Date.now() < deadline) {
84
+ await delay(Math.max(2, start.interval) * 1000);
85
+ let poll;
86
+ try {
87
+ poll = await requestJson(`${baseUrl}/api/v1/auth/device/poll`, {
88
+ method: 'POST',
89
+ headers: { 'Content-Type': 'application/json' },
90
+ body: JSON.stringify({ deviceCode: start.deviceCode }),
91
+ });
92
+ }
93
+ catch {
94
+ continue;
95
+ }
96
+ if (poll.status === 'expired')
97
+ break;
98
+ if (poll.status === 'approved') {
99
+ await verifyAndSaveToken(baseUrl, poll.token);
100
+ return;
101
+ }
102
+ }
103
+ throw new DoxloopError('Doxbrix authorization expired. Run `doxloop login` again.');
104
+ }
105
+ async function verifyAndSaveToken(baseUrl, token) {
106
+ if (!token.startsWith(TOKEN_PREFIX)) {
107
+ throw new DoxloopError(`That does not look like a Doxbrix token (expected a "${TOKEN_PREFIX}" prefix). Create one in the Doxbrix web app under Settings > Tokens.`);
108
+ }
109
+ const user = await verifyToken(baseUrl, token);
110
+ await saveToken(token, baseUrl);
111
+ process.stdout.write(`Signed in to Doxbrix as ${user.email}.\n`);
112
+ }
113
+ function readSecret(promptText) {
114
+ process.stdout.write(promptText);
115
+ return new Promise((resolveSecret, reject) => {
116
+ const stdin = process.stdin;
117
+ stdin.setRawMode(true);
118
+ stdin.resume();
119
+ stdin.setEncoding('utf8');
120
+ let value = '';
121
+ const cleanup = () => {
122
+ stdin.setRawMode(false);
123
+ stdin.pause();
124
+ stdin.off('data', onData);
125
+ };
126
+ const onData = (chunk) => {
127
+ for (const character of chunk) {
128
+ if (character === '\u0003') {
129
+ cleanup();
130
+ process.stdout.write('\n');
131
+ reject(new DoxloopError('Sign-in cancelled.'));
132
+ return;
133
+ }
134
+ if (character === '\r' || character === '\n') {
135
+ cleanup();
136
+ process.stdout.write('\n');
137
+ resolveSecret(value.trim());
138
+ return;
139
+ }
140
+ if (character === '\u007f' || character === '\b') {
141
+ value = value.slice(0, -1);
142
+ continue;
143
+ }
144
+ value += character;
145
+ }
146
+ };
147
+ stdin.on('data', onData);
148
+ });
149
+ }
150
+ async function verifyToken(baseUrl, token) {
151
+ try {
152
+ return await requestJson(`${baseUrl}/api/v1/me`, {
153
+ headers: { Authorization: `Bearer ${token}` },
154
+ });
155
+ }
156
+ catch {
157
+ throw new DoxloopError('That token was rejected by the API. Check the token and --api-url, then try again.');
158
+ }
159
+ }
160
+ export async function whoami(override) {
161
+ const config = await loadUserConfig();
162
+ const token = config.token ?? process.env.DOXLOOP_TOKEN ?? process.env.DOXBRIX_TOKEN;
163
+ if (!token)
164
+ throw new DoxloopError('Not signed in. Run `doxloop login`.');
165
+ const account = await requestJson(`${apiUrl(override ?? config.apiUrl)}/api/v1/me`, { headers: { Authorization: `Bearer ${token}` } });
166
+ process.stdout.write(`${account.email}${account.name ? ` (${account.name})` : ''}\n`);
167
+ }
168
+ export async function authenticatedRequest(path, init, override) {
169
+ const result = await authenticatedRequestInternal(path, init, override, false);
170
+ return result;
171
+ }
172
+ export async function authenticatedRequestOptional(path, init, override) {
173
+ return authenticatedRequestInternal(path, init, override, true);
174
+ }
175
+ async function authenticatedRequestInternal(path, init, override, allowNotFound) {
176
+ const config = await loadUserConfig();
177
+ const token = config.token ?? process.env.DOXLOOP_TOKEN ?? process.env.DOXBRIX_TOKEN;
178
+ if (!token)
179
+ throw new DoxloopError('Not signed in. Run `doxloop login` first.');
180
+ const headers = new Headers(init.headers);
181
+ headers.set('Authorization', `Bearer ${token}`);
182
+ const url = `${apiUrl(override ?? config.apiUrl)}${path}`;
183
+ let response;
184
+ try {
185
+ response = await fetch(url, { ...init, headers, redirect: 'error' });
186
+ }
187
+ catch (error) {
188
+ throw new DoxloopError(`Cannot connect to ${new URL(url).origin}: ${error instanceof Error ? error.message : String(error)}`);
189
+ }
190
+ if (allowNotFound && response.status === 404)
191
+ return undefined;
192
+ if (!response.ok)
193
+ throw await responseError(response);
194
+ return (await response.json());
195
+ }
196
+ async function requestJson(url, init) {
197
+ let response;
198
+ try {
199
+ response = await fetch(url, { ...init, redirect: 'error' });
200
+ }
201
+ catch (error) {
202
+ throw new DoxloopError(`Cannot connect to ${new URL(url).origin}: ${error instanceof Error ? error.message : String(error)}`);
203
+ }
204
+ if (!response.ok)
205
+ throw await responseError(response);
206
+ return (await response.json());
207
+ }
208
+ function isLoopbackHost(hostname) {
209
+ const normalized = hostname.replace(/^\[|\]$/g, '').toLowerCase();
210
+ return (normalized === 'localhost' ||
211
+ normalized === '::1' ||
212
+ /^127(?:\.\d{1,3}){3}$/.test(normalized));
213
+ }
214
+ async function responseError(response) {
215
+ let message = `${response.status} ${response.statusText}`;
216
+ try {
217
+ const body = (await response.json());
218
+ if (typeof body.error === 'string')
219
+ message = body.error;
220
+ else if (body.error?.message)
221
+ message = body.error.message;
222
+ else if (body.message)
223
+ message = body.message;
224
+ }
225
+ catch {
226
+ // Keep the HTTP status when the response is not JSON.
227
+ }
228
+ return new DoxloopError(`Doxbrix API error: ${message}`);
229
+ }
230
+ function configPath() {
231
+ if (process.platform === 'win32') {
232
+ return join(process.env.APPDATA ?? join(homedir(), 'AppData', 'Roaming'), 'doxloop', 'config.json');
233
+ }
234
+ return join(process.env.XDG_CONFIG_HOME ?? join(homedir(), '.config'), 'doxloop', 'config.json');
235
+ }
236
+ function openBrowser(url) {
237
+ const command = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
238
+ const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
239
+ const child = spawn(command, args, { detached: true, stdio: 'ignore' });
240
+ child.unref();
241
+ }
242
+ function delay(milliseconds) {
243
+ return new Promise((resolveDelay) => setTimeout(resolveDelay, milliseconds));
244
+ }
245
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { AgentName, ApplicationConfig, DocumentationBrief, GeneratorName } from './types.js';
2
+ export type AuthorMode = 'create' | 'update' | 'review';
3
+ export type ScreenshotIntent = 'auto' | 'enabled' | 'disabled';
4
+ export declare function resolveScreenshotIntent(enabled: boolean, disabled: boolean): ScreenshotIntent;
5
+ declare const REASONING_LEVELS: readonly ["minimal", "low", "medium", "high", "xhigh"];
6
+ export type ReasoningLevel = (typeof REASONING_LEVELS)[number];
7
+ export declare function parseReasoning(value: string | undefined): ReasoningLevel | undefined;
8
+ export declare function runAuthor(options: {
9
+ root: string;
10
+ mode: AuthorMode;
11
+ agent?: AgentName;
12
+ print?: boolean;
13
+ request?: string;
14
+ model?: string;
15
+ reasoning?: ReasoningLevel;
16
+ screenshots?: ScreenshotIntent;
17
+ }): Promise<number>;
18
+ export declare function agentArguments(name: AgentName, prompt: string, options?: {
19
+ model?: string;
20
+ reasoning?: ReasoningLevel;
21
+ mode?: AuthorMode;
22
+ }): string[];
23
+ export declare function authorPrompt(mode: AuthorMode, sources: Array<{
24
+ name: string;
25
+ path: string;
26
+ }>, request?: string, generator?: GeneratorName, documentation?: DocumentationBrief, designReferences?: Array<{
27
+ url: string;
28
+ }>, changeSummary?: string, screenshots?: ScreenshotIntent, application?: ApplicationConfig): string;
29
+ export {};
30
+ //# sourceMappingURL=author.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"author.d.ts","sourceRoot":"","sources":["../src/author.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACd,MAAM,YAAY,CAAA;AAEnB,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AACvD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAA;AAE9D,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,GAChB,gBAAgB,CAOlB;AAED,QAAA,MAAM,gBAAgB,wDAAyD,CAAA;AAC/E,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE9D,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAMpF;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,cAAc,CAAA;IAC1B,WAAW,CAAC,EAAE,gBAAgB,CAAA;CAC/B,GAAG,OAAO,CAAC,MAAM,CAAC,CAiGlB;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,cAAc,CAAA;IAC1B,IAAI,CAAC,EAAE,UAAU,CAAA;CACb,GACL,MAAM,EAAE,CA8BV;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC9C,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,GAAE,aAAyB,EACpC,aAAa,CAAC,EAAE,kBAAkB,EAClC,gBAAgB,GAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAM,EAC7C,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,GAAE,gBAAyB,EACtC,WAAW,CAAC,EAAE,iBAAiB,GAC9B,MAAM,CA2DR"}