buckyos 0.7.138 → 0.7.140

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 (73) hide show
  1. package/cli/core/app.ts +4 -0
  2. package/cli/dist/cli.mjs +545 -124
  3. package/cli/dist/cli.mjs.map +1 -1
  4. package/cli/modules/aiws.ts +294 -0
  5. package/cli/modules/executor.ts +98 -0
  6. package/cli/version.ts +1 -1
  7. package/dist/aiworkspace_client.d.ts +91 -0
  8. package/dist/aiworkspace_client.d.ts.map +1 -0
  9. package/dist/app-frame.cjs +1 -1
  10. package/dist/app-frame.cjs.map +1 -1
  11. package/dist/app-frame.d.ts +103 -3
  12. package/dist/app-frame.d.ts.map +1 -1
  13. package/dist/app-frame.mjs +189 -8
  14. package/dist/app-frame.mjs.map +1 -1
  15. package/dist/browser.cjs +1 -1
  16. package/dist/browser.cjs.map +1 -1
  17. package/dist/browser.d.ts +2 -0
  18. package/dist/browser.d.ts.map +1 -1
  19. package/dist/browser.mjs +7 -3
  20. package/dist/browser.mjs.map +1 -1
  21. package/dist/content.cjs +1 -1
  22. package/dist/content.cjs.map +1 -1
  23. package/dist/content.d.ts +18 -0
  24. package/dist/content.d.ts.map +1 -1
  25. package/dist/content.mjs +61 -1
  26. package/dist/content.mjs.map +1 -1
  27. package/dist/executor_client-978a8e1b.js +13 -0
  28. package/dist/executor_client-978a8e1b.js.map +1 -0
  29. package/dist/{ndm_proxy-6b03b9ec.mjs → executor_client-d2c9e854.mjs} +848 -247
  30. package/dist/executor_client-d2c9e854.mjs.map +1 -0
  31. package/dist/executor_client.d.ts +138 -0
  32. package/dist/executor_client.d.ts.map +1 -0
  33. package/dist/index.cjs +1 -1
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.ts +4 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.mjs +12 -3
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/internal/hash_worker.d.ts +2 -1
  40. package/dist/internal/hash_worker.d.ts.map +1 -1
  41. package/dist/internal/tus_client.d.ts +3 -0
  42. package/dist/internal/tus_client.d.ts.map +1 -1
  43. package/dist/ndm_client.d.ts +56 -7
  44. package/dist/ndm_client.d.ts.map +1 -1
  45. package/dist/{ndn_types-ac9c1e48.mjs → ndn_types-dcb74613.mjs} +3 -3
  46. package/dist/{ndn_types-ac9c1e48.mjs.map → ndn_types-dcb74613.mjs.map} +1 -1
  47. package/dist/nfsp.cjs +1 -1
  48. package/dist/nfsp.cjs.map +1 -1
  49. package/dist/nfsp.d.ts +16 -0
  50. package/dist/nfsp.d.ts.map +1 -1
  51. package/dist/nfsp.mjs +6 -0
  52. package/dist/nfsp.mjs.map +1 -1
  53. package/dist/node.cjs +1 -1
  54. package/dist/node.cjs.map +1 -1
  55. package/dist/node.d.ts +2 -0
  56. package/dist/node.d.ts.map +1 -1
  57. package/dist/node.mjs +7 -3
  58. package/dist/node.mjs.map +1 -1
  59. package/dist/provision.mjs +1 -1
  60. package/dist/runtime.d.ts +2 -0
  61. package/dist/runtime.d.ts.map +1 -1
  62. package/dist/sdk_core.d.ts +4 -0
  63. package/dist/sdk_core.d.ts.map +1 -1
  64. package/dist/{tus_client-19baa342.mjs → tus_client-8fd4d937.mjs} +40 -2
  65. package/dist/tus_client-8fd4d937.mjs.map +1 -0
  66. package/dist/{tus_client-2b915a81.js → tus_client-a2f73d53.js} +4 -4
  67. package/dist/tus_client-a2f73d53.js.map +1 -0
  68. package/package.json +1 -1
  69. package/dist/ndm_proxy-67651066.js +0 -13
  70. package/dist/ndm_proxy-67651066.js.map +0 -1
  71. package/dist/ndm_proxy-6b03b9ec.mjs.map +0 -1
  72. package/dist/tus_client-19baa342.mjs.map +0 -1
  73. package/dist/tus_client-2b915a81.js.map +0 -1
