@bendyline/docblocks 2.7.5 → 2.7.7

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.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  HOST_WIRE_LIMITS,
3
3
  isBoundedString
4
- } from "./chunk-46AGYHDY.js";
4
+ } from "./chunk-V5SWLUZY.js";
5
5
 
6
6
  // src/host/capabilities.ts
7
7
  var HOST_SURFACE_KINDS = Object.freeze([
@@ -29,6 +29,7 @@ var NO_CAPABILITIES = Object.freeze({
29
29
  exportRememberedTargets: false,
30
30
  openSavedExports: false,
31
31
  externalResources: false,
32
+ externalRelativeMedia: false,
32
33
  openRequests: false,
33
34
  menuCommands: false,
34
35
  pinnedDocumentMirror: false,
@@ -107,6 +108,7 @@ function deriveHostCapabilities(host) {
107
108
  exportRememberedTargets: hasMethod(exports, "resolveTarget") && hasMethod(exports, "pickTarget"),
108
109
  openSavedExports: hasMethod(exports, "openSaved"),
109
110
  externalResources: hasMethod(host.external, "readText"),
111
+ externalRelativeMedia: hasMethod(host.external, "readRelativeMedia"),
110
112
  openRequests: hasMethod(host, "onOpenRequest"),
111
113
  menuCommands: hasMethod(host, "onMenuCommand"),
112
114
  pinnedDocumentMirror: hasMethod(host.menu, "setPinnedDocuments"),
@@ -149,6 +151,26 @@ var AI_WIRE_LIMITS = Object.freeze({
149
151
  responseSchemaCharacters: 16 * 1024,
150
152
  verificationCodeCharacters: 16,
151
153
  progressPhaseCharacters: 64,
154
+ /** Catalogs, and titles per catalog, one request can cite; Gezel sends at most 8 passages. */
155
+ knowledgeSources: 8,
156
+ knowledgeTitles: 8,
157
+ knowledgeTitleCharacters: 256,
158
+ /** A knowledge search; Gezel accepts up to 8,192 characters. */
159
+ knowledgeQueryCharacters: 8192,
160
+ /** Passage texts sent with a knowledge report; Gezel caps a retrieval at 24,000 characters. */
161
+ knowledgeEvidence: 8,
162
+ knowledgeEvidenceCharacters: 24 * 1024,
163
+ /**
164
+ * A fact check reads one draft against every passage its run was given. It
165
+ * runs synchronously in the host; at these bounds it takes tens of ms.
166
+ */
167
+ factCheckTextCharacters: 64 * 1024,
168
+ factCheckEvidence: 64,
169
+ factCheckEvidenceCharacters: 128 * 1024,
170
+ factCheckGivenCharacters: 128 * 1024,
171
+ factCheckSentences: 50,
172
+ factCheckSentenceCharacters: 1e3,
173
+ factCheckDetails: 16,
152
174
  modelEntries: 200,
153
175
  contextWindowCeiling: 8e6,
154
176
  downloadBytesCeiling: Number.MAX_SAFE_INTEGER
@@ -394,7 +416,14 @@ function parseAiChatRequest(value) {
394
416
  if (!hasKeysWithin(
395
417
  value,
396
418
  ["messages", "purpose"],
397
- ["model", "temperature", "maxTokens", "responseFormat"]
419
+ [
420
+ "model",
421
+ "temperature",
422
+ "maxTokens",
423
+ "responseFormat",
424
+ "knowledgeQuery",
425
+ "knowledgeCitations"
426
+ ]
398
427
  )) {
399
428
  return null;
400
429
  }
@@ -422,13 +451,21 @@ function parseAiChatRequest(value) {
422
451
  }
423
452
  const responseFormat = value.responseFormat === void 0 ? void 0 : parseAiResponseFormat(value.responseFormat);
424
453
  if (responseFormat === null) return null;
454
+ if (value.knowledgeQuery !== void 0 && !isBoundedString(value.knowledgeQuery, AI_WIRE_LIMITS.knowledgeQueryCharacters, 1)) {
455
+ return null;
456
+ }
457
+ if (value.knowledgeCitations !== void 0 && typeof value.knowledgeCitations !== "boolean") {
458
+ return null;
459
+ }
425
460
  return {
426
461
  messages,
427
462
  purpose: value.purpose,
428
463
  ...value.model === void 0 ? {} : { model: value.model },
429
464
  ...value.temperature === void 0 ? {} : { temperature: value.temperature },
430
465
  ...value.maxTokens === void 0 ? {} : { maxTokens: value.maxTokens },
431
- ...responseFormat === void 0 ? {} : { responseFormat }
466
+ ...responseFormat === void 0 ? {} : { responseFormat },
467
+ ...value.knowledgeQuery === void 0 ? {} : { knowledgeQuery: value.knowledgeQuery },
468
+ ...value.knowledgeCitations === void 0 ? {} : { knowledgeCitations: value.knowledgeCitations }
432
469
  };
433
470
  }
434
471
  function parseAiChatProgress(value) {
@@ -449,8 +486,124 @@ function parseAiChatProgress(value) {
449
486
  tokensPerSecond: value.tokensPerSecond
450
487
  };
451
488
  }
489
+ function parseAiChatKnowledgeSource(value) {
490
+ if (!isRecord2(value) || !hasExactKeys(value, ["catalogId", "name", "titles"])) return null;
491
+ if (!isBoundedString(value.catalogId, HOST_WIRE_LIMITS.identifierCharacters, 1)) return null;
492
+ if (!isBoundedString(value.name, HOST_WIRE_LIMITS.labelCharacters, 1)) return null;
493
+ if (!Array.isArray(value.titles) || value.titles.length > AI_WIRE_LIMITS.knowledgeTitles) {
494
+ return null;
495
+ }
496
+ const titles = [];
497
+ for (const title of value.titles) {
498
+ if (!isBoundedString(title, AI_WIRE_LIMITS.knowledgeTitleCharacters, 1)) return null;
499
+ titles.push(title);
500
+ }
501
+ return { catalogId: value.catalogId, name: value.name, titles };
502
+ }
503
+ function parseAiChatKnowledge(value) {
504
+ if (!isRecord2(value)) return null;
505
+ if (value.outcome === "none" || value.outcome === "skipped") {
506
+ return hasExactKeys(value, ["outcome"]) ? { outcome: value.outcome } : null;
507
+ }
508
+ if (value.outcome !== "used" || !hasExactKeys(value, ["outcome", "sources", "evidence"])) {
509
+ return null;
510
+ }
511
+ const evidence = parseAiChatEvidence(value.evidence);
512
+ if (!evidence) return null;
513
+ if (!Array.isArray(value.sources) || value.sources.length === 0 || value.sources.length > AI_WIRE_LIMITS.knowledgeSources) {
514
+ return null;
515
+ }
516
+ const sources = [];
517
+ const ids = /* @__PURE__ */ new Set();
518
+ for (const entry of value.sources) {
519
+ const source = parseAiChatKnowledgeSource(entry);
520
+ if (!source || ids.has(source.catalogId)) return null;
521
+ ids.add(source.catalogId);
522
+ sources.push(source);
523
+ }
524
+ return { outcome: "used", sources, evidence };
525
+ }
526
+ function parseAiChatEvidence(value) {
527
+ if (!Array.isArray(value) || value.length === 0 || value.length > AI_WIRE_LIMITS.knowledgeEvidence) {
528
+ return null;
529
+ }
530
+ const evidence = [];
531
+ let total = 0;
532
+ for (const entry of value) {
533
+ if (!isRecord2(entry) || !hasExactKeys(entry, ["title", "catalogId", "text"])) return null;
534
+ if (!isBoundedString(entry.title, AI_WIRE_LIMITS.knowledgeTitleCharacters)) return null;
535
+ if (!isBoundedString(entry.catalogId, HOST_WIRE_LIMITS.identifierCharacters, 1)) return null;
536
+ if (!isBoundedString(entry.text, AI_WIRE_LIMITS.knowledgeEvidenceCharacters, 1)) return null;
537
+ total += entry.text.length;
538
+ if (total > AI_WIRE_LIMITS.knowledgeEvidenceCharacters) return null;
539
+ evidence.push({ title: entry.title, catalogId: entry.catalogId, text: entry.text });
540
+ }
541
+ return evidence;
542
+ }
543
+ function parseTextList(value, entries, characters) {
544
+ if (!Array.isArray(value) || value.length > entries) return null;
545
+ let total = 0;
546
+ const texts = [];
547
+ for (const text of value) {
548
+ if (!isBoundedString(text, characters, 1)) return null;
549
+ total += text.length;
550
+ if (total > characters) return null;
551
+ texts.push(text);
552
+ }
553
+ return texts;
554
+ }
555
+ function parseAiFactCheckRequest(value) {
556
+ if (!isRecord2(value) || !hasExactKeys(value, ["text", "evidence", "given", "citations"])) {
557
+ return null;
558
+ }
559
+ if (typeof value.citations !== "boolean") return null;
560
+ if (!isBoundedString(value.text, AI_WIRE_LIMITS.factCheckTextCharacters)) return null;
561
+ if (!isBoundedString(value.given, AI_WIRE_LIMITS.factCheckGivenCharacters)) return null;
562
+ const evidence = parseTextList(
563
+ value.evidence,
564
+ AI_WIRE_LIMITS.factCheckEvidence,
565
+ AI_WIRE_LIMITS.factCheckEvidenceCharacters
566
+ );
567
+ return evidence ? { text: value.text, evidence, given: value.given, citations: value.citations } : null;
568
+ }
569
+ function parseAiFactCheckSentence(value) {
570
+ if (!isRecord2(value) || !hasExactKeys(value, ["text", "problem", "missing", "strong"])) {
571
+ return null;
572
+ }
573
+ if (!isBoundedString(value.text, AI_WIRE_LIMITS.factCheckSentenceCharacters, 1)) return null;
574
+ if (value.problem !== "unsourced" && value.problem !== "bad-citation") return null;
575
+ if (typeof value.strong !== "boolean") return null;
576
+ if (!Array.isArray(value.missing) || value.missing.length > AI_WIRE_LIMITS.factCheckDetails) {
577
+ return null;
578
+ }
579
+ const missing = [];
580
+ for (const detail of value.missing) {
581
+ if (!isBoundedString(detail, AI_WIRE_LIMITS.knowledgeTitleCharacters, 1)) return null;
582
+ missing.push(detail);
583
+ }
584
+ return { text: value.text, problem: value.problem, missing, strong: value.strong };
585
+ }
586
+ function parseAiFactCheck(value) {
587
+ if (!isRecord2(value) || !hasExactKeys(value, ["checked", "unsourced"])) return null;
588
+ if (!isNonNegativeInteger(value.checked, Number.MAX_SAFE_INTEGER)) return null;
589
+ if (!Array.isArray(value.unsourced) || value.unsourced.length > AI_WIRE_LIMITS.factCheckSentences) {
590
+ return null;
591
+ }
592
+ const unsourced = [];
593
+ for (const entry of value.unsourced) {
594
+ const sentence = parseAiFactCheckSentence(entry);
595
+ if (!sentence) return null;
596
+ unsourced.push(sentence);
597
+ }
598
+ return { checked: value.checked, unsourced };
599
+ }
452
600
  function parseAiChatEvent(value) {
453
601
  if (!isRecord2(value)) return null;
602
+ if (value.kind === "knowledge") {
603
+ if (!hasExactKeys(value, ["kind", "knowledge"])) return null;
604
+ const knowledge = parseAiChatKnowledge(value.knowledge);
605
+ return knowledge ? { kind: "knowledge", knowledge } : null;
606
+ }
454
607
  if (value.kind === "progress") {
455
608
  if (!hasExactKeys(value, ["kind", "progress"])) return null;
456
609
  const progress = parseAiChatProgress(value.progress);
@@ -1197,6 +1350,9 @@ export {
1197
1350
  parseAiModelInstallEvent,
1198
1351
  parseAiChatRequest,
1199
1352
  parseAiChatProgress,
1353
+ parseAiChatKnowledge,
1354
+ parseAiFactCheckRequest,
1355
+ parseAiFactCheck,
1200
1356
  parseAiChatEvent,
1201
1357
  parseAiStatus,
1202
1358
  parseAiPreferences,
@@ -80,6 +80,27 @@ function parseExternalHttpUrl(value) {
80
80
  return null;
81
81
  }
82
82
  }
83
+ var SUPPORT_EMAIL_ADDRESS = "support@bendyline.com";
84
+ var SUPPORT_EMAIL_FIELDS = /* @__PURE__ */ new Set(["subject", "body"]);
85
+ function parseSupportMailtoUrl(value) {
86
+ if (!isBoundedString(value, HOST_WIRE_LIMITS.urlCharacters, 1)) return null;
87
+ try {
88
+ const url = new URL(value);
89
+ if (url.protocol !== "mailto:" || url.pathname !== SUPPORT_EMAIL_ADDRESS || url.hash) {
90
+ return null;
91
+ }
92
+ const fields = [...url.searchParams.keys()];
93
+ if (fields.some((field) => !SUPPORT_EMAIL_FIELDS.has(field))) return null;
94
+ if (new Set(fields).size !== fields.length) return null;
95
+ const canonical = url.href;
96
+ return canonical.length <= HOST_WIRE_LIMITS.urlCharacters ? canonical : null;
97
+ } catch {
98
+ return null;
99
+ }
100
+ }
101
+ function parseOpenExternalUrl(value) {
102
+ return parseExternalHttpUrl(value) ?? parseSupportMailtoUrl(value);
103
+ }
83
104
  function isTrustedRendererUrl(value, developmentOrigin) {
84
105
  if (!isBoundedString(value, HOST_WIRE_LIMITS.urlCharacters, 1)) return false;
85
106
  try {
@@ -104,5 +125,8 @@ export {
104
125
  parseOpenRequest,
105
126
  parsePinnedMenuDocuments,
106
127
  parseExternalHttpUrl,
128
+ SUPPORT_EMAIL_ADDRESS,
129
+ parseSupportMailtoUrl,
130
+ parseOpenExternalUrl,
107
131
  isTrustedRendererUrl
108
132
  };
@@ -4,7 +4,7 @@ export { isElectronHost } from '../host/index.js';
4
4
  import '../v2-DwxWjFC0.js';
5
5
  import '../workspace-path-CWVrcuPL.js';
6
6
  import '../filesystem-v2-CXdAPR27.js';
7
- import '../capabilities-DHwh4P4D.js';
7
+ import '../capabilities-D4Z1xYZV.js';
8
8
 
9
9
  /** Compatibility entry point retaining the Electron backend's exact guarantees. */
10
10
  declare class ElectronFileSystemProviderV2 extends HostFileSystemProviderV2 {
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  ElectronFileSystemProvider,
3
3
  ElectronFileSystemProviderV2
4
- } from "../chunk-P32NVUQL.js";
5
- import "../chunk-EFGQUOTL.js";
4
+ } from "../chunk-66WTIYYG.js";
5
+ import "../chunk-NECMAJHS.js";
6
6
  import {
7
7
  isElectronHost
8
- } from "../chunk-64733GFL.js";
8
+ } from "../chunk-RFEB4N5Q.js";
9
9
  import "../chunk-245W57QP.js";
10
- import "../chunk-46AGYHDY.js";
10
+ import "../chunk-V5SWLUZY.js";
11
11
  import "../chunk-73OOROXH.js";
12
12
  import "../chunk-HABG2JM3.js";
13
13
  import "../chunk-LPIJ6HKL.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  HostFileSystemProviderV2
3
- } from "../chunk-EFGQUOTL.js";
3
+ } from "../chunk-NECMAJHS.js";
4
4
  import {
5
5
  ELECTRON_FILE_SYSTEM_V2_CAPABILITIES,
6
6
  maybeGetDocBlocksHost
7
- } from "../chunk-64733GFL.js";
7
+ } from "../chunk-RFEB4N5Q.js";
8
8
  import "../chunk-245W57QP.js";
9
- import "../chunk-46AGYHDY.js";
9
+ import "../chunk-V5SWLUZY.js";
10
10
  import "../chunk-73OOROXH.js";
11
11
  import "../chunk-HABG2JM3.js";
12
12
  import "../chunk-LPIJ6HKL.js";
@@ -15,7 +15,7 @@ export { ElectronFileSystemProvider, ElectronFileSystemProviderV2 } from './elec
15
15
  export { isElectronHost } from '../host/index.js';
16
16
  import '../host-provider-v2-DEWMPiRD.js';
17
17
  import '../filesystem-v2-CXdAPR27.js';
18
- import '../capabilities-DHwh4P4D.js';
18
+ import '../capabilities-D4Z1xYZV.js';
19
19
 
20
20
  /** Immediate article/folder suggestions from an already bounded listing. */
21
21
  declare function suggestWikiArticles(files: readonly {
@@ -192,9 +192,45 @@ declare class FileSystemContentContainer implements ContentContainer {
192
192
  * (`notes_files/image.png`) references — so legacy markdown and
193
193
  * exports from other tools both work
194
194
  * • Types resolved URLs by file extension, as the workspace containers do
195
+ * • Optionally falls back, read-only, to a reference as Markdown written
196
+ * elsewhere spells it (`shots/a.png` beside the document) when the
197
+ * sidecar holds no such file
195
198
  */
196
199
 
197
- declare function createFileMediaProvider(container: ContentContainer, markdownBasename: string): MediaProvider;
200
+ interface FileMediaProviderOptions {
201
+ /**
202
+ * Read a reference the sidecar does not hold, relative to the document
203
+ * rather than to its sidecar. Receives the reference as written and
204
+ * resolves null when nothing is there. Never consulted for writes, and a
205
+ * failure counts as absence: the fallback can only add resolutions.
206
+ */
207
+ readonly readDocumentRelative?: (ref: string) => Promise<ArrayBuffer | null>;
208
+ }
209
+ declare function createFileMediaProvider(container: ContentContainer, markdownBasename: string, options?: FileMediaProviderOptions): MediaProvider;
210
+
211
+ /**
212
+ * Document-relative media: `shots/a.png` beside `report.md`, as Markdown
213
+ * written by other tools spells it.
214
+ *
215
+ * DocBlocks writes media into the document's `<stem>_files/` sidecar, and
216
+ * `createFileMediaProvider` keeps resolving references there first. These
217
+ * paths are only a read-only fallback for references the sidecar does not
218
+ * hold, so they are confined to media types and never climb above the root
219
+ * they are resolved within.
220
+ */
221
+
222
+ /**
223
+ * True when a path names an image, audio, or video file the containers can
224
+ * type by extension -- the only files a document-relative fallback may read.
225
+ */
226
+ declare function isDocumentMediaPath(path: string): boolean;
227
+ /**
228
+ * Resolve a Markdown media reference against the folder that holds the
229
+ * document. Returns the root-relative path, or null when the reference is not
230
+ * a plain relative path (a URL, an absolute or drive-qualified path), names no
231
+ * media type, or climbs above the root.
232
+ */
233
+ declare function resolveDocumentRelativeMediaPath(documentDirectory: string, ref: string): WorkspacePath | null;
198
234
 
199
235
  /**
200
236
  * Which workspace entries DocBlocks browses, discovers, and watches.
@@ -291,4 +327,4 @@ declare function isFileSystemMoveStateError(error: unknown): error is FileSystem
291
327
  declare function describePartialMove(provider: FileSystemProvider, sourcePath: string, destinationPath: string, companionSourcePath: string, companionDestinationPath: string): Promise<FileSystemPartialMoveState>;
292
328
  declare function describeEntryMove(provider: FileSystemProvider, sourcePath: string, destinationPath: string): Promise<FileSystemEntryMoveState>;
293
329
 
294
- export { type DbkWorkspaceAssetLayout, type DbkWorkspaceSnapshot, type DbkWorkspaceSnapshotOptions, type DecodeUtf8TextOptions, FileSystemAtomicity, FileSystemCaseSensitivity, FileSystemContentContainer, FileSystemCreateDirectoryOptions, FileSystemDirectorySnapshot, FileSystemDurability, type FileSystemEntryMoveOptions, type FileSystemEntryMoveState, FileSystemEntrySnapshot, FileSystemFileRead, FileSystemFileSnapshot, type FileSystemMoveLocation, FileSystemMoveOptions, FileSystemMoveRecoveryError, FileSystemPartialMoveError, type FileSystemPartialMoveState, type FileSystemPathPresence, FileSystemProvider, FileSystemProviderCapabilities, FileSystemProviderV2, FileSystemRemoveOptions, FileSystemRemoveResult, FileSystemSnapshot, FileSystemSymlinkPolicy, FileSystemWatchListener, FileSystemWatchOptions, FileSystemWatchSubscription, FileSystemWriteOptions, FsOperation, type LegacyFilePayloadModel, LegacyFileSystemProviderV2Adapter, type LegacyFileSystemProviderV2AdapterOptions, MARKDOWN_FILE_EXTENSIONS, MemoryFileSystemProvider, MemoryFileSystemSnapshot, SQUISQ_RUNTIME_DIRECTORY_NAME, WorkspacePath, createDbkWorkspaceSnapshot, createFileMediaProvider, decodeUtf8Text, describeEntryMove, describePartialMove, documentCompanionPath, ensureWikiArticle, findWikiArticle, isBrowsableWorkspaceEntry, isCompanionDirectoryName, isDiscoverableWorkspaceEntry, isFileSystemMoveRecoveryError, isFileSystemMoveStateError, isFileSystemPartialMoveError, isIgnoredWorkspaceEntryName, isMarkdownFileName, moveFileSystemEntry, replaceMemoryWorkspaceFromDbk, resolveWikiArticlePath, rewriteCompanionReferences, suggestWikiArticles, wikiArticleExists };
330
+ export { type DbkWorkspaceAssetLayout, type DbkWorkspaceSnapshot, type DbkWorkspaceSnapshotOptions, type DecodeUtf8TextOptions, type FileMediaProviderOptions, FileSystemAtomicity, FileSystemCaseSensitivity, FileSystemContentContainer, FileSystemCreateDirectoryOptions, FileSystemDirectorySnapshot, FileSystemDurability, type FileSystemEntryMoveOptions, type FileSystemEntryMoveState, FileSystemEntrySnapshot, FileSystemFileRead, FileSystemFileSnapshot, type FileSystemMoveLocation, FileSystemMoveOptions, FileSystemMoveRecoveryError, FileSystemPartialMoveError, type FileSystemPartialMoveState, type FileSystemPathPresence, FileSystemProvider, FileSystemProviderCapabilities, FileSystemProviderV2, FileSystemRemoveOptions, FileSystemRemoveResult, FileSystemSnapshot, FileSystemSymlinkPolicy, FileSystemWatchListener, FileSystemWatchOptions, FileSystemWatchSubscription, FileSystemWriteOptions, FsOperation, type LegacyFilePayloadModel, LegacyFileSystemProviderV2Adapter, type LegacyFileSystemProviderV2AdapterOptions, MARKDOWN_FILE_EXTENSIONS, MemoryFileSystemProvider, MemoryFileSystemSnapshot, SQUISQ_RUNTIME_DIRECTORY_NAME, WorkspacePath, createDbkWorkspaceSnapshot, createFileMediaProvider, decodeUtf8Text, describeEntryMove, describePartialMove, documentCompanionPath, ensureWikiArticle, findWikiArticle, isBrowsableWorkspaceEntry, isCompanionDirectoryName, isDiscoverableWorkspaceEntry, isDocumentMediaPath, isFileSystemMoveRecoveryError, isFileSystemMoveStateError, isFileSystemPartialMoveError, isIgnoredWorkspaceEntryName, isMarkdownFileName, moveFileSystemEntry, replaceMemoryWorkspaceFromDbk, resolveDocumentRelativeMediaPath, resolveWikiArticlePath, rewriteCompanionReferences, suggestWikiArticles, wikiArticleExists };
@@ -6,13 +6,15 @@ import {
6
6
  documentCompanionPath,
7
7
  ensureWikiArticle,
8
8
  findWikiArticle,
9
+ isDocumentMediaPath,
9
10
  moveFileSystemEntry,
10
11
  replaceMemoryWorkspaceFromDbk,
12
+ resolveDocumentRelativeMediaPath,
11
13
  resolveWikiArticlePath,
12
14
  rewriteCompanionReferences,
13
15
  suggestWikiArticles,
14
16
  wikiArticleExists
15
- } from "../chunk-LJLQYXVL.js";
17
+ } from "../chunk-5VEIEFFC.js";
16
18
  import {
17
19
  MARKDOWN_FILE_EXTENSIONS,
18
20
  SQUISQ_RUNTIME_DIRECTORY_NAME,
@@ -26,8 +28,8 @@ import {
26
28
  IndexedDBContentContainer,
27
29
  IndexedDBFileSystemProvider,
28
30
  IndexedDBFileSystemProviderV2
29
- } from "../chunk-Q3OFZWJS.js";
30
- import "../chunk-DAPFSEKY.js";
31
+ } from "../chunk-3HUKGWDK.js";
32
+ import "../chunk-OPLU2CYA.js";
31
33
  import {
32
34
  MemoryFileSystemProvider,
33
35
  MemoryFileSystemProviderV2
@@ -48,13 +50,13 @@ import "../chunk-3GSMJ4MQ.js";
48
50
  import {
49
51
  ElectronFileSystemProvider,
50
52
  ElectronFileSystemProviderV2
51
- } from "../chunk-P32NVUQL.js";
52
- import "../chunk-EFGQUOTL.js";
53
+ } from "../chunk-66WTIYYG.js";
54
+ import "../chunk-NECMAJHS.js";
53
55
  import {
54
56
  isElectronHost
55
- } from "../chunk-64733GFL.js";
57
+ } from "../chunk-RFEB4N5Q.js";
56
58
  import "../chunk-245W57QP.js";
57
- import "../chunk-46AGYHDY.js";
59
+ import "../chunk-V5SWLUZY.js";
58
60
  import "../chunk-73OOROXH.js";
59
61
  import "../chunk-HABG2JM3.js";
60
62
  import {
@@ -129,6 +131,7 @@ export {
129
131
  isBrowsableWorkspaceEntry,
130
132
  isCompanionDirectoryName,
131
133
  isDiscoverableWorkspaceEntry,
134
+ isDocumentMediaPath,
132
135
  isElectronHost,
133
136
  isFileSystemMoveRecoveryError,
134
137
  isFileSystemMoveStateError,
@@ -147,6 +150,7 @@ export {
147
150
  parseWorkspacePath,
148
151
  removeDirectoryHandle,
149
152
  replaceMemoryWorkspaceFromDbk,
153
+ resolveDocumentRelativeMediaPath,
150
154
  resolveWikiArticlePath,
151
155
  restoreNativeFolder,
152
156
  rewriteCompanionReferences,
@@ -2,11 +2,11 @@ import {
2
2
  IndexedDBContentContainer,
3
3
  IndexedDBFileSystemProvider,
4
4
  IndexedDBFileSystemProviderV2
5
- } from "../chunk-Q3OFZWJS.js";
5
+ } from "../chunk-3HUKGWDK.js";
6
6
  import {
7
7
  deleteIndexedDBWorkspaceData,
8
8
  indexedDBWorkspaceDatabaseName
9
- } from "../chunk-DAPFSEKY.js";
9
+ } from "../chunk-OPLU2CYA.js";
10
10
  import "../chunk-DZB666V7.js";
11
11
  import "../chunk-3GSMJ4MQ.js";
12
12
  import "../chunk-73OOROXH.js";
@@ -1,5 +1,5 @@
1
- import { a as AiChatEvent, d as AiChatProgress, f as AiChatRequest, i as AiError, q as AiModelDownloadInfo, s as AiModelInfo, t as AiModelInstallEvent, v as AiPreferences, w as AiPreferencesPatch, x as AiProgress, H as AiStatus, au as SpeechAudioChunk, av as SpeechCatalog, aw as SpeechError, ay as SpeechInstallEvent, aA as SpeechModelInfo, aB as SpeechModelKind, aH as SpeechResult, aC as SpeechPreferences, aD as SpeechPreferencesPatch, aE as SpeechProgress, aF as SpeechReadiness, aJ as SpeechStatus, aL as SpeechSynthesisSummary, aM as SpeechSynthesizeEvent, aN as SpeechSynthesizeRequest, aO as SpeechTranscribeRequest, aP as SpeechTranscript, aQ as SpeechVoiceInfo, at as OpenRequest, am as HostPinnedDocument, M as DocBlocksHostAPI, ai as HostCapabilities, ak as HostEnvironment } from '../capabilities-DHwh4P4D.js';
2
- export { A as AiChatCompletion, b as AiChatHandle, c as AiChatMessage, e as AiChatPurpose, g as AiConnectionStep, h as AiEnsureWorkspaceHandle, j as AiErrorCode, k as AiImageRequest, l as AiImageResult, m as AiKnowledgeAPI, n as AiKnowledgeAction, o as AiKnowledgeCatalog, p as AiKnowledgeState, r as AiModelFit, u as AiModelInstallHandle, y as AiProviderInfo, z as AiResponseFormat, B as AiResult, C as AiReviewMode, D as AiSearchHit, E as AiSearchQuery, F as AiSearchResult, G as AiSpeechAudio, I as AiSynthesizeRequest, J as AiTranscribeRequest, K as AiTranscript, L as AiUnavailableReason, N as DocBlocksHostAiAPI, O as DocBlocksHostClipboardAPI, P as DocBlocksHostExportAPI, Q as DocBlocksHostExternalAPI, R as DocBlocksHostFfmpegAPI, S as DocBlocksHostFsAPI, T as DocBlocksHostGitAPI, U as DocBlocksHostLifecycleAPI, V as DocBlocksHostMenuAPI, W as DocBlocksHostShellAPI, X as DocBlocksHostSpeechAPI, Y as DocBlocksHostUpdaterAPI, Z as DocBlocksHostWorkspacesAPI, _ as ElectronWorkspaceInfo, $ as ExternalBinaryCommitResult, a0 as GitBranchInfo, a1 as GitCapabilities, a2 as GitCloneHandle, a3 as GitCloneProgress, a4 as GitError, a5 as GitErrorCode, a6 as GitFileAtRevision, a7 as GitFileChange, a8 as GitFileStatusCode, a9 as GitLogEntry, aa as GitLogOptions, ab as GitRemoteInfo, ac as GitRepoDetection, ad as GitResult, ae as GitRevision, af as GitStatus, ag as HOST_PLATFORMS, ah as HOST_SURFACE_KINDS, aj as HostCloseReason, al as HostExportTargetGrant, an as HostPlatform, ao as HostPrepareCloseRequest, ap as HostPrepareCloseResult, aq as HostSurfaceKind, ar as MenuCommand, as as NO_HOST_CAPABILITIES, ax as SpeechErrorCode, az as SpeechInstallHandle, aG as SpeechReadinessState, aI as SpeechSegment, aK as SpeechSynthesisHandle, aR as SpeechWordTiming, aS as UpdateCheckResult, aT as UpdateInstallResult, aU as UpdaterStatus, aV as deriveHostCapabilities, aW as parseAiKnowledgeAction, aX as parseAiKnowledgeState, aY as parseHostEnvironment } from '../capabilities-DHwh4P4D.js';
1
+ import { a as AiChatEvent, d as AiChatKnowledge, g as AiChatProgress, i as AiChatRequest, l as AiError, n as AiFactCheck, o as AiFactCheckRequest, w as AiModelDownloadInfo, y as AiModelInfo, z as AiModelInstallEvent, C as AiPreferences, D as AiPreferencesPatch, E as AiProgress, N as AiStatus, aA as SpeechAudioChunk, aB as SpeechCatalog, aC as SpeechError, aE as SpeechInstallEvent, aG as SpeechModelInfo, aH as SpeechModelKind, aN as SpeechResult, aI as SpeechPreferences, aJ as SpeechPreferencesPatch, aK as SpeechProgress, aL as SpeechReadiness, aP as SpeechStatus, aR as SpeechSynthesisSummary, aS as SpeechSynthesizeEvent, aT as SpeechSynthesizeRequest, aU as SpeechTranscribeRequest, aV as SpeechTranscript, aW as SpeechVoiceInfo, az as OpenRequest, as as HostPinnedDocument, S as DocBlocksHostAPI, ao as HostCapabilities, aq as HostEnvironment } from '../capabilities-D4Z1xYZV.js';
2
+ export { A as AiChatCompletion, b as AiChatEvidence, c as AiChatHandle, e as AiChatKnowledgeSource, f as AiChatMessage, h as AiChatPurpose, j as AiConnectionStep, k as AiEnsureWorkspaceHandle, m as AiErrorCode, p as AiFactCheckSentence, q as AiImageRequest, r as AiImageResult, s as AiKnowledgeAPI, t as AiKnowledgeAction, u as AiKnowledgeCatalog, v as AiKnowledgeState, x as AiModelFit, B as AiModelInstallHandle, F as AiProviderInfo, G as AiResponseFormat, H as AiResult, I as AiReviewMode, J as AiSearchHit, K as AiSearchQuery, L as AiSearchResult, M as AiSpeechAudio, O as AiSynthesizeRequest, P as AiTranscribeRequest, Q as AiTranscript, R as AiUnavailableReason, T as DocBlocksHostAiAPI, U as DocBlocksHostClipboardAPI, V as DocBlocksHostExportAPI, W as DocBlocksHostExternalAPI, X as DocBlocksHostFfmpegAPI, Y as DocBlocksHostFsAPI, Z as DocBlocksHostGitAPI, _ as DocBlocksHostLifecycleAPI, $ as DocBlocksHostMenuAPI, a0 as DocBlocksHostShellAPI, a1 as DocBlocksHostSpeechAPI, a2 as DocBlocksHostUpdaterAPI, a3 as DocBlocksHostWorkspacesAPI, a4 as ElectronWorkspaceInfo, a5 as ExternalBinaryCommitResult, a6 as GitBranchInfo, a7 as GitCapabilities, a8 as GitCloneHandle, a9 as GitCloneProgress, aa as GitError, ab as GitErrorCode, ac as GitFileAtRevision, ad as GitFileChange, ae as GitFileStatusCode, af as GitLogEntry, ag as GitLogOptions, ah as GitRemoteInfo, ai as GitRepoDetection, aj as GitResult, ak as GitRevision, al as GitStatus, am as HOST_PLATFORMS, an as HOST_SURFACE_KINDS, ap as HostCloseReason, ar as HostExportTargetGrant, at as HostPlatform, au as HostPrepareCloseRequest, av as HostPrepareCloseResult, aw as HostSurfaceKind, ax as MenuCommand, ay as NO_HOST_CAPABILITIES, aD as SpeechErrorCode, aF as SpeechInstallHandle, aM as SpeechReadinessState, aO as SpeechSegment, aQ as SpeechSynthesisHandle, aX as SpeechWordTiming, aY as UpdateCheckResult, aZ as UpdateInstallResult, a_ as UpdaterStatus, a$ as deriveHostCapabilities, b0 as parseAiKnowledgeAction, b1 as parseAiKnowledgeState, b2 as parseHostEnvironment } from '../capabilities-D4Z1xYZV.js';
3
3
  export { D as DocBlocksHostFsV2API, E as ELECTRON_FILE_SYSTEM_V2_CAPABILITIES, F as FILE_SYSTEM_TRANSFER_LIMITS, H as HostFileSystemReadTransfer, a as HostFileSystemV2OpenRequest, b as HostFileSystemV2Result, c as HostFileSystemV2WatchMessage } from '../filesystem-v2-CXdAPR27.js';
4
4
  import '../types-DLteNrK0.js';
5
5
  import '../v2-DwxWjFC0.js';
@@ -25,6 +25,26 @@ declare const AI_WIRE_LIMITS: Readonly<{
25
25
  responseSchemaCharacters: number;
26
26
  verificationCodeCharacters: 16;
27
27
  progressPhaseCharacters: 64;
28
+ /** Catalogs, and titles per catalog, one request can cite; Gezel sends at most 8 passages. */
29
+ knowledgeSources: 8;
30
+ knowledgeTitles: 8;
31
+ knowledgeTitleCharacters: 256;
32
+ /** A knowledge search; Gezel accepts up to 8,192 characters. */
33
+ knowledgeQueryCharacters: 8192;
34
+ /** Passage texts sent with a knowledge report; Gezel caps a retrieval at 24,000 characters. */
35
+ knowledgeEvidence: 8;
36
+ knowledgeEvidenceCharacters: number;
37
+ /**
38
+ * A fact check reads one draft against every passage its run was given. It
39
+ * runs synchronously in the host; at these bounds it takes tens of ms.
40
+ */
41
+ factCheckTextCharacters: number;
42
+ factCheckEvidence: 64;
43
+ factCheckEvidenceCharacters: number;
44
+ factCheckGivenCharacters: number;
45
+ factCheckSentences: 50;
46
+ factCheckSentenceCharacters: 1000;
47
+ factCheckDetails: 16;
28
48
  modelEntries: 200;
29
49
  contextWindowCeiling: 8000000;
30
50
  downloadBytesCeiling: number;
@@ -45,6 +65,9 @@ declare function parseAiModelInstallEvent(value: unknown): AiModelInstallEvent |
45
65
  */
46
66
  declare function parseAiChatRequest(value: unknown): AiChatRequest | null;
47
67
  declare function parseAiChatProgress(value: unknown): AiChatProgress | null;
68
+ declare function parseAiChatKnowledge(value: unknown): AiChatKnowledge | null;
69
+ declare function parseAiFactCheckRequest(value: unknown): AiFactCheckRequest | null;
70
+ declare function parseAiFactCheck(value: unknown): AiFactCheck | null;
48
71
  declare function parseAiChatEvent(value: unknown): AiChatEvent | null;
49
72
  declare function parseAiStatus(value: unknown): AiStatus | null;
50
73
  declare function parseAiPreferences(value: unknown): AiPreferences | null;
@@ -138,6 +161,15 @@ declare function parseOpenRequest(value: unknown): OpenRequest | null;
138
161
  declare function parsePinnedMenuDocuments(value: unknown): HostPinnedDocument[];
139
162
  /** Return one canonical HTTP(S) URL, or null when external navigation is unsafe. */
140
163
  declare function parseExternalHttpUrl(value: unknown): string | null;
164
+ /** The one address a host will open an email to. */
165
+ declare const SUPPORT_EMAIL_ADDRESS = "support@bendyline.com";
166
+ /**
167
+ * Return one canonical `mailto:` URL to support, or null. Only a subject and
168
+ * body may be prefilled, so a renderer cannot add or redirect recipients.
169
+ */
170
+ declare function parseSupportMailtoUrl(value: unknown): string | null;
171
+ /** The `shell.openExternal` policy: a canonical HTTP(S) URL or an email to support. */
172
+ declare function parseOpenExternalUrl(value: unknown): string | null;
141
173
  /** True only for the packaged renderer origin or the exact configured dev origin. */
142
174
  declare function isTrustedRendererUrl(value: unknown, developmentOrigin?: string): boolean;
143
175
 
@@ -169,4 +201,4 @@ declare function getDocBlocksHost(): DocBlocksHostAPI;
169
201
  /** Return the host API, or null if not running under Electron. */
170
202
  declare function maybeGetDocBlocksHost(): DocBlocksHostAPI | null;
171
203
 
172
- export { AI_WIRE_LIMITS, AiChatEvent, AiChatProgress, AiChatRequest, AiError, AiModelDownloadInfo, AiModelInfo, AiModelInstallEvent, AiPreferences, AiPreferencesPatch, AiProgress, AiStatus, DocBlocksHostAPI, EXPORT_TRANSFER_LIMITS, HOST_WIRE_LIMITS, HostCapabilities, HostEnvironment, HostPinnedDocument, MAX_HOST_PINNED_DOCUMENTS, OpenRequest, SPEECH_WIRE_LIMITS, SpeechAudioChunk, SpeechCatalog, SpeechError, SpeechInstallEvent, SpeechModelInfo, SpeechModelKind, SpeechPreferences, SpeechPreferencesPatch, SpeechProgress, SpeechReadiness, SpeechResult, SpeechStatus, SpeechSynthesisSummary, SpeechSynthesizeEvent, SpeechSynthesizeRequest, SpeechTranscribeRequest, SpeechTranscript, SpeechVoiceInfo, getDocBlocksHost, getHostCapabilities, getHostEnvironment, hasDocBlocksHost, hostSupports, isBoundedBytePayload, isBoundedString, isElectronHost, isSpeechModelId, isTrustedRendererUrl, maybeGetDocBlocksHost, parseAiChatEvent, parseAiChatProgress, parseAiChatRequest, parseAiError, parseAiModelDownloadInfo, parseAiModelDownloadInfoList, parseAiModelInfo, parseAiModelInfoList, parseAiModelInstallEvent, parseAiPreferences, parseAiPreferencesPatch, parseAiProgress, parseAiStatus, parseExternalHttpUrl, parseOpenRequest, parsePinnedMenuDocuments, parseSpeechAudioChunk, parseSpeechCatalog, parseSpeechError, parseSpeechInstallEvent, parseSpeechModelInfo, parseSpeechModelKind, parseSpeechNullResult, parseSpeechPreferences, parseSpeechPreferencesPatch, parseSpeechProgress, parseSpeechReadiness, parseSpeechResult, parseSpeechStatus, parseSpeechSynthesisSummary, parseSpeechSynthesizeEvent, parseSpeechSynthesizeRequest, parseSpeechTranscribeRequest, parseSpeechTranscript, parseSpeechVoiceInfo };
204
+ export { AI_WIRE_LIMITS, AiChatEvent, AiChatKnowledge, AiChatProgress, AiChatRequest, AiError, AiFactCheck, AiFactCheckRequest, AiModelDownloadInfo, AiModelInfo, AiModelInstallEvent, AiPreferences, AiPreferencesPatch, AiProgress, AiStatus, DocBlocksHostAPI, EXPORT_TRANSFER_LIMITS, HOST_WIRE_LIMITS, HostCapabilities, HostEnvironment, HostPinnedDocument, MAX_HOST_PINNED_DOCUMENTS, OpenRequest, SPEECH_WIRE_LIMITS, SUPPORT_EMAIL_ADDRESS, SpeechAudioChunk, SpeechCatalog, SpeechError, SpeechInstallEvent, SpeechModelInfo, SpeechModelKind, SpeechPreferences, SpeechPreferencesPatch, SpeechProgress, SpeechReadiness, SpeechResult, SpeechStatus, SpeechSynthesisSummary, SpeechSynthesizeEvent, SpeechSynthesizeRequest, SpeechTranscribeRequest, SpeechTranscript, SpeechVoiceInfo, getDocBlocksHost, getHostCapabilities, getHostEnvironment, hasDocBlocksHost, hostSupports, isBoundedBytePayload, isBoundedString, isElectronHost, isSpeechModelId, isTrustedRendererUrl, maybeGetDocBlocksHost, parseAiChatEvent, parseAiChatKnowledge, parseAiChatProgress, parseAiChatRequest, parseAiError, parseAiFactCheck, parseAiFactCheckRequest, parseAiModelDownloadInfo, parseAiModelDownloadInfoList, parseAiModelInfo, parseAiModelInfoList, parseAiModelInstallEvent, parseAiPreferences, parseAiPreferencesPatch, parseAiProgress, parseAiStatus, parseExternalHttpUrl, parseOpenExternalUrl, parseOpenRequest, parsePinnedMenuDocuments, parseSpeechAudioChunk, parseSpeechCatalog, parseSpeechError, parseSpeechInstallEvent, parseSpeechModelInfo, parseSpeechModelKind, parseSpeechNullResult, parseSpeechPreferences, parseSpeechPreferencesPatch, parseSpeechProgress, parseSpeechReadiness, parseSpeechResult, parseSpeechStatus, parseSpeechSynthesisSummary, parseSpeechSynthesizeEvent, parseSpeechSynthesizeRequest, parseSpeechTranscribeRequest, parseSpeechTranscript, parseSpeechVoiceInfo, parseSupportMailtoUrl };
@@ -16,9 +16,12 @@ import {
16
16
  isSpeechModelId,
17
17
  maybeGetDocBlocksHost,
18
18
  parseAiChatEvent,
19
+ parseAiChatKnowledge,
19
20
  parseAiChatProgress,
20
21
  parseAiChatRequest,
21
22
  parseAiError,
23
+ parseAiFactCheck,
24
+ parseAiFactCheckRequest,
22
25
  parseAiKnowledgeAction,
23
26
  parseAiKnowledgeState,
24
27
  parseAiModelDownloadInfo,
@@ -50,18 +53,21 @@ import {
50
53
  parseSpeechTranscribeRequest,
51
54
  parseSpeechTranscript,
52
55
  parseSpeechVoiceInfo
53
- } from "../chunk-64733GFL.js";
56
+ } from "../chunk-RFEB4N5Q.js";
54
57
  import {
55
58
  EXPORT_TRANSFER_LIMITS,
56
59
  HOST_WIRE_LIMITS,
57
60
  MAX_HOST_PINNED_DOCUMENTS,
61
+ SUPPORT_EMAIL_ADDRESS,
58
62
  isBoundedBytePayload,
59
63
  isBoundedString,
60
64
  isTrustedRendererUrl,
61
65
  parseExternalHttpUrl,
66
+ parseOpenExternalUrl,
62
67
  parseOpenRequest,
63
- parsePinnedMenuDocuments
64
- } from "../chunk-46AGYHDY.js";
68
+ parsePinnedMenuDocuments,
69
+ parseSupportMailtoUrl
70
+ } from "../chunk-V5SWLUZY.js";
65
71
  export {
66
72
  AI_WIRE_LIMITS,
67
73
  ELECTRON_FILE_SYSTEM_V2_CAPABILITIES,
@@ -73,6 +79,7 @@ export {
73
79
  MAX_HOST_PINNED_DOCUMENTS,
74
80
  NO_HOST_CAPABILITIES,
75
81
  SPEECH_WIRE_LIMITS,
82
+ SUPPORT_EMAIL_ADDRESS,
76
83
  deriveHostCapabilities,
77
84
  getDocBlocksHost,
78
85
  getHostCapabilities,
@@ -86,9 +93,12 @@ export {
86
93
  isTrustedRendererUrl,
87
94
  maybeGetDocBlocksHost,
88
95
  parseAiChatEvent,
96
+ parseAiChatKnowledge,
89
97
  parseAiChatProgress,
90
98
  parseAiChatRequest,
91
99
  parseAiError,
100
+ parseAiFactCheck,
101
+ parseAiFactCheckRequest,
92
102
  parseAiKnowledgeAction,
93
103
  parseAiKnowledgeState,
94
104
  parseAiModelDownloadInfo,
@@ -102,6 +112,7 @@ export {
102
112
  parseAiStatus,
103
113
  parseExternalHttpUrl,
104
114
  parseHostEnvironment,
115
+ parseOpenExternalUrl,
105
116
  parseOpenRequest,
106
117
  parsePinnedMenuDocuments,
107
118
  parseSpeechAudioChunk,
@@ -122,5 +133,6 @@ export {
122
133
  parseSpeechSynthesizeRequest,
123
134
  parseSpeechTranscribeRequest,
124
135
  parseSpeechTranscript,
125
- parseSpeechVoiceInfo
136
+ parseSpeechVoiceInfo,
137
+ parseSupportMailtoUrl
126
138
  };