Skip to content

src/paths.ts

65 lines · 2.2 KB · TypeScript
Raw
/**
 * Dropbox path constants and helpers for the Kody app folder.
 * Prefer listing root (`listFolder({ path: '' })`) before inventing paths.
 *
 * @example
 * import { APP_FOLDER_ROOT, underAppFolder } from 'kody:@kentcdodds/dropbox/paths'
 * const dest = underAppFolder('notes/hello.txt')
 * // => '/Apps/Kody/notes/hello.txt'
 */

/** Writable Kody app folder in full Dropbox path space. */
export const APP_FOLDER_ROOT = '/Apps/Kody'

/** Binary size above which `./upload` auto-delegates to `./upload-large` (120 KiB). */
export const UPLOAD_SINGLE_MAX_BYTES = 120 * 1024

/**
 * Preferred binary chunk size for upload sessions (~48 KiB).
 * Keeps each Dropbox append modest; put the full `bytesBase64` in execute `params`, never in `code`.
 */
export const UPLOAD_SESSION_CHUNK_BYTES = 48 * 1024

/**
 * Join a relative path under the Kody app folder.
 * Accepts `notes/a.txt`, `/notes/a.txt`, or an already-rooted `/Apps/Kody/...` path.
 */
export function underAppFolder(relativeOrAbsolute: string): string {
	const raw = typeof relativeOrAbsolute === 'string' ? relativeOrAbsolute.trim() : ''
	if (!raw) return APP_FOLDER_ROOT
	if (raw === APP_FOLDER_ROOT || raw.startsWith(`${APP_FOLDER_ROOT}/`)) return raw
	const trimmed = raw.replace(/^\/+/, '')
	if (trimmed.toLowerCase().startsWith('apps/kody/') || trimmed.toLowerCase() === 'apps/kody') {
		return `/${trimmed}`
	}
	return `${APP_FOLDER_ROOT}/${trimmed}`
}

/**
 * Suggest the app-folder prefix when a Dropbox path looks wrong (409 / not_found).
 */
export function suggestAppFolderPath(path: string): string {
	if (!path || path === '') return APP_FOLDER_ROOT
	if (path.startsWith(APP_FOLDER_ROOT)) return path
	if (path.startsWith('/Kody/') || path === '/Kody') {
		return underAppFolder(path.replace(/^\/Kody\/?/, ''))
	}
	return underAppFolder(path)
}

/**
 * Describe Dropbox path conventions for agents.
 *
 * @example
 * import paths from 'kody:@kentcdodds/dropbox/paths'
 * const overview = await paths()
 */
export default async function pathsOverview() {
	return {
		APP_FOLDER_ROOT,
		UPLOAD_SINGLE_MAX_BYTES,
		UPLOAD_SESSION_CHUNK_BYTES,
		primer:
			'List listFolder({ path: \'\' }) first. Writable Kody files live under /Apps/Kody/… — not /Kody/…. Use underAppFolder() for relative names.',
	}
}