package/dist/content.mjs CHANGED
@@ -139,6 +139,20 @@ function extensionOf(name) {
139
139
  function mediaTypeFromExtension(ext) {
140
140
  return MEDIA_TYPE_BY_EXTENSION[ext.toLowerCase()];
141
141
  }
142
+ function readContentHints(value) {
143
+ if (!value || typeof value !== "object")
144
+ return {};
145
+ const v = value;
146
+ const hints = {};
147
+ if (typeof v.name === "string" && v.name && v.name.length <= 255 && !/[\/\\\0]/.test(v.name))
148
+ hints.name = v.name;
149
+ if (typeof v.mime === "string" && /^[\w.+-]+\/[\w.+-]+$/.test(v.mime))
150
+ hints.mime = v.mime.toLowerCase();
151
+ const size = typeof v.size === "string" ? Number(v.size) : v.size;
152
+ if (typeof size === "number" && Number.isSafeInteger(size) && size >= 0)
153
+ hints.size = size;
154
+ return hints;
155
+ }
142
156
  const previewHandler = {
143
157
  provider: "system",
144
158
  handler_id: "preview",
@@ -297,6 +311,48 @@ function expandOpenPath(path, request, modes = ["view", "edit"]) {
297
311
  const expanded = path.replace(/\{(source|mode|session)\}/g, (_, key) => encodeURIComponent(params[key]));
298
312
  return expanded + (expanded.includes("?") ? "&" : "?") + "requestId=" + encodeURIComponent(request.requestId);
299
313
  }
314
+ function systemOpenUrl(systemOrigin, open) {
315
+ const url = new URL("/", systemOrigin);
316
+ url.searchParams.set("open", contentRefString(open.request.source));
317
+ url.searchParams.set("intent", open.target);
318
+ const session = encodeSession(open.request.session, open.request.source);
319
+ if (session)
320
+ url.searchParams.set("session", session);
321
+ if (open.request.mode)
322
+ url.searchParams.set("mode", open.request.mode);
323
+ for (const key of ["name", "mime", "size"])
324
+ if (open.hints[key] !== void 0)
325
+ url.searchParams.set(key, String(open.hints[key]));
326
+ if (open.from)
327
+ url.searchParams.set("from", open.from);
328
+ return url.href;
329
+ }
330
+ function parseSystemOpen(params) {
331
+ const value = params.get("open");
332
+ if (!value)
333
+ return void 0;
334
+ const source = value.startsWith("obj://") ? { kind: "object-id", objectId: value.slice(6) } : { kind: "cyfs-path", path: value };
335
+ if (!isTransferableRef(source))
336
+ return void 0;
337
+ const intent = params.get("intent");
338
+ const target = intent === "preview" || intent === "chooser" ? intent : "default";
339
+ const request = { source };
340
+ const mode = params.get("mode");
341
+ if (mode === "view" || mode === "edit")
342
+ request.mode = mode;
343
+ const encoded = params.get("session");
344
+ if (encoded) {
345
+ try {
346
+ const session = JSON.parse(new TextDecoder().decode(Uint8Array.from(atob(encoded.replace(/-/g, "+").replace(/_/g, "/")), (c) => c.charCodeAt(0))));
347
+ if (isTransferableSession(session))
348
+ request.session = session;
349
+ } catch {
350
+ }
351
+ }
352
+ const from = params.get("from");
353
+ return { request, target, hints: readContentHints({ name: params.get("name") ?? void 0, mime: params.get("mime") ?? void 0, size: params.get("size") ?? void 0 }), from: from && /^[\w.@-]+$/.test(from) ? from : void 0 };
354
+ }
355
+ const handlerOfApp = (plan, appId) => !!plan.appInstanceId && plan.appInstanceId.split("@")[0] === appId.split("@")[0];
300
356
  class ContentRegistryClient {
301
357
  constructor(config, userId) {
302
358
  this.config = config;
@@ -349,13 +405,17 @@ export {
349
405
  encodeSession,
350
406
  expandOpenPath,
351
407
  extensionOf,
408
+ handlerOfApp,
352
409
  isOpenRequest,
353
410
  isTransferableRef,
354
411
  isTransferableSession,
355
412
  matchSelector,
356
413
  mediaTypeFromExtension,
357
414
  parentSource,
415
+ parseSystemOpen,
358
416
  previewHandler,
359
- resolveContentHandlers
417
+ readContentHints,
418
+ resolveContentHandlers,
419
+ systemOpenUrl
360
420
  };
361
421
  //# sourceMappingURL=content.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"content.mjs","sources":["../src/content_mime.ts","../src/content.ts"],"sourcesContent":["export const TEXT_CODE_EXTENSIONS = [\n 'txt', 'text', 'log', 'ini', 'conf', 'cfg', 'env', 'csv', 'tsv',\n 'md', 'markdown', 'rst', 'adoc',\n 'json', 'jsonc', 'json5', 'xml', 'yaml', 'yml', 'toml',\n 'ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'rs', 'py', 'go', 'c', 'h', 'cc', 'cpp', 'hpp',\n 'java', 'kt', 'swift', 'rb', 'php', 'sql', 'sh', 'bash', 'zsh', 'ps1', 'bat',\n 'css', 'scss', 'less', 'vue', 'svelte', 'lua', 'dart', 'r', 'scala', 'ex', 'exs',\n 'dockerfile', 'makefile', 'gitignore', 'editorconfig', 'lock',\n]\n\nconst MEDIA_TYPE_BY_EXTENSION: Record<string, string> = {\n png: 'image/png',\n apng: 'image/apng',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n jfif: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n ico: 'image/x-icon',\n avif: 'image/avif',\n heic: 'image/heic',\n heif: 'image/heif',\n tif: 'image/tiff',\n tiff: 'image/tiff',\n psd: 'image/vnd.adobe.photoshop',\n svg: 'image/svg+xml',\n mp4: 'video/mp4',\n m4v: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n mkv: 'video/x-matroska',\n avi: 'video/x-msvideo',\n ogv: 'video/ogg',\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n flac: 'audio/flac',\n ogg: 'audio/ogg',\n oga: 'audio/ogg',\n opus: 'audio/ogg',\n m4a: 'audio/mp4',\n aac: 'audio/aac',\n pdf: 'application/pdf',\n html: 'text/html',\n htm: 'text/html',\n xhtml: 'application/xhtml+xml',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n doc: 'application/msword',\n xls: 'application/vnd.ms-excel',\n ppt: 'application/vnd.ms-powerpoint',\n odt: 'application/vnd.oasis.opendocument.text',\n zip: 'application/zip',\n tar: 'application/x-tar',\n gz: 'application/gzip',\n '7z': 'application/x-7z-compressed',\n rar: 'application/vnd.rar',\n epub: 'application/epub+zip',\n md: 'text/markdown',\n markdown: 'text/markdown',\n json: 'application/json',\n xml: 'application/xml',\n csv: 'text/csv',\n yaml: 'application/yaml',\n yml: 'application/yaml',\n toml: 'application/toml',\n js: 'text/javascript',\n mjs: 'text/javascript',\n cjs: 'text/javascript',\n css: 'text/css',\n}\n\nfor (const ext of TEXT_CODE_EXTENSIONS) {\n if (!MEDIA_TYPE_BY_EXTENSION[ext]) MEDIA_TYPE_BY_EXTENSION[ext] = `text/x-${ext}`\n}\n\n\nexport function extensionOf(name: string | undefined): string {\n if (!name) return ''\n const base = name.split('/').pop() ?? name\n const dot = base.lastIndexOf('.')\n if (dot <= 0) return ''\n return base.slice(dot + 1).toLowerCase()\n}\n\nexport function mediaTypeFromExtension(ext: string): string | undefined {\n return MEDIA_TYPE_BY_EXTENSION[ext.toLowerCase()]\n}\n","import { extensionOf, mediaTypeFromExtension } from './content_mime'\nexport { extensionOf, mediaTypeFromExtension, TEXT_CODE_EXTENSIONS } from './content_mime'\n\nexport type TransferableContentRef =\n | { kind: 'cyfs-path'; path: string; version?: string }\n | { kind: 'object-id'; objectId: string; version?: string }\nexport type TransferableSessionContext =\n | { kind: 'single' }\n | { kind: 'container'; container: TransferableContentRef; current: TransferableContentRef; sort?: unknown; navigation?: 'wrap' | 'bounded' }\n | { kind: 'list'; sessionId?: string; version?: string; items: Array<{ id?: string; source: TransferableContentRef; title?: string }>; currentIndex: number; navigation?: 'wrap' | 'bounded' }\nexport interface OpenRequest {\n requestId: string\n source: TransferableContentRef\n session?: TransferableSessionContext\n mode?: 'view' | 'edit'\n origin?: { appInstanceId?: string; windowId?: string; hostContext?: string }\n}\nexport interface ContentSelector {\n objType?: string | string[]\n mime?: string | string[]\n schema?: string | string[]\n ext?: string[]\n maxSize?: number\n}\nexport interface ContentDescriptor {\n source: TransferableContentRef\n objType?: string\n mime?: string\n schema?: string\n ext?: string\n name?: string\n size?: number\n}\nexport interface OpenBinding {\n entry: { type: 'web'; path: string } | { type: 'builtin'; target: string }\n modes?: Array<'view' | 'edit'>\n fidelity?: 'full' | 'partial'\n window?: 'reuse' | 'new'\n multiSource?: boolean\n priority?: number\n}\nexport interface ContentHandlerEntry {\n provider: 'app' | 'system'\n app_instance_id?: string\n app_doc_object_id?: string\n app_version?: string\n handler_id: string\n handler_version: number\n selectors: ContentSelector[]\n intents: { open?: OpenBinding }\n permissions?: string[]\n enabled: boolean\n registered_at?: number\n}\nexport interface ContentRegistry { schema_version: 1; updated_at?: number; handlers: Record<string, ContentHandlerEntry> }\nexport interface ContentDefaults { schema_version: 1; defaults: { open?: Record<string, string> }; disabled: string[] }\nexport interface HandlerPlan {\n handlerKey: string\n handlerRef: string\n appInstanceId?: string\n appDocObjectId?: string\n handlerVersion: number\n intent: 'open'\n binding: OpenBinding\n matched: { selector: ContentSelector; specificity: number }\n reason: 'user-default' | 'system-default' | 'ranked'\n}\nexport const previewHandler: ContentHandlerEntry = {\n provider: 'system', handler_id: 'preview', handler_version: 1,\n selectors: [{ mime: '*/*' }], enabled: true,\n intents: { open: { entry: { type: 'builtin', target: 'preview' }, modes: ['view'], fidelity: 'partial', window: 'reuse', priority: 90 } },\n}\nexport const emptyDefaults = (): ContentDefaults => ({ schema_version: 1, defaults: {}, disabled: [] })\nexport const contentRefString = (ref: TransferableContentRef): string => ref.kind === 'cyfs-path' ? ref.path : `obj://${ref.objectId}`\nexport function isTransferableRef(value: unknown): value is TransferableContentRef {\n if (!value || typeof value !== 'object') return false\n const v = value as TransferableContentRef\n return (v.kind === 'cyfs-path' && typeof v.path === 'string' && /^cyfs:\\/\\/\\/[^\\0]*$/.test(v.path)) ||\n (v.kind === 'object-id' && typeof v.objectId === 'string' && /^[\\w.-]+:[\\w-]+$/.test(v.objectId))\n}\nexport function isOpenRequest(value: unknown): value is OpenRequest {\n if (!value || typeof value !== 'object') return false\n const v = value as OpenRequest\n return typeof v.requestId === 'string' && isTransferableRef(v.source) &&\n (v.mode === undefined || v.mode === 'view' || v.mode === 'edit') &&\n (v.session === undefined || isTransferableSession(v.session))\n}\nexport function isTransferableSession(value: unknown): value is TransferableSessionContext {\n if (!value || typeof value !== 'object') return false\n const v = value as TransferableSessionContext\n return v.kind === 'single' ||\n (v.kind === 'container' && isTransferableRef(v.container) && isTransferableRef(v.current)) ||\n (v.kind === 'list' && Array.isArray(v.items) && v.items.every(i => i && isTransferableRef(i.source)) &&\n Number.isInteger(v.currentIndex) && v.currentIndex >= 0 && v.currentIndex < v.items.length)\n}\nexport function contentDescriptor(source: TransferableContentRef, hints: { name?: string; mime?: string; size?: number } = {}): ContentDescriptor {\n const name = hints.name ?? contentRefString(source).split('/').pop() ?? ''\n const ext = extensionOf(name)\n return { source, name, size: hints.size, ext: ext ? `.${ext}` : undefined,\n objType: source.kind === 'cyfs-path' ? 'cyfile' : source.objectId.split(':')[0],\n mime: hints.mime || mediaTypeFromExtension(ext) || 'application/octet-stream' }\n}\nconst values = (v?: string | string[]) => v === undefined ? [] : Array.isArray(v) ? v : [v]\nexport function matchSelector(s: ContentSelector, d: ContentDescriptor): number {\n if (s.maxSize !== undefined && d.size !== undefined && d.size > s.maxSize) return 0\n if (s.objType && !values(s.objType).includes(d.objType ?? '')) return 0\n let score = s.objType ? 2 : 1\n if (s.schema) {\n const matches = values(s.schema).filter(v => v.endsWith('*') ? d.schema?.startsWith(v.slice(0, -1)) : d.schema === v)\n if (!matches.length) return 0\n score = matches.some(v => v === d.schema) ? 7 : 6\n }\n if (s.mime) {\n const mime = (d.mime ?? '').toLowerCase().split(';')[0].trim()\n const scores = values(s.mime).map(v => {\n v = v.toLowerCase()\n if (v === '*/*') return 1\n if (v.split(';')[0].trim() === mime) return s.objType ? 6 : 5\n if (v.includes('/*+') && mime.startsWith(v.split('/')[0] + '/') && mime.endsWith(v.slice(v.indexOf('+')))) return 4\n if (v.endsWith('/*') && mime.startsWith(v.slice(0, -1))) return 3\n return 0\n })\n const best = Math.max(...scores, 0)\n if (!best) return 0\n score = Math.max(score, best)\n }\n if (!s.mime && !s.objType && !s.schema && !s.ext?.includes(d.ext ?? '')) return 0\n return score\n}\nfunction compactSelector(value: string): ContentSelector {\n const out: ContentSelector = {}\n for (const part of value.split(';')) {\n const i = part.indexOf(':'); const key = part.slice(0, i); const v = part.slice(i + 1)\n if (key === 'obj') out.objType = v\n else if (key === 'mime') out.mime = v\n else if (key === 'schema') out.schema = v\n else if (key === 'ext') out.ext = [v]\n else return {}\n }\n return out\n}\nexport function resolveContentHandlers(registry: ContentRegistry, defaults: ContentDefaults, descriptor: ContentDescriptor,\n intent: 'open' = 'open', _host: unknown = {}, availableApps: Iterable<string> = []): HandlerPlan[] {\n const visible = new Set(availableApps)\n const handlers = { ...registry.handlers, 'system#preview': previewHandler }\n const preferred = Object.entries(defaults.defaults.open ?? {})\n .map(([s, key]) => ({ key, score: matchSelector(compactSelector(s), descriptor) }))\n .filter(v => v.score > 0).sort((a, b) => b.score - a.score || a.key.localeCompare(b.key))\n const matches = Object.entries(handlers).flatMap(([key, h]) => {\n const binding = h.intents[intent]\n if (!binding || !h.enabled || (key !== 'system#preview' && defaults.disabled.includes(key))) return []\n if (h.provider === 'app' && (!h.app_instance_id || !visible.has(h.app_instance_id) || binding.entry.type !== 'web')) return []\n const selectors = h.selectors.map(selector => ({ selector, specificity: matchSelector(selector, descriptor) }))\n .filter(s => s.specificity > 0).sort((a, b) => b.specificity - a.specificity)\n if (!selectors.length) return []\n return [{ key, h, binding, matched: selectors[0] }]\n })\n const preferredKey = preferred.find(p => matches.some(m => m.key === p.key))?.key\n matches.sort((a, b) => Number(b.key === preferredKey) - Number(a.key === preferredKey) ||\n Number(b.matched.specificity > 1 || b.h.provider === 'system') - Number(a.matched.specificity > 1 || a.h.provider === 'system') ||\n b.matched.specificity - a.matched.specificity || (b.binding.priority ?? 0) - (a.binding.priority ?? 0) ||\n Number(b.h.provider === 'system') - Number(a.h.provider === 'system') ||\n (a.h.registered_at ?? 0) - (b.h.registered_at ?? 0) || a.key.localeCompare(b.key))\n return matches.map(m => ({ handlerKey: m.key, handlerRef: `${m.h.app_instance_id?.split('@')[0] ?? 'system'}#${m.h.handler_id}`,\n appInstanceId: m.h.app_instance_id, appDocObjectId: m.h.app_doc_object_id, handlerVersion: m.h.handler_version,\n intent, binding: m.binding, matched: m.matched,\n reason: m.key === preferredKey ? 'user-default' : m.h.provider === 'system' ? 'system-default' : 'ranked' }))\n}\nexport function parentSource(source: TransferableContentRef): TransferableContentRef | undefined {\n if (source.kind !== 'cyfs-path') return undefined\n const i = source.path.lastIndexOf('/')\n return i >= 7 ? { kind: 'cyfs-path', path: source.path.slice(0, i) || 'cyfs:///' } : undefined\n}\nexport function encodeSession(session: TransferableSessionContext | undefined, source: TransferableContentRef): string {\n if (!session) return ''\n const encode = (v: TransferableSessionContext) => btoa(Array.from(new TextEncoder().encode(JSON.stringify(v)), b => String.fromCharCode(b)).join(''))\n .replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n const encoded = encode(session)\n if (encoded.length <= 2048 || session.kind !== 'list') return encoded\n const parent = parentSource(source)\n if (parent && session.items.every(i => contentRefString(parentSource(i.source) ?? i.source) === contentRefString(parent))) {\n return encode({ kind: 'container', container: parent, current: source })\n }\n return ''\n}\nexport function expandOpenPath(path: string, request: OpenRequest, modes: Array<'view' | 'edit'> = ['view', 'edit']): string {\n if (!path.startsWith('/') || path.startsWith('//') || /(?:\\.\\.|\\\\|[\\r\\n])/.test(decodeURIComponent(path))) throw new Error('Invalid App entry path')\n const params: Record<string, string> = { source: contentRefString(request.source), mode: request.mode ?? (modes.includes('edit') ? 'edit' : 'view'), session: encodeSession(request.session, request.source) }\n const expanded = path.replace(/\\{(source|mode|session)\\}/g, (_, key: string) => encodeURIComponent(params[key]))\n return expanded + (expanded.includes('?') ? '&' : '?') + 'requestId=' + encodeURIComponent(request.requestId)\n}\nexport class ContentRegistryClient {\n registry: ContentRegistry = { schema_version: 1, handlers: {} }\n defaults = emptyDefaults()\n updatedAt = 0\n private listeners = new Set<() => void>()\n constructor(private config: { get(key: string): Promise<{ value: string }>; set(key: string, value: string): Promise<unknown> }, private userId: string) {}\n async refresh(): Promise<void> {\n const [registry, defaults] = await Promise.all([this.config.get('system/content_registry'), this.config.get(`users/${this.userId}/content_defaults`).catch(error => { if (/not found|not_found/i.test(String(error))) return null; throw error })])\n this.registry = JSON.parse(registry.value)\n this.defaults = defaults ? JSON.parse(defaults.value) : emptyDefaults()\n this.updatedAt = Date.now()\n this.listeners.forEach(cb => cb())\n }\n async setDefault(intent: 'open', selector: string, handlerKey: string | null): Promise<void> {\n await this.refresh()\n const next = { ...this.defaults.defaults[intent] }\n if (handlerKey) next[selector] = handlerKey\n else delete next[selector]\n await this.persist({ ...this.defaults, defaults: { ...this.defaults.defaults, [intent]: next } })\n }\n async setEnabled(key: string, enabled: boolean): Promise<void> {\n await this.refresh()\n await this.persist({ ...this.defaults, disabled: [...new Set([...this.defaults.disabled.filter(k => k !== key), ...enabled ? [] : [key]])] })\n }\n onChanged(cb: () => void): () => void { this.listeners.add(cb); return () => this.listeners.delete(cb) }\n private async persist(next: ContentDefaults): Promise<void> {\n await this.config.set(`users/${this.userId}/content_defaults`, JSON.stringify(next))\n this.defaults = next\n this.listeners.forEach(cb => cb())\n }\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"content.mjs","sources":["../src/content_mime.ts","../src/content.ts"],"sourcesContent":["export const TEXT_CODE_EXTENSIONS = [\n 'txt', 'text', 'log', 'ini', 'conf', 'cfg', 'env', 'csv', 'tsv',\n 'md', 'markdown', 'rst', 'adoc',\n 'json', 'jsonc', 'json5', 'xml', 'yaml', 'yml', 'toml',\n 'ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'rs', 'py', 'go', 'c', 'h', 'cc', 'cpp', 'hpp',\n 'java', 'kt', 'swift', 'rb', 'php', 'sql', 'sh', 'bash', 'zsh', 'ps1', 'bat',\n 'css', 'scss', 'less', 'vue', 'svelte', 'lua', 'dart', 'r', 'scala', 'ex', 'exs',\n 'dockerfile', 'makefile', 'gitignore', 'editorconfig', 'lock',\n]\n\nconst MEDIA_TYPE_BY_EXTENSION: Record<string, string> = {\n png: 'image/png',\n apng: 'image/apng',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n jfif: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n ico: 'image/x-icon',\n avif: 'image/avif',\n heic: 'image/heic',\n heif: 'image/heif',\n tif: 'image/tiff',\n tiff: 'image/tiff',\n psd: 'image/vnd.adobe.photoshop',\n svg: 'image/svg+xml',\n mp4: 'video/mp4',\n m4v: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n mkv: 'video/x-matroska',\n avi: 'video/x-msvideo',\n ogv: 'video/ogg',\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n flac: 'audio/flac',\n ogg: 'audio/ogg',\n oga: 'audio/ogg',\n opus: 'audio/ogg',\n m4a: 'audio/mp4',\n aac: 'audio/aac',\n pdf: 'application/pdf',\n html: 'text/html',\n htm: 'text/html',\n xhtml: 'application/xhtml+xml',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n doc: 'application/msword',\n xls: 'application/vnd.ms-excel',\n ppt: 'application/vnd.ms-powerpoint',\n odt: 'application/vnd.oasis.opendocument.text',\n zip: 'application/zip',\n tar: 'application/x-tar',\n gz: 'application/gzip',\n '7z': 'application/x-7z-compressed',\n rar: 'application/vnd.rar',\n epub: 'application/epub+zip',\n md: 'text/markdown',\n markdown: 'text/markdown',\n json: 'application/json',\n xml: 'application/xml',\n csv: 'text/csv',\n yaml: 'application/yaml',\n yml: 'application/yaml',\n toml: 'application/toml',\n js: 'text/javascript',\n mjs: 'text/javascript',\n cjs: 'text/javascript',\n css: 'text/css',\n}\n\nfor (const ext of TEXT_CODE_EXTENSIONS) {\n if (!MEDIA_TYPE_BY_EXTENSION[ext]) MEDIA_TYPE_BY_EXTENSION[ext] = `text/x-${ext}`\n}\n\n\nexport function extensionOf(name: string | undefined): string {\n if (!name) return ''\n const base = name.split('/').pop() ?? name\n const dot = base.lastIndexOf('.')\n if (dot <= 0) return ''\n return base.slice(dot + 1).toLowerCase()\n}\n\nexport function mediaTypeFromExtension(ext: string): string | undefined {\n return MEDIA_TYPE_BY_EXTENSION[ext.toLowerCase()]\n}\n","import { extensionOf, mediaTypeFromExtension } from './content_mime'\nexport { extensionOf, mediaTypeFromExtension, TEXT_CODE_EXTENSIONS } from './content_mime'\n\nexport type TransferableContentRef =\n | { kind: 'cyfs-path'; path: string; version?: string }\n | { kind: 'object-id'; objectId: string; version?: string }\nexport type TransferableSessionContext =\n | { kind: 'single' }\n | { kind: 'container'; container: TransferableContentRef; current: TransferableContentRef; sort?: unknown; navigation?: 'wrap' | 'bounded' }\n | { kind: 'list'; sessionId?: string; version?: string; items: Array<{ id?: string; source: TransferableContentRef; title?: string }>; currentIndex: number; navigation?: 'wrap' | 'bounded' }\nexport interface OpenRequest {\n requestId: string\n source: TransferableContentRef\n session?: TransferableSessionContext\n mode?: 'view' | 'edit'\n origin?: { appInstanceId?: string; windowId?: string; hostContext?: string }\n}\nexport type ContentOpenTarget = 'default' | 'preview' | 'chooser'\nexport interface ContentHints { name?: string; mime?: string; size?: number }\nexport function readContentHints(value: unknown): ContentHints {\n if (!value || typeof value !== 'object') return {}\n const v = value as Record<string, unknown>\n const hints: ContentHints = {}\n if (typeof v.name === 'string' && v.name && v.name.length <= 255 && !/[\\/\\\\\\0]/.test(v.name)) hints.name = v.name\n if (typeof v.mime === 'string' && /^[\\w.+-]+\\/[\\w.+-]+$/.test(v.mime)) hints.mime = v.mime.toLowerCase()\n const size = typeof v.size === 'string' ? Number(v.size) : v.size\n if (typeof size === 'number' && Number.isSafeInteger(size) && size >= 0) hints.size = size\n return hints\n}\nexport interface ContentSelector {\n objType?: string | string[]\n mime?: string | string[]\n schema?: string | string[]\n ext?: string[]\n maxSize?: number\n}\nexport interface ContentDescriptor {\n source: TransferableContentRef\n objType?: string\n mime?: string\n schema?: string\n ext?: string\n name?: string\n size?: number\n}\nexport interface OpenBinding {\n entry: { type: 'web'; path: string } | { type: 'builtin'; target: string }\n modes?: Array<'view' | 'edit'>\n fidelity?: 'full' | 'partial'\n window?: 'reuse' | 'new'\n multiSource?: boolean\n priority?: number\n}\nexport interface ContentHandlerEntry {\n provider: 'app' | 'system'\n app_instance_id?: string\n app_doc_object_id?: string\n app_version?: string\n handler_id: string\n handler_version: number\n selectors: ContentSelector[]\n intents: { open?: OpenBinding }\n permissions?: string[]\n enabled: boolean\n registered_at?: number\n}\nexport interface ContentRegistry { schema_version: 1; updated_at?: number; handlers: Record<string, ContentHandlerEntry> }\nexport interface ContentDefaults { schema_version: 1; defaults: { open?: Record<string, string> }; disabled: string[] }\nexport interface HandlerPlan {\n handlerKey: string\n handlerRef: string\n appInstanceId?: string\n appDocObjectId?: string\n handlerVersion: number\n intent: 'open'\n binding: OpenBinding\n matched: { selector: ContentSelector; specificity: number }\n reason: 'user-default' | 'system-default' | 'ranked'\n}\nexport const previewHandler: ContentHandlerEntry = {\n provider: 'system', handler_id: 'preview', handler_version: 1,\n selectors: [{ mime: '*/*' }], enabled: true,\n intents: { open: { entry: { type: 'builtin', target: 'preview' }, modes: ['view'], fidelity: 'partial', window: 'reuse', priority: 90 } },\n}\nexport const emptyDefaults = (): ContentDefaults => ({ schema_version: 1, defaults: {}, disabled: [] })\nexport const contentRefString = (ref: TransferableContentRef): string => ref.kind === 'cyfs-path' ? ref.path : `obj://${ref.objectId}`\nexport function isTransferableRef(value: unknown): value is TransferableContentRef {\n if (!value || typeof value !== 'object') return false\n const v = value as TransferableContentRef\n return (v.kind === 'cyfs-path' && typeof v.path === 'string' && /^cyfs:\\/\\/\\/[^\\0]*$/.test(v.path)) ||\n (v.kind === 'object-id' && typeof v.objectId === 'string' && /^[\\w.-]+:[\\w-]+$/.test(v.objectId))\n}\nexport function isOpenRequest(value: unknown): value is OpenRequest {\n if (!value || typeof value !== 'object') return false\n const v = value as OpenRequest\n return typeof v.requestId === 'string' && isTransferableRef(v.source) &&\n (v.mode === undefined || v.mode === 'view' || v.mode === 'edit') &&\n (v.session === undefined || isTransferableSession(v.session))\n}\nexport function isTransferableSession(value: unknown): value is TransferableSessionContext {\n if (!value || typeof value !== 'object') return false\n const v = value as TransferableSessionContext\n return v.kind === 'single' ||\n (v.kind === 'container' && isTransferableRef(v.container) && isTransferableRef(v.current)) ||\n (v.kind === 'list' && Array.isArray(v.items) && v.items.every(i => i && isTransferableRef(i.source)) &&\n Number.isInteger(v.currentIndex) && v.currentIndex >= 0 && v.currentIndex < v.items.length)\n}\nexport function contentDescriptor(source: TransferableContentRef, hints: { name?: string; mime?: string; size?: number } = {}): ContentDescriptor {\n const name = hints.name ?? contentRefString(source).split('/').pop() ?? ''\n const ext = extensionOf(name)\n return { source, name, size: hints.size, ext: ext ? `.${ext}` : undefined,\n objType: source.kind === 'cyfs-path' ? 'cyfile' : source.objectId.split(':')[0],\n mime: hints.mime || mediaTypeFromExtension(ext) || 'application/octet-stream' }\n}\nconst values = (v?: string | string[]) => v === undefined ? [] : Array.isArray(v) ? v : [v]\nexport function matchSelector(s: ContentSelector, d: ContentDescriptor): number {\n if (s.maxSize !== undefined && d.size !== undefined && d.size > s.maxSize) return 0\n if (s.objType && !values(s.objType).includes(d.objType ?? '')) return 0\n let score = s.objType ? 2 : 1\n if (s.schema) {\n const matches = values(s.schema).filter(v => v.endsWith('*') ? d.schema?.startsWith(v.slice(0, -1)) : d.schema === v)\n if (!matches.length) return 0\n score = matches.some(v => v === d.schema) ? 7 : 6\n }\n if (s.mime) {\n const mime = (d.mime ?? '').toLowerCase().split(';')[0].trim()\n const scores = values(s.mime).map(v => {\n v = v.toLowerCase()\n if (v === '*/*') return 1\n if (v.split(';')[0].trim() === mime) return s.objType ? 6 : 5\n if (v.includes('/*+') && mime.startsWith(v.split('/')[0] + '/') && mime.endsWith(v.slice(v.indexOf('+')))) return 4\n if (v.endsWith('/*') && mime.startsWith(v.slice(0, -1))) return 3\n return 0\n })\n const best = Math.max(...scores, 0)\n if (!best) return 0\n score = Math.max(score, best)\n }\n if (!s.mime && !s.objType && !s.schema && !s.ext?.includes(d.ext ?? '')) return 0\n return score\n}\nfunction compactSelector(value: string): ContentSelector {\n const out: ContentSelector = {}\n for (const part of value.split(';')) {\n const i = part.indexOf(':'); const key = part.slice(0, i); const v = part.slice(i + 1)\n if (key === 'obj') out.objType = v\n else if (key === 'mime') out.mime = v\n else if (key === 'schema') out.schema = v\n else if (key === 'ext') out.ext = [v]\n else return {}\n }\n return out\n}\nexport function resolveContentHandlers(registry: ContentRegistry, defaults: ContentDefaults, descriptor: ContentDescriptor,\n intent: 'open' = 'open', _host: unknown = {}, availableApps: Iterable<string> = []): HandlerPlan[] {\n const visible = new Set(availableApps)\n const handlers = { ...registry.handlers, 'system#preview': previewHandler }\n const preferred = Object.entries(defaults.defaults.open ?? {})\n .map(([s, key]) => ({ key, score: matchSelector(compactSelector(s), descriptor) }))\n .filter(v => v.score > 0).sort((a, b) => b.score - a.score || a.key.localeCompare(b.key))\n const matches = Object.entries(handlers).flatMap(([key, h]) => {\n const binding = h.intents[intent]\n if (!binding || !h.enabled || (key !== 'system#preview' && defaults.disabled.includes(key))) return []\n if (h.provider === 'app' && (!h.app_instance_id || !visible.has(h.app_instance_id) || binding.entry.type !== 'web')) return []\n const selectors = h.selectors.map(selector => ({ selector, specificity: matchSelector(selector, descriptor) }))\n .filter(s => s.specificity > 0).sort((a, b) => b.specificity - a.specificity)\n if (!selectors.length) return []\n return [{ key, h, binding, matched: selectors[0] }]\n })\n const preferredKey = preferred.find(p => matches.some(m => m.key === p.key))?.key\n matches.sort((a, b) => Number(b.key === preferredKey) - Number(a.key === preferredKey) ||\n Number(b.matched.specificity > 1 || b.h.provider === 'system') - Number(a.matched.specificity > 1 || a.h.provider === 'system') ||\n b.matched.specificity - a.matched.specificity || (b.binding.priority ?? 0) - (a.binding.priority ?? 0) ||\n Number(b.h.provider === 'system') - Number(a.h.provider === 'system') ||\n (a.h.registered_at ?? 0) - (b.h.registered_at ?? 0) || a.key.localeCompare(b.key))\n return matches.map(m => ({ handlerKey: m.key, handlerRef: `${m.h.app_instance_id?.split('@')[0] ?? 'system'}#${m.h.handler_id}`,\n appInstanceId: m.h.app_instance_id, appDocObjectId: m.h.app_doc_object_id, handlerVersion: m.h.handler_version,\n intent, binding: m.binding, matched: m.matched,\n reason: m.key === preferredKey ? 'user-default' : m.h.provider === 'system' ? 'system-default' : 'ranked' }))\n}\nexport function parentSource(source: TransferableContentRef): TransferableContentRef | undefined {\n if (source.kind !== 'cyfs-path') return undefined\n const i = source.path.lastIndexOf('/')\n return i >= 7 ? { kind: 'cyfs-path', path: source.path.slice(0, i) || 'cyfs:///' } : undefined\n}\nexport function encodeSession(session: TransferableSessionContext | undefined, source: TransferableContentRef): string {\n if (!session) return ''\n const encode = (v: TransferableSessionContext) => btoa(Array.from(new TextEncoder().encode(JSON.stringify(v)), b => String.fromCharCode(b)).join(''))\n .replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n const encoded = encode(session)\n if (encoded.length <= 2048 || session.kind !== 'list') return encoded\n const parent = parentSource(source)\n if (parent && session.items.every(i => contentRefString(parentSource(i.source) ?? i.source) === contentRefString(parent))) {\n return encode({ kind: 'container', container: parent, current: source })\n }\n return ''\n}\nexport function expandOpenPath(path: string, request: OpenRequest, modes: Array<'view' | 'edit'> = ['view', 'edit']): string {\n if (!path.startsWith('/') || path.startsWith('//') || /(?:\\.\\.|\\\\|[\\r\\n])/.test(decodeURIComponent(path))) throw new Error('Invalid App entry path')\n const params: Record<string, string> = { source: contentRefString(request.source), mode: request.mode ?? (modes.includes('edit') ? 'edit' : 'view'), session: encodeSession(request.session, request.source) }\n const expanded = path.replace(/\\{(source|mode|session)\\}/g, (_, key: string) => encodeURIComponent(params[key]))\n return expanded + (expanded.includes('?') ? '&' : '?') + 'requestId=' + encodeURIComponent(request.requestId)\n}\nexport interface SystemOpenRequest {\n request: Omit<OpenRequest, 'requestId'>\n target: ContentOpenTarget\n hints: ContentHints\n /** AppId of the App asking the system to open this content; its own handlers are not offered back to it. */\n from?: string\n}\nexport function systemOpenUrl(systemOrigin: string, open: SystemOpenRequest): string {\n const url = new URL('/', systemOrigin)\n url.searchParams.set('open', contentRefString(open.request.source))\n url.searchParams.set('intent', open.target)\n const session = encodeSession(open.request.session, open.request.source)\n if (session) url.searchParams.set('session', session)\n if (open.request.mode) url.searchParams.set('mode', open.request.mode)\n for (const key of ['name', 'mime', 'size'] as const) if (open.hints[key] !== undefined) url.searchParams.set(key, String(open.hints[key]))\n if (open.from) url.searchParams.set('from', open.from)\n return url.href\n}\nexport function parseSystemOpen(params: URLSearchParams): SystemOpenRequest | undefined {\n const value = params.get('open')\n if (!value) return undefined\n const source: TransferableContentRef = value.startsWith('obj://') ? { kind: 'object-id', objectId: value.slice(6) } : { kind: 'cyfs-path', path: value }\n if (!isTransferableRef(source)) return undefined\n const intent = params.get('intent')\n const target: ContentOpenTarget = intent === 'preview' || intent === 'chooser' ? intent : 'default'\n const request: Omit<OpenRequest, 'requestId'> = { source }\n const mode = params.get('mode')\n if (mode === 'view' || mode === 'edit') request.mode = mode\n const encoded = params.get('session')\n if (encoded) {\n try {\n const session = JSON.parse(new TextDecoder().decode(Uint8Array.from(atob(encoded.replace(/-/g, '+').replace(/_/g, '/')), c => c.charCodeAt(0))))\n if (isTransferableSession(session)) request.session = session\n } catch {}\n }\n const from = params.get('from')\n return { request, target, hints: readContentHints({ name: params.get('name') ?? undefined, mime: params.get('mime') ?? undefined, size: params.get('size') ?? undefined }), from: from && /^[\\w.@-]+$/.test(from) ? from : undefined }\n}\n/** Whether a handler belongs to the App identified by `appId` (an AppId, or an AppInstanceId `<appId>@<owner>`). */\nexport const handlerOfApp = (plan: Pick<HandlerPlan, 'appInstanceId'>, appId: string): boolean =>\n !!plan.appInstanceId && plan.appInstanceId.split('@')[0] === appId.split('@')[0]\nexport class ContentRegistryClient {\n registry: ContentRegistry = { schema_version: 1, handlers: {} }\n defaults = emptyDefaults()\n updatedAt = 0\n private listeners = new Set<() => void>()\n constructor(private config: { get(key: string): Promise<{ value: string }>; set(key: string, value: string): Promise<unknown> }, private userId: string) {}\n async refresh(): Promise<void> {\n const [registry, defaults] = await Promise.all([this.config.get('system/content_registry'), this.config.get(`users/${this.userId}/content_defaults`).catch(error => { if (/not found|not_found/i.test(String(error))) return null; throw error })])\n this.registry = JSON.parse(registry.value)\n this.defaults = defaults ? JSON.parse(defaults.value) : emptyDefaults()\n this.updatedAt = Date.now()\n this.listeners.forEach(cb => cb())\n }\n async setDefault(intent: 'open', selector: string, handlerKey: string | null): Promise<void> {\n await this.refresh()\n const next = { ...this.defaults.defaults[intent] }\n if (handlerKey) next[selector] = handlerKey\n else delete next[selector]\n await this.persist({ ...this.defaults, defaults: { ...this.defaults.defaults, [intent]: next } })\n }\n async setEnabled(key: string, enabled: boolean): Promise<void> {\n await this.refresh()\n await this.persist({ ...this.defaults, disabled: [...new Set([...this.defaults.disabled.filter(k => k !== key), ...enabled ? [] : [key]])] })\n }\n onChanged(cb: () => void): () => void { this.listeners.add(cb); return () => this.listeners.delete(cb) }\n private async persist(next: ContentDefaults): Promise<void> {\n await this.config.set(`users/${this.userId}/content_defaults`, JSON.stringify(next))\n this.defaults = next\n this.listeners.forEach(cb => cb())\n }\n}\n"],"names":["_a"],"mappings":"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"}