@agent-native/core 0.49.12 → 0.49.13
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.
- package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.js +1 -1
- package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
- package/dist/cli/recap.d.ts +37 -0
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +240 -0
- package/dist/cli/recap.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +5 -10
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/blocks/library/question-form.js +1 -1
- package/dist/client/blocks/library/question-form.js.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.js +4 -0
- package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +12 -4
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsListPage.js +14 -9
- package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +6 -4
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/extensions/iframe-bridge.d.ts +8 -0
- package/dist/client/extensions/iframe-bridge.d.ts.map +1 -1
- package/dist/client/extensions/iframe-bridge.js +54 -0
- package/dist/client/extensions/iframe-bridge.js.map +1 -1
- package/dist/client/progress/RunsTray.d.ts.map +1 -1
- package/dist/client/progress/RunsTray.js +12 -3
- package/dist/client/progress/RunsTray.js.map +1 -1
- package/dist/client/resources/ResourceEditor.d.ts +1 -3
- package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
- package/dist/client/resources/ResourceEditor.js +8 -23
- package/dist/client/resources/ResourceEditor.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +4 -9
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
- package/dist/client/sharing/ShareButton.d.ts +5 -1
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +15 -7
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
- package/dist/client/sharing/ShareDialog.js +6 -2
- package/dist/client/sharing/ShareDialog.js.map +1 -1
- package/dist/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +70 -2
- package/dist/extensions/actions.js.map +1 -1
- package/dist/extensions/html-shell.d.ts +12 -0
- package/dist/extensions/html-shell.d.ts.map +1 -1
- package/dist/extensions/html-shell.js.map +1 -1
- package/dist/extensions/local.d.ts +35 -0
- package/dist/extensions/local.d.ts.map +1 -0
- package/dist/extensions/local.js +334 -0
- package/dist/extensions/local.js.map +1 -0
- package/dist/extensions/routes.d.ts.map +1 -1
- package/dist/extensions/routes.js +92 -12
- package/dist/extensions/routes.js.map +1 -1
- package/dist/extensions/slots/store.d.ts.map +1 -1
- package/dist/extensions/slots/store.js +72 -4
- package/dist/extensions/slots/store.js.map +1 -1
- package/dist/local-artifacts/index.d.ts +4 -0
- package/dist/local-artifacts/index.d.ts.map +1 -1
- package/dist/local-artifacts/index.js +60 -35
- package/dist/local-artifacts/index.js.map +1 -1
- package/docs/content/extensions.md +65 -0
- package/docs/content/local-file-mode.md +153 -0
- package/docs/content/template-content.md +51 -4
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/local-artifacts/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/local-artifacts/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -116,6 +116,9 @@ function normalizeManifestApp(value) {
|
|
|
116
116
|
components: typeof value.components === "string" || Array.isArray(value.components)
|
|
117
117
|
? asStringArray(value.components)
|
|
118
118
|
: undefined,
|
|
119
|
+
extensions: typeof value.extensions === "string" || Array.isArray(value.extensions)
|
|
120
|
+
? asStringArray(value.extensions)
|
|
121
|
+
: undefined,
|
|
119
122
|
hide: asStringArray(value.hide),
|
|
120
123
|
};
|
|
121
124
|
}
|
|
@@ -223,6 +226,7 @@ function mergeAppConfig(manifestApp, defaults) {
|
|
|
223
226
|
? manifestApp.roots
|
|
224
227
|
: (defaults?.roots ?? []),
|
|
225
228
|
components: manifestApp?.components ?? defaults?.components,
|
|
229
|
+
extensions: manifestApp?.extensions ?? defaults?.extensions,
|
|
226
230
|
hide: [...(defaults?.hide ?? []), ...(manifestApp?.hide ?? [])],
|
|
227
231
|
};
|
|
228
232
|
}
|
|
@@ -267,6 +271,7 @@ export async function getLocalArtifactApp(options) {
|
|
|
267
271
|
workspaceRoot,
|
|
268
272
|
roots,
|
|
269
273
|
components: asStringArray(app.components),
|
|
274
|
+
extensions: asStringArray(app.extensions),
|
|
270
275
|
hide: [...DEFAULT_HIDE_PATTERNS, ...asStringArray(app.hide)],
|
|
271
276
|
};
|
|
272
277
|
}
|
|
@@ -288,6 +293,9 @@ function hashContent(content) {
|
|
|
288
293
|
return crypto.createHash("sha256").update(content).digest("hex");
|
|
289
294
|
}
|
|
290
295
|
const writeLocks = new Map();
|
|
296
|
+
function noFollowOpenFlags() {
|
|
297
|
+
return fsSync.constants.O_RDONLY | (fsSync.constants.O_NOFOLLOW ?? 0);
|
|
298
|
+
}
|
|
291
299
|
async function withWriteLock(absolutePath, fn) {
|
|
292
300
|
const previous = writeLocks.get(absolutePath) ?? Promise.resolve();
|
|
293
301
|
let release;
|
|
@@ -307,14 +315,58 @@ async function withWriteLock(absolutePath, fn) {
|
|
|
307
315
|
}
|
|
308
316
|
}
|
|
309
317
|
}
|
|
310
|
-
|
|
311
|
-
const
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
const
|
|
318
|
+
function assertNoSymlinkPathSync(root, absolutePath, options = {}) {
|
|
319
|
+
const relative = path.relative(root.absolutePath, absolutePath);
|
|
320
|
+
const segments = relative.split(path.sep).filter(Boolean);
|
|
321
|
+
let current = root.absolutePath;
|
|
322
|
+
const pathsToCheck = [
|
|
323
|
+
current,
|
|
324
|
+
...segments.map((segment) => {
|
|
325
|
+
current = path.join(current, segment);
|
|
326
|
+
return current;
|
|
327
|
+
}),
|
|
328
|
+
];
|
|
329
|
+
for (let index = 0; index < pathsToCheck.length; index += 1) {
|
|
330
|
+
const candidate = pathsToCheck[index];
|
|
331
|
+
try {
|
|
332
|
+
const stat = fsSync.lstatSync(candidate);
|
|
333
|
+
if (stat.isSymbolicLink()) {
|
|
334
|
+
throw new Error(`Path "${candidate}" must not traverse a symlink`);
|
|
335
|
+
}
|
|
336
|
+
if (index < pathsToCheck.length - 1 && !stat.isDirectory()) {
|
|
337
|
+
throw new Error(`Path "${candidate}" is not a directory`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
if (errorCode(error) === "ENOENT" && options.allowMissingLeaf)
|
|
342
|
+
return;
|
|
343
|
+
throw error;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
function readTextFileWithoutSymlink(root, absolutePath) {
|
|
348
|
+
assertNoSymlinkPathSync(root, absolutePath);
|
|
349
|
+
const fd = fsSync.openSync(absolutePath, noFollowOpenFlags());
|
|
350
|
+
try {
|
|
351
|
+
return {
|
|
352
|
+
content: fsSync.readFileSync(fd, "utf8"),
|
|
353
|
+
stat: fsSync.fstatSync(fd),
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
finally {
|
|
357
|
+
fsSync.closeSync(fd);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
async function fileMetaForPath(root, artifactPath, absolutePath, contentOverride, statOverride) {
|
|
361
|
+
const read = contentOverride === undefined
|
|
362
|
+
? readTextFileWithoutSymlink(root, absolutePath)
|
|
363
|
+
: undefined;
|
|
364
|
+
const content = contentOverride ?? read.content;
|
|
365
|
+
const stat = statOverride ?? read?.stat ?? (await fs.stat(absolutePath));
|
|
315
366
|
const extension = extensionOf(artifactPath);
|
|
316
367
|
return {
|
|
317
368
|
path: artifactPath,
|
|
369
|
+
absolutePath,
|
|
318
370
|
rootName: root.name,
|
|
319
371
|
rootPath: root.path,
|
|
320
372
|
kind: root.kind,
|
|
@@ -399,33 +451,7 @@ async function resolveArtifactPath(app, artifactPath) {
|
|
|
399
451
|
return { root, safePath, absolutePath };
|
|
400
452
|
}
|
|
401
453
|
async function assertNoSymlinkPath(root, absolutePath, options = {}) {
|
|
402
|
-
|
|
403
|
-
const segments = relative.split(path.sep).filter(Boolean);
|
|
404
|
-
let current = root.absolutePath;
|
|
405
|
-
const pathsToCheck = [
|
|
406
|
-
current,
|
|
407
|
-
...segments.map((segment) => {
|
|
408
|
-
current = path.join(current, segment);
|
|
409
|
-
return current;
|
|
410
|
-
}),
|
|
411
|
-
];
|
|
412
|
-
for (let index = 0; index < pathsToCheck.length; index += 1) {
|
|
413
|
-
const candidate = pathsToCheck[index];
|
|
414
|
-
try {
|
|
415
|
-
const stat = await fs.lstat(candidate);
|
|
416
|
-
if (stat.isSymbolicLink()) {
|
|
417
|
-
throw new Error(`Path "${candidate}" must not traverse a symlink`);
|
|
418
|
-
}
|
|
419
|
-
if (index < pathsToCheck.length - 1 && !stat.isDirectory()) {
|
|
420
|
-
throw new Error(`Path "${candidate}" is not a directory`);
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
catch (error) {
|
|
424
|
-
if (errorCode(error) === "ENOENT" && options.allowMissingLeaf)
|
|
425
|
-
return;
|
|
426
|
-
throw error;
|
|
427
|
-
}
|
|
428
|
-
}
|
|
454
|
+
assertNoSymlinkPathSync(root, absolutePath, options);
|
|
429
455
|
}
|
|
430
456
|
export async function readLocalArtifactFile(options) {
|
|
431
457
|
const app = await getLocalArtifactApp(options);
|
|
@@ -433,9 +459,8 @@ export async function readLocalArtifactFile(options) {
|
|
|
433
459
|
return null;
|
|
434
460
|
const { root, safePath, absolutePath } = await resolveArtifactPath(app, options.path);
|
|
435
461
|
try {
|
|
436
|
-
|
|
437
|
-
const
|
|
438
|
-
const meta = await fileMetaForPath(root, safePath, absolutePath, content);
|
|
462
|
+
const { content, stat } = readTextFileWithoutSymlink(root, absolutePath);
|
|
463
|
+
const meta = await fileMetaForPath(root, safePath, absolutePath, content, stat);
|
|
439
464
|
return { ...meta, content };
|
|
440
465
|
}
|
|
441
466
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/local-artifacts/index.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport fsSync from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { minimatch } from \"minimatch\";\n\nexport type AgentNativeDataMode = \"database\" | \"local-files\";\n\nexport interface AgentNativeManifestRoot {\n name?: string;\n path: string;\n kind?: string;\n extensions?: string[];\n include?: string[];\n hide?: string[];\n}\n\nexport interface AgentNativeManifestApp {\n mode?: AgentNativeDataMode;\n roots?: AgentNativeManifestRoot[];\n components?: string | string[];\n hide?: string[];\n}\n\nexport interface AgentNativeManifest {\n version?: number;\n mode?: AgentNativeDataMode;\n apps?: Record<string, AgentNativeManifestApp>;\n}\n\nexport interface LoadedAgentNativeManifest {\n path: string;\n rootDir: string;\n manifest: AgentNativeManifest;\n}\n\nexport interface LocalArtifactAppDefaults {\n mode?: AgentNativeDataMode;\n roots: AgentNativeManifestRoot[];\n hide?: string[];\n components?: string | string[];\n}\n\nexport interface LoadAgentNativeManifestOptions {\n cwd?: string;\n manifestPath?: string;\n optional?: boolean;\n}\n\nexport interface ResolveAgentNativeModeOptions extends LoadAgentNativeManifestOptions {\n appId?: string;\n defaults?: Pick<LocalArtifactAppDefaults, \"mode\">;\n}\n\nexport interface LocalArtifactOptions extends LoadAgentNativeManifestOptions {\n appId: string;\n defaults?: LocalArtifactAppDefaults;\n}\n\nexport interface LoadedLocalArtifactRoot {\n name: string;\n path: string;\n absolutePath: string;\n kind?: string;\n extensions: string[];\n hide: string[];\n include: string[];\n}\n\nexport interface LoadedLocalArtifactApp {\n appId: string;\n mode: AgentNativeDataMode;\n manifestPath: string | null;\n workspaceRoot: string;\n roots: LoadedLocalArtifactRoot[];\n components: string[];\n hide: string[];\n}\n\nexport interface LocalArtifactFileMeta {\n path: string;\n rootName: string;\n rootPath: string;\n kind?: string;\n extension: string;\n contentType: string;\n sizeBytes: number;\n hash: string;\n createdAt: string;\n updatedAt: string;\n mtimeMs: number;\n}\n\nexport interface LocalArtifactFile extends LocalArtifactFileMeta {\n content: string;\n}\n\nexport interface WriteLocalArtifactFileOptions extends LocalArtifactOptions {\n content: string;\n expectedHash?: string | null;\n ifNotExists?: boolean;\n}\n\nconst MANIFEST_FILE = \"agent-native.json\";\nconst ENV_MODE_NAMES = [\"AGENT_NATIVE_MODE\", \"AGENT_NATIVE_DATA_MODE\"];\nconst ENV_MANIFEST_NAMES = [\n \"AGENT_NATIVE_MANIFEST\",\n \"AGENT_NATIVE_MANIFEST_PATH\",\n];\nconst ALLOW_PRODUCTION_LOCAL_FILES_ENV =\n \"AGENT_NATIVE_ALLOW_LOCAL_FILES_IN_PRODUCTION\";\nconst DEFAULT_HIDE_PATTERNS = [\n \"**/.git/**\",\n \"**/.agent-native/**\",\n \"**/.next/**\",\n \"**/.nuxt/**\",\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/build/**\",\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction errorCode(error: unknown): string | undefined {\n return isRecord(error) && typeof error.code === \"string\"\n ? error.code\n : undefined;\n}\n\nfunction asStringArray(value: unknown): string[] {\n if (typeof value === \"string\" && value.trim()) return [value.trim()];\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is string => typeof item === \"string\");\n}\n\nfunction normalizeMode(value: unknown): AgentNativeDataMode | undefined {\n if (value === \"database\" || value === \"local-files\") return value;\n return undefined;\n}\n\nfunction normalizeSlash(filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\");\n}\n\nfunction normalizeRelativePath(filePath: string, label = \"path\"): string {\n if (!filePath || typeof filePath !== \"string\") {\n throw new Error(`${label} is required`);\n }\n if (filePath.includes(\"\\0\")) {\n throw new Error(`${label} must not contain null bytes`);\n }\n if (path.isAbsolute(filePath)) {\n throw new Error(`${label} must be relative`);\n }\n const normalized = normalizeSlash(\n path.posix.normalize(normalizeSlash(filePath)),\n );\n if (\n !normalized ||\n normalized === \".\" ||\n normalized.startsWith(\"../\") ||\n normalized === \"..\" ||\n normalized.split(\"/\").some((part) => !part || part === \".\" || part === \"..\")\n ) {\n throw new Error(`${label} must be a safe relative path`);\n }\n return normalized;\n}\n\nfunction extensionOf(filePath: string): string {\n return path.posix.extname(filePath).toLowerCase();\n}\n\nfunction normalizeExtensions(value: unknown): string[] {\n const extensions = asStringArray(value)\n .map((ext) => ext.trim().toLowerCase())\n .filter(Boolean)\n .map((ext) => (ext.startsWith(\".\") ? ext : `.${ext}`));\n return [...new Set(extensions)];\n}\n\nfunction rootNameFromPath(rootPath: string): string {\n return (\n rootPath\n .split(\"/\")\n .filter(Boolean)\n .at(-1)\n ?.replace(/[-_]+/g, \" \")\n .replace(/\\b\\w/g, (char) => char.toUpperCase()) || rootPath\n );\n}\n\nfunction normalizeManifestRoot(value: unknown): AgentNativeManifestRoot | null {\n if (typeof value === \"string\") return { path: value };\n if (!isRecord(value) || typeof value.path !== \"string\") return null;\n return {\n name: typeof value.name === \"string\" ? value.name : undefined,\n path: value.path,\n kind: typeof value.kind === \"string\" ? value.kind : undefined,\n extensions: normalizeExtensions(value.extensions),\n include: asStringArray(value.include),\n hide: asStringArray(value.hide),\n };\n}\n\nfunction normalizeManifestApp(value: unknown): AgentNativeManifestApp {\n if (Array.isArray(value)) {\n return {\n roots: value\n .map(normalizeManifestRoot)\n .filter((root): root is AgentNativeManifestRoot => !!root),\n };\n }\n if (!isRecord(value)) return {};\n const roots = Array.isArray(value.roots)\n ? value.roots\n .map(normalizeManifestRoot)\n .filter((root): root is AgentNativeManifestRoot => !!root)\n : [];\n return {\n mode: normalizeMode(value.mode),\n roots,\n components:\n typeof value.components === \"string\" || Array.isArray(value.components)\n ? asStringArray(value.components)\n : undefined,\n hide: asStringArray(value.hide),\n };\n}\n\nfunction normalizeManifest(value: unknown): AgentNativeManifest {\n const record = isRecord(value) ? value : {};\n const appsRecord = isRecord(record.apps) ? record.apps : {};\n const apps: Record<string, AgentNativeManifestApp> = {};\n for (const [appId, appValue] of Object.entries(appsRecord)) {\n apps[appId] = normalizeManifestApp(appValue);\n }\n return {\n version:\n typeof record.version === \"number\" && Number.isFinite(record.version)\n ? record.version\n : undefined,\n mode: normalizeMode(record.mode),\n apps,\n };\n}\n\nfunction firstEnvValue(names: string[]): string | undefined {\n for (const name of names) {\n const value = process.env[name]?.trim();\n if (value) return value;\n }\n return undefined;\n}\n\nfunction envMode(): AgentNativeDataMode | undefined {\n return normalizeMode(firstEnvValue(ENV_MODE_NAMES));\n}\n\nfunction envFlag(name: string): boolean {\n const value = process.env[name]?.trim().toLowerCase();\n return value === \"1\" || value === \"true\" || value === \"yes\" || value === \"on\";\n}\n\nfunction assertLocalFilesRuntimeAllowed(mode: AgentNativeDataMode) {\n if (mode !== \"local-files\") return;\n if (process.env.NODE_ENV !== \"production\") return;\n if (envFlag(ALLOW_PRODUCTION_LOCAL_FILES_ENV)) return;\n throw new Error(\n `Local file mode is only enabled for local development runtimes. Set ${ALLOW_PRODUCTION_LOCAL_FILES_ENV}=true only for a trusted single-tenant local file bridge.`,\n );\n}\n\nfunction envManifestPath(): string | undefined {\n return firstEnvValue(ENV_MANIFEST_NAMES);\n}\n\nexport function findAgentNativeManifest(\n startDir = process.cwd(),\n): string | null {\n let current = path.resolve(startDir);\n for (;;) {\n const candidate = path.join(current, MANIFEST_FILE);\n if (fsSync.existsSync(candidate)) return candidate;\n const parent = path.dirname(current);\n if (parent === current) return null;\n current = parent;\n }\n}\n\nexport async function loadAgentNativeManifest(\n options: LoadAgentNativeManifestOptions = {},\n): Promise<LoadedAgentNativeManifest | null> {\n const manifestPath =\n options.manifestPath ??\n envManifestPath() ??\n findAgentNativeManifest(options.cwd ?? process.cwd());\n\n if (!manifestPath) {\n if (options.optional) return null;\n throw new Error(`Could not find ${MANIFEST_FILE}`);\n }\n\n const resolvedPath = path.resolve(options.cwd ?? process.cwd(), manifestPath);\n try {\n const raw = await fs.readFile(resolvedPath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n return {\n path: resolvedPath,\n rootDir: path.dirname(resolvedPath),\n manifest: normalizeManifest(parsed),\n };\n } catch (error) {\n if (options.optional && errorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nexport async function resolveAgentNativeDataMode(\n options: ResolveAgentNativeModeOptions = {},\n): Promise<AgentNativeDataMode> {\n const explicitMode = envMode();\n if (explicitMode) {\n assertLocalFilesRuntimeAllowed(explicitMode);\n return explicitMode;\n }\n\n const loaded = await loadAgentNativeManifest({ ...options, optional: true });\n const appMode = options.appId\n ? loaded?.manifest.apps?.[options.appId]?.mode\n : undefined;\n const mode =\n appMode ?? loaded?.manifest.mode ?? options.defaults?.mode ?? \"database\";\n assertLocalFilesRuntimeAllowed(mode);\n return mode;\n}\n\nexport async function isAgentNativeLocalFileMode(\n options: ResolveAgentNativeModeOptions = {},\n): Promise<boolean> {\n return (await resolveAgentNativeDataMode(options)) === \"local-files\";\n}\n\nfunction mergeAppConfig(\n manifestApp: AgentNativeManifestApp | undefined,\n defaults: LocalArtifactAppDefaults | undefined,\n): AgentNativeManifestApp {\n return {\n mode: manifestApp?.mode ?? defaults?.mode,\n roots:\n manifestApp?.roots && manifestApp.roots.length > 0\n ? manifestApp.roots\n : (defaults?.roots ?? []),\n components: manifestApp?.components ?? defaults?.components,\n hide: [...(defaults?.hide ?? []), ...(manifestApp?.hide ?? [])],\n };\n}\n\nfunction resolveInsideWorkspace(workspaceRoot: string, relativePath: string) {\n const safePath = normalizeRelativePath(relativePath);\n const absolutePath = path.resolve(workspaceRoot, safePath);\n const relative = path.relative(workspaceRoot, absolutePath);\n if (\n relative === \"\" ||\n relative.startsWith(\"..\") ||\n path.isAbsolute(relative)\n ) {\n throw new Error(`Path \"${relativePath}\" is outside the workspace`);\n }\n return { safePath, absolutePath };\n}\n\nexport async function getLocalArtifactApp(\n options: LocalArtifactOptions,\n): Promise<LoadedLocalArtifactApp> {\n const loaded = await loadAgentNativeManifest({ ...options, optional: true });\n const workspaceRoot =\n loaded?.rootDir ?? path.resolve(options.cwd ?? process.cwd());\n const manifestApp = loaded?.manifest.apps?.[options.appId];\n const app = mergeAppConfig(manifestApp, options.defaults);\n const mode = await resolveAgentNativeDataMode({\n ...options,\n appId: options.appId,\n defaults: app,\n });\n\n const roots = (app.roots ?? []).map((root) => {\n const { safePath, absolutePath } = resolveInsideWorkspace(\n workspaceRoot,\n root.path,\n );\n const extensions = normalizeExtensions(root.extensions);\n return {\n name: root.name || rootNameFromPath(safePath),\n path: safePath,\n absolutePath,\n kind: root.kind,\n extensions,\n hide: [...DEFAULT_HIDE_PATTERNS, ...asStringArray(root.hide)],\n include: asStringArray(root.include),\n };\n });\n\n return {\n appId: options.appId,\n mode,\n manifestPath: loaded?.path ?? null,\n workspaceRoot,\n roots,\n components: asStringArray(app.components),\n hide: [...DEFAULT_HIDE_PATTERNS, ...asStringArray(app.hide)],\n };\n}\n\nfunction matchesPatterns(filePath: string, patterns: string[]) {\n return patterns.some((pattern) =>\n minimatch(filePath, pattern, { dot: true, nocase: true }),\n );\n}\n\nfunction contentTypeForExtension(extension: string): string {\n if (extension === \".md\") return \"text/markdown\";\n if (extension === \".mdx\") return \"text/mdx\";\n if (extension === \".json\") return \"application/json\";\n if (extension === \".txt\") return \"text/plain\";\n return \"application/octet-stream\";\n}\n\nfunction hashContent(content: string): string {\n return crypto.createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nconst writeLocks = new Map<string, Promise<void>>();\n\nasync function withWriteLock<T>(\n absolutePath: string,\n fn: () => Promise<T>,\n): Promise<T> {\n const previous = writeLocks.get(absolutePath) ?? Promise.resolve();\n let release!: () => void;\n const next = new Promise<void>((resolve) => {\n release = resolve;\n });\n const current = previous.catch(() => {}).then(() => next);\n writeLocks.set(absolutePath, current);\n await previous.catch(() => {});\n try {\n return await fn();\n } finally {\n release();\n if (writeLocks.get(absolutePath) === current) {\n writeLocks.delete(absolutePath);\n }\n }\n}\n\nasync function fileMetaForPath(\n root: LoadedLocalArtifactRoot,\n artifactPath: string,\n absolutePath: string,\n contentOverride?: string,\n): Promise<LocalArtifactFileMeta> {\n const content =\n contentOverride === undefined\n ? await fs.readFile(absolutePath, \"utf8\")\n : contentOverride;\n const stat = await fs.stat(absolutePath);\n const extension = extensionOf(artifactPath);\n return {\n path: artifactPath,\n rootName: root.name,\n rootPath: root.path,\n kind: root.kind,\n extension,\n contentType: contentTypeForExtension(extension),\n sizeBytes: Buffer.byteLength(content, \"utf8\"),\n hash: hashContent(content),\n createdAt: stat.birthtime.toISOString(),\n updatedAt: stat.mtime.toISOString(),\n mtimeMs: stat.mtimeMs,\n };\n}\n\nfunction rootAllowsPath(root: LoadedLocalArtifactRoot, artifactPath: string) {\n const extension = extensionOf(artifactPath);\n if (root.extensions.length > 0 && !root.extensions.includes(extension)) {\n return false;\n }\n if (matchesPatterns(artifactPath, root.hide)) return false;\n if (root.include.length === 0) return true;\n return matchesPatterns(artifactPath, root.include);\n}\n\nasync function walkRoot(\n root: LoadedLocalArtifactRoot,\n directory = root.absolutePath,\n): Promise<LocalArtifactFileMeta[]> {\n let entries: fsSync.Dirent[];\n try {\n entries = await fs.readdir(directory, { withFileTypes: true });\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n\n const files: LocalArtifactFileMeta[] = [];\n for (const entry of entries) {\n const absolutePath = path.join(directory, entry.name);\n const relativeToRoot = normalizeSlash(\n path.relative(root.absolutePath, absolutePath),\n );\n const artifactPath = normalizeSlash(\n path.posix.join(root.path, relativeToRoot),\n );\n if (matchesPatterns(artifactPath, root.hide)) continue;\n\n if (entry.isDirectory()) {\n files.push(...(await walkRoot(root, absolutePath)));\n continue;\n }\n if (!entry.isFile() || !rootAllowsPath(root, artifactPath)) continue;\n files.push(await fileMetaForPath(root, artifactPath, absolutePath));\n }\n return files;\n}\n\nexport async function listLocalArtifactFiles(\n options: LocalArtifactOptions,\n): Promise<LocalArtifactFileMeta[]> {\n const app = await getLocalArtifactApp(options);\n if (app.mode !== \"local-files\") return [];\n\n const files = (await Promise.all(app.roots.map((root) => walkRoot(root))))\n .flat()\n .filter((file) => !matchesPatterns(file.path, app.hide));\n\n return files.sort((a, b) => a.path.localeCompare(b.path));\n}\n\nfunction rootForArtifactPath(\n app: LoadedLocalArtifactApp,\n artifactPath: string,\n): LoadedLocalArtifactRoot {\n const safePath = normalizeRelativePath(artifactPath);\n const root = app.roots.find(\n (candidate) =>\n safePath === candidate.path || safePath.startsWith(`${candidate.path}/`),\n );\n if (!root) {\n throw new Error(`Path \"${artifactPath}\" is not in a configured local root`);\n }\n if (!rootAllowsPath(root, safePath) || matchesPatterns(safePath, app.hide)) {\n throw new Error(`Path \"${artifactPath}\" is not allowed for this app`);\n }\n return root;\n}\n\nasync function resolveArtifactPath(\n app: LoadedLocalArtifactApp,\n artifactPath: string,\n): Promise<{\n root: LoadedLocalArtifactRoot;\n safePath: string;\n absolutePath: string;\n}> {\n const safePath = normalizeRelativePath(artifactPath);\n const root = rootForArtifactPath(app, safePath);\n const absolutePath = path.resolve(app.workspaceRoot, safePath);\n const relative = path.relative(root.absolutePath, absolutePath);\n if (\n relative.startsWith(\"..\") ||\n path.isAbsolute(relative) ||\n relative === \"\"\n ) {\n throw new Error(`Path \"${artifactPath}\" is outside its configured root`);\n }\n return { root, safePath, absolutePath };\n}\n\nasync function assertNoSymlinkPath(\n root: LoadedLocalArtifactRoot,\n absolutePath: string,\n options: { allowMissingLeaf?: boolean } = {},\n) {\n const relative = path.relative(root.absolutePath, absolutePath);\n const segments = relative.split(path.sep).filter(Boolean);\n let current = root.absolutePath;\n const pathsToCheck = [\n current,\n ...segments.map((segment) => {\n current = path.join(current, segment);\n return current;\n }),\n ];\n\n for (let index = 0; index < pathsToCheck.length; index += 1) {\n const candidate = pathsToCheck[index]!;\n try {\n const stat = await fs.lstat(candidate);\n if (stat.isSymbolicLink()) {\n throw new Error(`Path \"${candidate}\" must not traverse a symlink`);\n }\n if (index < pathsToCheck.length - 1 && !stat.isDirectory()) {\n throw new Error(`Path \"${candidate}\" is not a directory`);\n }\n } catch (error) {\n if (errorCode(error) === \"ENOENT\" && options.allowMissingLeaf) return;\n throw error;\n }\n }\n}\n\nexport async function readLocalArtifactFile(\n options: LocalArtifactOptions & { path: string },\n): Promise<LocalArtifactFile | null> {\n const app = await getLocalArtifactApp(options);\n if (app.mode !== \"local-files\") return null;\n const { root, safePath, absolutePath } = await resolveArtifactPath(\n app,\n options.path,\n );\n try {\n await assertNoSymlinkPath(root, absolutePath);\n const content = await fs.readFile(absolutePath, \"utf8\");\n const meta = await fileMetaForPath(root, safePath, absolutePath, content);\n return { ...meta, content };\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nexport async function writeLocalArtifactFile(\n options: WriteLocalArtifactFileOptions & { path: string },\n): Promise<LocalArtifactFileMeta> {\n const app = await getLocalArtifactApp(options);\n if (app.mode !== \"local-files\") {\n throw new Error(\"Local file mode is not enabled\");\n }\n const { root, safePath, absolutePath } = await resolveArtifactPath(\n app,\n options.path,\n );\n return withWriteLock(absolutePath, async () => {\n const existing = await readLocalArtifactFile({\n ...options,\n path: safePath,\n });\n if (options.ifNotExists && existing) {\n throw new Error(`File \"${safePath}\" already exists`);\n }\n if (\n options.expectedHash &&\n (!existing || existing.hash !== options.expectedHash)\n ) {\n throw new Error(\n `File \"${safePath}\" changed on disk. Reload before saving again.`,\n );\n }\n\n await assertNoSymlinkPath(root, absolutePath, { allowMissingLeaf: true });\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n const tempPath = path.join(\n path.dirname(absolutePath),\n `.${path.basename(absolutePath)}.${process.pid}.${crypto.randomUUID()}.tmp`,\n );\n await fs.writeFile(tempPath, options.content, \"utf8\");\n await fs.rename(tempPath, absolutePath);\n return fileMetaForPath(root, safePath, absolutePath, options.content);\n });\n}\n\nexport async function deleteLocalArtifactFile(\n options: LocalArtifactOptions & { path: string },\n): Promise<boolean> {\n const app = await getLocalArtifactApp(options);\n if (app.mode !== \"local-files\") {\n throw new Error(\"Local file mode is not enabled\");\n }\n const { root, absolutePath } = await resolveArtifactPath(app, options.path);\n try {\n await assertNoSymlinkPath(root, absolutePath);\n await fs.unlink(absolutePath);\n return true;\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nexport async function ensureLocalArtifactRoot(\n options: LocalArtifactOptions,\n): Promise<LoadedLocalArtifactRoot> {\n const app = await getLocalArtifactApp(options);\n if (app.mode !== \"local-files\") {\n throw new Error(\"Local file mode is not enabled\");\n }\n const root = app.roots[0];\n if (!root) {\n throw new Error(`No local roots configured for app \"${options.appId}\"`);\n }\n await fs.mkdir(root.absolutePath, { recursive: true });\n return root;\n}\n\nexport function createTempWorkspaceDir(prefix = \"agent-native-local-\"): string {\n return fsSync.mkdtempSync(path.join(os.tmpdir(), prefix));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/local-artifacts/index.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport fsSync from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { minimatch } from \"minimatch\";\n\nexport type AgentNativeDataMode = \"database\" | \"local-files\";\n\nexport interface AgentNativeManifestRoot {\n name?: string;\n path: string;\n kind?: string;\n extensions?: string[];\n include?: string[];\n hide?: string[];\n}\n\nexport interface AgentNativeManifestApp {\n mode?: AgentNativeDataMode;\n roots?: AgentNativeManifestRoot[];\n components?: string | string[];\n extensions?: string | string[];\n hide?: string[];\n}\n\nexport interface AgentNativeManifest {\n version?: number;\n mode?: AgentNativeDataMode;\n apps?: Record<string, AgentNativeManifestApp>;\n}\n\nexport interface LoadedAgentNativeManifest {\n path: string;\n rootDir: string;\n manifest: AgentNativeManifest;\n}\n\nexport interface LocalArtifactAppDefaults {\n mode?: AgentNativeDataMode;\n roots: AgentNativeManifestRoot[];\n hide?: string[];\n components?: string | string[];\n extensions?: string | string[];\n}\n\nexport interface LoadAgentNativeManifestOptions {\n cwd?: string;\n manifestPath?: string;\n optional?: boolean;\n}\n\nexport interface ResolveAgentNativeModeOptions extends LoadAgentNativeManifestOptions {\n appId?: string;\n defaults?: Pick<LocalArtifactAppDefaults, \"mode\">;\n}\n\nexport interface LocalArtifactOptions extends LoadAgentNativeManifestOptions {\n appId: string;\n defaults?: LocalArtifactAppDefaults;\n}\n\nexport interface LoadedLocalArtifactRoot {\n name: string;\n path: string;\n absolutePath: string;\n kind?: string;\n extensions: string[];\n hide: string[];\n include: string[];\n}\n\nexport interface LoadedLocalArtifactApp {\n appId: string;\n mode: AgentNativeDataMode;\n manifestPath: string | null;\n workspaceRoot: string;\n roots: LoadedLocalArtifactRoot[];\n components: string[];\n extensions: string[];\n hide: string[];\n}\n\nexport interface LocalArtifactFileMeta {\n path: string;\n absolutePath: string;\n rootName: string;\n rootPath: string;\n kind?: string;\n extension: string;\n contentType: string;\n sizeBytes: number;\n hash: string;\n createdAt: string;\n updatedAt: string;\n mtimeMs: number;\n}\n\nexport interface LocalArtifactFile extends LocalArtifactFileMeta {\n content: string;\n}\n\nexport interface WriteLocalArtifactFileOptions extends LocalArtifactOptions {\n content: string;\n expectedHash?: string | null;\n ifNotExists?: boolean;\n}\n\nconst MANIFEST_FILE = \"agent-native.json\";\nconst ENV_MODE_NAMES = [\"AGENT_NATIVE_MODE\", \"AGENT_NATIVE_DATA_MODE\"];\nconst ENV_MANIFEST_NAMES = [\n \"AGENT_NATIVE_MANIFEST\",\n \"AGENT_NATIVE_MANIFEST_PATH\",\n];\nconst ALLOW_PRODUCTION_LOCAL_FILES_ENV =\n \"AGENT_NATIVE_ALLOW_LOCAL_FILES_IN_PRODUCTION\";\nconst DEFAULT_HIDE_PATTERNS = [\n \"**/.git/**\",\n \"**/.agent-native/**\",\n \"**/.next/**\",\n \"**/.nuxt/**\",\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/build/**\",\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction errorCode(error: unknown): string | undefined {\n return isRecord(error) && typeof error.code === \"string\"\n ? error.code\n : undefined;\n}\n\nfunction asStringArray(value: unknown): string[] {\n if (typeof value === \"string\" && value.trim()) return [value.trim()];\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is string => typeof item === \"string\");\n}\n\nfunction normalizeMode(value: unknown): AgentNativeDataMode | undefined {\n if (value === \"database\" || value === \"local-files\") return value;\n return undefined;\n}\n\nfunction normalizeSlash(filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\");\n}\n\nfunction normalizeRelativePath(filePath: string, label = \"path\"): string {\n if (!filePath || typeof filePath !== \"string\") {\n throw new Error(`${label} is required`);\n }\n if (filePath.includes(\"\\0\")) {\n throw new Error(`${label} must not contain null bytes`);\n }\n if (path.isAbsolute(filePath)) {\n throw new Error(`${label} must be relative`);\n }\n const normalized = normalizeSlash(\n path.posix.normalize(normalizeSlash(filePath)),\n );\n if (\n !normalized ||\n normalized === \".\" ||\n normalized.startsWith(\"../\") ||\n normalized === \"..\" ||\n normalized.split(\"/\").some((part) => !part || part === \".\" || part === \"..\")\n ) {\n throw new Error(`${label} must be a safe relative path`);\n }\n return normalized;\n}\n\nfunction extensionOf(filePath: string): string {\n return path.posix.extname(filePath).toLowerCase();\n}\n\nfunction normalizeExtensions(value: unknown): string[] {\n const extensions = asStringArray(value)\n .map((ext) => ext.trim().toLowerCase())\n .filter(Boolean)\n .map((ext) => (ext.startsWith(\".\") ? ext : `.${ext}`));\n return [...new Set(extensions)];\n}\n\nfunction rootNameFromPath(rootPath: string): string {\n return (\n rootPath\n .split(\"/\")\n .filter(Boolean)\n .at(-1)\n ?.replace(/[-_]+/g, \" \")\n .replace(/\\b\\w/g, (char) => char.toUpperCase()) || rootPath\n );\n}\n\nfunction normalizeManifestRoot(value: unknown): AgentNativeManifestRoot | null {\n if (typeof value === \"string\") return { path: value };\n if (!isRecord(value) || typeof value.path !== \"string\") return null;\n return {\n name: typeof value.name === \"string\" ? value.name : undefined,\n path: value.path,\n kind: typeof value.kind === \"string\" ? value.kind : undefined,\n extensions: normalizeExtensions(value.extensions),\n include: asStringArray(value.include),\n hide: asStringArray(value.hide),\n };\n}\n\nfunction normalizeManifestApp(value: unknown): AgentNativeManifestApp {\n if (Array.isArray(value)) {\n return {\n roots: value\n .map(normalizeManifestRoot)\n .filter((root): root is AgentNativeManifestRoot => !!root),\n };\n }\n if (!isRecord(value)) return {};\n const roots = Array.isArray(value.roots)\n ? value.roots\n .map(normalizeManifestRoot)\n .filter((root): root is AgentNativeManifestRoot => !!root)\n : [];\n return {\n mode: normalizeMode(value.mode),\n roots,\n components:\n typeof value.components === \"string\" || Array.isArray(value.components)\n ? asStringArray(value.components)\n : undefined,\n extensions:\n typeof value.extensions === \"string\" || Array.isArray(value.extensions)\n ? asStringArray(value.extensions)\n : undefined,\n hide: asStringArray(value.hide),\n };\n}\n\nfunction normalizeManifest(value: unknown): AgentNativeManifest {\n const record = isRecord(value) ? value : {};\n const appsRecord = isRecord(record.apps) ? record.apps : {};\n const apps: Record<string, AgentNativeManifestApp> = {};\n for (const [appId, appValue] of Object.entries(appsRecord)) {\n apps[appId] = normalizeManifestApp(appValue);\n }\n return {\n version:\n typeof record.version === \"number\" && Number.isFinite(record.version)\n ? record.version\n : undefined,\n mode: normalizeMode(record.mode),\n apps,\n };\n}\n\nfunction firstEnvValue(names: string[]): string | undefined {\n for (const name of names) {\n const value = process.env[name]?.trim();\n if (value) return value;\n }\n return undefined;\n}\n\nfunction envMode(): AgentNativeDataMode | undefined {\n return normalizeMode(firstEnvValue(ENV_MODE_NAMES));\n}\n\nfunction envFlag(name: string): boolean {\n const value = process.env[name]?.trim().toLowerCase();\n return value === \"1\" || value === \"true\" || value === \"yes\" || value === \"on\";\n}\n\nfunction assertLocalFilesRuntimeAllowed(mode: AgentNativeDataMode) {\n if (mode !== \"local-files\") return;\n if (process.env.NODE_ENV !== \"production\") return;\n if (envFlag(ALLOW_PRODUCTION_LOCAL_FILES_ENV)) return;\n throw new Error(\n `Local file mode is only enabled for local development runtimes. Set ${ALLOW_PRODUCTION_LOCAL_FILES_ENV}=true only for a trusted single-tenant local file bridge.`,\n );\n}\n\nfunction envManifestPath(): string | undefined {\n return firstEnvValue(ENV_MANIFEST_NAMES);\n}\n\nexport function findAgentNativeManifest(\n startDir = process.cwd(),\n): string | null {\n let current = path.resolve(startDir);\n for (;;) {\n const candidate = path.join(current, MANIFEST_FILE);\n if (fsSync.existsSync(candidate)) return candidate;\n const parent = path.dirname(current);\n if (parent === current) return null;\n current = parent;\n }\n}\n\nexport async function loadAgentNativeManifest(\n options: LoadAgentNativeManifestOptions = {},\n): Promise<LoadedAgentNativeManifest | null> {\n const manifestPath =\n options.manifestPath ??\n envManifestPath() ??\n findAgentNativeManifest(options.cwd ?? process.cwd());\n\n if (!manifestPath) {\n if (options.optional) return null;\n throw new Error(`Could not find ${MANIFEST_FILE}`);\n }\n\n const resolvedPath = path.resolve(options.cwd ?? process.cwd(), manifestPath);\n try {\n const raw = await fs.readFile(resolvedPath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n return {\n path: resolvedPath,\n rootDir: path.dirname(resolvedPath),\n manifest: normalizeManifest(parsed),\n };\n } catch (error) {\n if (options.optional && errorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nexport async function resolveAgentNativeDataMode(\n options: ResolveAgentNativeModeOptions = {},\n): Promise<AgentNativeDataMode> {\n const explicitMode = envMode();\n if (explicitMode) {\n assertLocalFilesRuntimeAllowed(explicitMode);\n return explicitMode;\n }\n\n const loaded = await loadAgentNativeManifest({ ...options, optional: true });\n const appMode = options.appId\n ? loaded?.manifest.apps?.[options.appId]?.mode\n : undefined;\n const mode =\n appMode ?? loaded?.manifest.mode ?? options.defaults?.mode ?? \"database\";\n assertLocalFilesRuntimeAllowed(mode);\n return mode;\n}\n\nexport async function isAgentNativeLocalFileMode(\n options: ResolveAgentNativeModeOptions = {},\n): Promise<boolean> {\n return (await resolveAgentNativeDataMode(options)) === \"local-files\";\n}\n\nfunction mergeAppConfig(\n manifestApp: AgentNativeManifestApp | undefined,\n defaults: LocalArtifactAppDefaults | undefined,\n): AgentNativeManifestApp {\n return {\n mode: manifestApp?.mode ?? defaults?.mode,\n roots:\n manifestApp?.roots && manifestApp.roots.length > 0\n ? manifestApp.roots\n : (defaults?.roots ?? []),\n components: manifestApp?.components ?? defaults?.components,\n extensions: manifestApp?.extensions ?? defaults?.extensions,\n hide: [...(defaults?.hide ?? []), ...(manifestApp?.hide ?? [])],\n };\n}\n\nfunction resolveInsideWorkspace(workspaceRoot: string, relativePath: string) {\n const safePath = normalizeRelativePath(relativePath);\n const absolutePath = path.resolve(workspaceRoot, safePath);\n const relative = path.relative(workspaceRoot, absolutePath);\n if (\n relative === \"\" ||\n relative.startsWith(\"..\") ||\n path.isAbsolute(relative)\n ) {\n throw new Error(`Path \"${relativePath}\" is outside the workspace`);\n }\n return { safePath, absolutePath };\n}\n\nexport async function getLocalArtifactApp(\n options: LocalArtifactOptions,\n): Promise<LoadedLocalArtifactApp> {\n const loaded = await loadAgentNativeManifest({ ...options, optional: true });\n const workspaceRoot =\n loaded?.rootDir ?? path.resolve(options.cwd ?? process.cwd());\n const manifestApp = loaded?.manifest.apps?.[options.appId];\n const app = mergeAppConfig(manifestApp, options.defaults);\n const mode = await resolveAgentNativeDataMode({\n ...options,\n appId: options.appId,\n defaults: app,\n });\n\n const roots = (app.roots ?? []).map((root) => {\n const { safePath, absolutePath } = resolveInsideWorkspace(\n workspaceRoot,\n root.path,\n );\n const extensions = normalizeExtensions(root.extensions);\n return {\n name: root.name || rootNameFromPath(safePath),\n path: safePath,\n absolutePath,\n kind: root.kind,\n extensions,\n hide: [...DEFAULT_HIDE_PATTERNS, ...asStringArray(root.hide)],\n include: asStringArray(root.include),\n };\n });\n\n return {\n appId: options.appId,\n mode,\n manifestPath: loaded?.path ?? null,\n workspaceRoot,\n roots,\n components: asStringArray(app.components),\n extensions: asStringArray(app.extensions),\n hide: [...DEFAULT_HIDE_PATTERNS, ...asStringArray(app.hide)],\n };\n}\n\nfunction matchesPatterns(filePath: string, patterns: string[]) {\n return patterns.some((pattern) =>\n minimatch(filePath, pattern, { dot: true, nocase: true }),\n );\n}\n\nfunction contentTypeForExtension(extension: string): string {\n if (extension === \".md\") return \"text/markdown\";\n if (extension === \".mdx\") return \"text/mdx\";\n if (extension === \".json\") return \"application/json\";\n if (extension === \".txt\") return \"text/plain\";\n return \"application/octet-stream\";\n}\n\nfunction hashContent(content: string): string {\n return crypto.createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nconst writeLocks = new Map<string, Promise<void>>();\n\nfunction noFollowOpenFlags(): number {\n return fsSync.constants.O_RDONLY | (fsSync.constants.O_NOFOLLOW ?? 0);\n}\n\nasync function withWriteLock<T>(\n absolutePath: string,\n fn: () => Promise<T>,\n): Promise<T> {\n const previous = writeLocks.get(absolutePath) ?? Promise.resolve();\n let release!: () => void;\n const next = new Promise<void>((resolve) => {\n release = resolve;\n });\n const current = previous.catch(() => {}).then(() => next);\n writeLocks.set(absolutePath, current);\n await previous.catch(() => {});\n try {\n return await fn();\n } finally {\n release();\n if (writeLocks.get(absolutePath) === current) {\n writeLocks.delete(absolutePath);\n }\n }\n}\n\nfunction assertNoSymlinkPathSync(\n root: LoadedLocalArtifactRoot,\n absolutePath: string,\n options: { allowMissingLeaf?: boolean } = {},\n) {\n const relative = path.relative(root.absolutePath, absolutePath);\n const segments = relative.split(path.sep).filter(Boolean);\n let current = root.absolutePath;\n const pathsToCheck = [\n current,\n ...segments.map((segment) => {\n current = path.join(current, segment);\n return current;\n }),\n ];\n\n for (let index = 0; index < pathsToCheck.length; index += 1) {\n const candidate = pathsToCheck[index]!;\n try {\n const stat = fsSync.lstatSync(candidate);\n if (stat.isSymbolicLink()) {\n throw new Error(`Path \"${candidate}\" must not traverse a symlink`);\n }\n if (index < pathsToCheck.length - 1 && !stat.isDirectory()) {\n throw new Error(`Path \"${candidate}\" is not a directory`);\n }\n } catch (error) {\n if (errorCode(error) === \"ENOENT\" && options.allowMissingLeaf) return;\n throw error;\n }\n }\n}\n\nfunction readTextFileWithoutSymlink(\n root: LoadedLocalArtifactRoot,\n absolutePath: string,\n): { content: string; stat: fsSync.Stats } {\n assertNoSymlinkPathSync(root, absolutePath);\n const fd = fsSync.openSync(absolutePath, noFollowOpenFlags());\n try {\n return {\n content: fsSync.readFileSync(fd, \"utf8\"),\n stat: fsSync.fstatSync(fd),\n };\n } finally {\n fsSync.closeSync(fd);\n }\n}\n\nasync function fileMetaForPath(\n root: LoadedLocalArtifactRoot,\n artifactPath: string,\n absolutePath: string,\n contentOverride?: string,\n statOverride?: fsSync.Stats,\n): Promise<LocalArtifactFileMeta> {\n const read =\n contentOverride === undefined\n ? readTextFileWithoutSymlink(root, absolutePath)\n : undefined;\n const content = contentOverride ?? read!.content;\n const stat = statOverride ?? read?.stat ?? (await fs.stat(absolutePath));\n const extension = extensionOf(artifactPath);\n return {\n path: artifactPath,\n absolutePath,\n rootName: root.name,\n rootPath: root.path,\n kind: root.kind,\n extension,\n contentType: contentTypeForExtension(extension),\n sizeBytes: Buffer.byteLength(content, \"utf8\"),\n hash: hashContent(content),\n createdAt: stat.birthtime.toISOString(),\n updatedAt: stat.mtime.toISOString(),\n mtimeMs: stat.mtimeMs,\n };\n}\n\nfunction rootAllowsPath(root: LoadedLocalArtifactRoot, artifactPath: string) {\n const extension = extensionOf(artifactPath);\n if (root.extensions.length > 0 && !root.extensions.includes(extension)) {\n return false;\n }\n if (matchesPatterns(artifactPath, root.hide)) return false;\n if (root.include.length === 0) return true;\n return matchesPatterns(artifactPath, root.include);\n}\n\nasync function walkRoot(\n root: LoadedLocalArtifactRoot,\n directory = root.absolutePath,\n): Promise<LocalArtifactFileMeta[]> {\n let entries: fsSync.Dirent[];\n try {\n entries = await fs.readdir(directory, { withFileTypes: true });\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n\n const files: LocalArtifactFileMeta[] = [];\n for (const entry of entries) {\n const absolutePath = path.join(directory, entry.name);\n const relativeToRoot = normalizeSlash(\n path.relative(root.absolutePath, absolutePath),\n );\n const artifactPath = normalizeSlash(\n path.posix.join(root.path, relativeToRoot),\n );\n if (matchesPatterns(artifactPath, root.hide)) continue;\n\n if (entry.isDirectory()) {\n files.push(...(await walkRoot(root, absolutePath)));\n continue;\n }\n if (!entry.isFile() || !rootAllowsPath(root, artifactPath)) continue;\n files.push(await fileMetaForPath(root, artifactPath, absolutePath));\n }\n return files;\n}\n\nexport async function listLocalArtifactFiles(\n options: LocalArtifactOptions,\n): Promise<LocalArtifactFileMeta[]> {\n const app = await getLocalArtifactApp(options);\n if (app.mode !== \"local-files\") return [];\n\n const files = (await Promise.all(app.roots.map((root) => walkRoot(root))))\n .flat()\n .filter((file) => !matchesPatterns(file.path, app.hide));\n\n return files.sort((a, b) => a.path.localeCompare(b.path));\n}\n\nfunction rootForArtifactPath(\n app: LoadedLocalArtifactApp,\n artifactPath: string,\n): LoadedLocalArtifactRoot {\n const safePath = normalizeRelativePath(artifactPath);\n const root = app.roots.find(\n (candidate) =>\n safePath === candidate.path || safePath.startsWith(`${candidate.path}/`),\n );\n if (!root) {\n throw new Error(`Path \"${artifactPath}\" is not in a configured local root`);\n }\n if (!rootAllowsPath(root, safePath) || matchesPatterns(safePath, app.hide)) {\n throw new Error(`Path \"${artifactPath}\" is not allowed for this app`);\n }\n return root;\n}\n\nasync function resolveArtifactPath(\n app: LoadedLocalArtifactApp,\n artifactPath: string,\n): Promise<{\n root: LoadedLocalArtifactRoot;\n safePath: string;\n absolutePath: string;\n}> {\n const safePath = normalizeRelativePath(artifactPath);\n const root = rootForArtifactPath(app, safePath);\n const absolutePath = path.resolve(app.workspaceRoot, safePath);\n const relative = path.relative(root.absolutePath, absolutePath);\n if (\n relative.startsWith(\"..\") ||\n path.isAbsolute(relative) ||\n relative === \"\"\n ) {\n throw new Error(`Path \"${artifactPath}\" is outside its configured root`);\n }\n return { root, safePath, absolutePath };\n}\n\nasync function assertNoSymlinkPath(\n root: LoadedLocalArtifactRoot,\n absolutePath: string,\n options: { allowMissingLeaf?: boolean } = {},\n) {\n assertNoSymlinkPathSync(root, absolutePath, options);\n}\n\nexport async function readLocalArtifactFile(\n options: LocalArtifactOptions & { path: string },\n): Promise<LocalArtifactFile | null> {\n const app = await getLocalArtifactApp(options);\n if (app.mode !== \"local-files\") return null;\n const { root, safePath, absolutePath } = await resolveArtifactPath(\n app,\n options.path,\n );\n try {\n const { content, stat } = readTextFileWithoutSymlink(root, absolutePath);\n const meta = await fileMetaForPath(\n root,\n safePath,\n absolutePath,\n content,\n stat,\n );\n return { ...meta, content };\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nexport async function writeLocalArtifactFile(\n options: WriteLocalArtifactFileOptions & { path: string },\n): Promise<LocalArtifactFileMeta> {\n const app = await getLocalArtifactApp(options);\n if (app.mode !== \"local-files\") {\n throw new Error(\"Local file mode is not enabled\");\n }\n const { root, safePath, absolutePath } = await resolveArtifactPath(\n app,\n options.path,\n );\n return withWriteLock(absolutePath, async () => {\n const existing = await readLocalArtifactFile({\n ...options,\n path: safePath,\n });\n if (options.ifNotExists && existing) {\n throw new Error(`File \"${safePath}\" already exists`);\n }\n if (\n options.expectedHash &&\n (!existing || existing.hash !== options.expectedHash)\n ) {\n throw new Error(\n `File \"${safePath}\" changed on disk. Reload before saving again.`,\n );\n }\n\n await assertNoSymlinkPath(root, absolutePath, { allowMissingLeaf: true });\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n const tempPath = path.join(\n path.dirname(absolutePath),\n `.${path.basename(absolutePath)}.${process.pid}.${crypto.randomUUID()}.tmp`,\n );\n await fs.writeFile(tempPath, options.content, \"utf8\");\n await fs.rename(tempPath, absolutePath);\n return fileMetaForPath(root, safePath, absolutePath, options.content);\n });\n}\n\nexport async function deleteLocalArtifactFile(\n options: LocalArtifactOptions & { path: string },\n): Promise<boolean> {\n const app = await getLocalArtifactApp(options);\n if (app.mode !== \"local-files\") {\n throw new Error(\"Local file mode is not enabled\");\n }\n const { root, absolutePath } = await resolveArtifactPath(app, options.path);\n try {\n await assertNoSymlinkPath(root, absolutePath);\n await fs.unlink(absolutePath);\n return true;\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nexport async function ensureLocalArtifactRoot(\n options: LocalArtifactOptions,\n): Promise<LoadedLocalArtifactRoot> {\n const app = await getLocalArtifactApp(options);\n if (app.mode !== \"local-files\") {\n throw new Error(\"Local file mode is not enabled\");\n }\n const root = app.roots[0];\n if (!root) {\n throw new Error(`No local roots configured for app \"${options.appId}\"`);\n }\n await fs.mkdir(root.absolutePath, { recursive: true });\n return root;\n}\n\nexport function createTempWorkspaceDir(prefix = \"agent-native-local-\"): string {\n return fsSync.mkdtempSync(path.join(os.tmpdir(), prefix));\n}\n"]}
|
|
@@ -17,6 +17,13 @@ Three things make extensions work:
|
|
|
17
17
|
- **Full access to the template's data.** Extensions can call the same actions the agent calls — `list-emails` in Mail, `list-decks` in Slides, `list-recordings` in Clips — so they have everything the host app has.
|
|
18
18
|
- **Built-in storage.** Each extension has its own per-user / per-org key-value store, so it can save state without you adding a new SQL table.
|
|
19
19
|
|
|
20
|
+
Extensions can also be **repo-backed in Local File Mode**. In that workflow,
|
|
21
|
+
`agent-native.json` declares an `extensions` folder, each extension has an
|
|
22
|
+
`extension.json` manifest plus an HTML entry file, and the app renders those
|
|
23
|
+
files through the same sandbox. File-backed extensions are edited by changing
|
|
24
|
+
the repo files; database-backed extensions keep the runtime create/edit/share
|
|
25
|
+
experience described below.
|
|
26
|
+
|
|
20
27
|
## A quick gallery {#gallery}
|
|
21
28
|
|
|
22
29
|
Real extensions people would actually build, grouped by the template they live in. Each one is one focused thing — not a Swiss-army knife.
|
|
@@ -217,6 +224,64 @@ In practice you don't run those three commands by hand. Just say "pin this widge
|
|
|
217
224
|
|
|
218
225
|
For deeper detail on slots — how to declare them in your template, how the context contract works, how installs are scoped — see the `extension-points` skill. Skills ship inside every scaffolded template under `.agents/skills/`; see [Skills Guide](/docs/skills-guide) for how they work.
|
|
219
226
|
|
|
227
|
+
## Local File Extensions {#local-file-extensions}
|
|
228
|
+
|
|
229
|
+
Local File Mode lets a workspace keep extensions in the repo:
|
|
230
|
+
|
|
231
|
+
```txt
|
|
232
|
+
extensions/
|
|
233
|
+
doc-status/
|
|
234
|
+
extension.json
|
|
235
|
+
index.html
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
```json
|
|
239
|
+
{
|
|
240
|
+
"id": "doc-status",
|
|
241
|
+
"name": "Doc Status",
|
|
242
|
+
"description": "Shows metadata for the selected Content file.",
|
|
243
|
+
"entry": "index.html",
|
|
244
|
+
"slots": ["content.sidebar.bottom"],
|
|
245
|
+
"permissions": {
|
|
246
|
+
"appActions": ["list-documents"],
|
|
247
|
+
"extensionData": true
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Add the folder to the relevant app in `agent-native.json`:
|
|
253
|
+
|
|
254
|
+
```json
|
|
255
|
+
{
|
|
256
|
+
"apps": {
|
|
257
|
+
"content": {
|
|
258
|
+
"mode": "local-files",
|
|
259
|
+
"roots": [{ "name": "Docs", "path": "docs", "extensions": [".mdx"] }],
|
|
260
|
+
"components": "components",
|
|
261
|
+
"extensions": "extensions"
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
The app lists file-backed extensions alongside database-backed ones and renders
|
|
268
|
+
them through the normal sandbox iframe. Slot declarations in `extension.json`
|
|
269
|
+
auto-mount the extension into matching `ExtensionSlot`s; there is no per-user
|
|
270
|
+
SQL install row for local extensions.
|
|
271
|
+
|
|
272
|
+
Local extensions have a tighter v1 permission model:
|
|
273
|
+
|
|
274
|
+
- `extensionData` is available for small runtime state unless disabled.
|
|
275
|
+
- `appAction` calls must be explicitly listed in `permissions.appActions`.
|
|
276
|
+
- `dbQuery`, `dbExec`, and `extensionFetch` are blocked for now.
|
|
277
|
+
- SQL-backed update, delete, share, and history actions return a message that
|
|
278
|
+
points back to the local entry file.
|
|
279
|
+
|
|
280
|
+
Use database-backed extensions when users should create/share/edit widgets at
|
|
281
|
+
runtime. Use local file extensions when the extension is part of a repo-first
|
|
282
|
+
workspace and should be reviewable, patchable, and versioned with the rest of
|
|
283
|
+
the files.
|
|
284
|
+
|
|
220
285
|
## Sharing {#sharing}
|
|
221
286
|
|
|
222
287
|
Extensions are private to the user who created them by default. To share:
|
|
@@ -60,6 +60,10 @@ my-content-repo/
|
|
|
60
60
|
components/
|
|
61
61
|
FrameworkTabs.tsx
|
|
62
62
|
Callout.tsx
|
|
63
|
+
extensions/
|
|
64
|
+
doc-status/
|
|
65
|
+
extension.json
|
|
66
|
+
index.html
|
|
63
67
|
```
|
|
64
68
|
|
|
65
69
|
In Local File Mode, the Content sidebar shows the `docs/`, `blog/`, and
|
|
@@ -71,6 +75,10 @@ file in the standard Content editor; editing in the UI writes back to
|
|
|
71
75
|
files can import or reference. The editor can render simple local MDX components
|
|
72
76
|
without requiring you to clone or fork the entire Content app.
|
|
73
77
|
|
|
78
|
+
`extensions/` is also not a content root. It is a local extension library:
|
|
79
|
+
small sandboxed widgets that can render in app slots while their source stays in
|
|
80
|
+
the repo.
|
|
81
|
+
|
|
74
82
|
## Configuration
|
|
75
83
|
|
|
76
84
|
Add `agent-native.json` to the repo or workspace root:
|
|
@@ -102,6 +110,7 @@ Add `agent-native.json` to the repo or workspace root:
|
|
|
102
110
|
}
|
|
103
111
|
],
|
|
104
112
|
"components": "components",
|
|
113
|
+
"extensions": "extensions",
|
|
105
114
|
"hide": ["**/_*.md", "**/_*.mdx"]
|
|
106
115
|
}
|
|
107
116
|
}
|
|
@@ -140,6 +149,92 @@ Content can preview local components from the configured `components` folder.
|
|
|
140
149
|
This is meant for docs-style MDX components such as tabs, callouts, package
|
|
141
150
|
install snippets, or framework-specific code blocks.
|
|
142
151
|
|
|
152
|
+
For example, add an interactive component next to your content:
|
|
153
|
+
|
|
154
|
+
```tsx
|
|
155
|
+
// components/ImpactCounter.tsx
|
|
156
|
+
import { useState } from "react";
|
|
157
|
+
|
|
158
|
+
export function ImpactCounter({
|
|
159
|
+
label = "points",
|
|
160
|
+
accent = "blue",
|
|
161
|
+
featured = false,
|
|
162
|
+
}: {
|
|
163
|
+
label?: string;
|
|
164
|
+
accent?: "blue" | "green" | "purple";
|
|
165
|
+
featured?: boolean;
|
|
166
|
+
}) {
|
|
167
|
+
const [count, setCount] = useState(3);
|
|
168
|
+
const accentClass =
|
|
169
|
+
accent === "green"
|
|
170
|
+
? "border-green-300 bg-green-50"
|
|
171
|
+
: accent === "purple"
|
|
172
|
+
? "border-purple-300 bg-purple-50"
|
|
173
|
+
: "border-blue-300 bg-blue-50";
|
|
174
|
+
|
|
175
|
+
return (
|
|
176
|
+
<div className={`rounded-md border p-4 ${accentClass}`}>
|
|
177
|
+
<div className="text-sm text-muted-foreground">Launch impact</div>
|
|
178
|
+
<div className="mt-1 text-3xl font-semibold">
|
|
179
|
+
{count} {label}
|
|
180
|
+
</div>
|
|
181
|
+
{featured ? <div className="mt-1 text-sm">Featured metric</div> : null}
|
|
182
|
+
<button
|
|
183
|
+
type="button"
|
|
184
|
+
className="mt-3 rounded border px-3 py-1 text-sm"
|
|
185
|
+
onClick={() => setCount((value) => value + 1)}
|
|
186
|
+
>
|
|
187
|
+
Add point
|
|
188
|
+
</button>
|
|
189
|
+
</div>
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export const ImpactCounterInputs = {
|
|
194
|
+
label: {
|
|
195
|
+
type: "string",
|
|
196
|
+
label: "Metric label",
|
|
197
|
+
default: "points",
|
|
198
|
+
},
|
|
199
|
+
accent: {
|
|
200
|
+
type: "select",
|
|
201
|
+
label: "Accent",
|
|
202
|
+
options: ["blue", "green", "purple"],
|
|
203
|
+
default: "blue",
|
|
204
|
+
},
|
|
205
|
+
featured: {
|
|
206
|
+
type: "boolean",
|
|
207
|
+
label: "Featured",
|
|
208
|
+
default: false,
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Then use it from any local MDX file:
|
|
214
|
+
|
|
215
|
+
```mdx
|
|
216
|
+
---
|
|
217
|
+
title: "Launch Notes"
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
# Launch Notes
|
|
221
|
+
|
|
222
|
+
<ImpactCounter label="wins" />
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
The Content dev server discovers PascalCase named exports and PascalCase default
|
|
226
|
+
exports from `.tsx`, `.jsx`, `.ts`, and `.js` files under `components/`. Those
|
|
227
|
+
components render inside the editor and appear in the slash menu under
|
|
228
|
+
**Local components**. Slash insertion creates a minimal tag such as
|
|
229
|
+
`<ImpactCounter />`; add props in the MDX source when needed.
|
|
230
|
+
|
|
231
|
+
If a component exports input metadata, selecting the component in the editor
|
|
232
|
+
shows an edit button in the component's top-right corner. Supported input types
|
|
233
|
+
are `string`, `textarea`, `number`, `boolean`, and `select`. The form writes
|
|
234
|
+
changes back to the MDX tag, so local files remain the source of truth. The
|
|
235
|
+
metadata can be exported as `ComponentNameInputs`, `ComponentNameConfig.inputs`,
|
|
236
|
+
`Component.inputs`, or `agentNative.inputs`.
|
|
237
|
+
|
|
143
238
|
Simple component tags with literal props can preview inline:
|
|
144
239
|
|
|
145
240
|
```mdx
|
|
@@ -152,6 +247,64 @@ Complex JSX expressions are preserved in source. If the editor cannot safely
|
|
|
152
247
|
preview a component prop yet, it shows a warning placeholder rather than
|
|
153
248
|
silently dropping data.
|
|
154
249
|
|
|
250
|
+
## Sharing Local Files
|
|
251
|
+
|
|
252
|
+
Local files are not shared directly because other users cannot read a path on
|
|
253
|
+
your machine. The Content toolbar's Share button creates or refreshes a
|
|
254
|
+
database-backed copy of the selected file, navigates to that copy, and opens the
|
|
255
|
+
normal share popover. The original local file remains under Local files; the
|
|
256
|
+
database copy appears under Shared copies in Local File Mode and uses the
|
|
257
|
+
standard document sharing model.
|
|
258
|
+
|
|
259
|
+
## Local Extensions
|
|
260
|
+
|
|
261
|
+
Local File Mode can also load repo-backed extensions from the configured
|
|
262
|
+
`extensions` folder. Each extension is one directory with an `extension.json`
|
|
263
|
+
manifest and an HTML entry file:
|
|
264
|
+
|
|
265
|
+
```txt
|
|
266
|
+
extensions/
|
|
267
|
+
doc-status/
|
|
268
|
+
extension.json
|
|
269
|
+
index.html
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
```json
|
|
273
|
+
{
|
|
274
|
+
"id": "doc-status",
|
|
275
|
+
"name": "Doc Status",
|
|
276
|
+
"description": "Shows metadata for the selected Content file.",
|
|
277
|
+
"entry": "index.html",
|
|
278
|
+
"slots": ["content.sidebar.bottom"],
|
|
279
|
+
"permissions": {
|
|
280
|
+
"appActions": ["list-documents"],
|
|
281
|
+
"extensionData": true
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
`index.html` is the same Alpine/Tailwind extension body format used by normal
|
|
287
|
+
database-backed extensions. When the Content app sees a local extension that
|
|
288
|
+
declares `content.sidebar.bottom`, it renders that extension at the bottom of
|
|
289
|
+
the Content sidebar. The host passes `window.slotContext` with the selected
|
|
290
|
+
document id, title, source metadata, and whether Content is in Local File Mode.
|
|
291
|
+
|
|
292
|
+
Local extensions are previewed by the app but edited as files. The Extensions
|
|
293
|
+
list shows them with a Local File badge, and the full-page viewer points back to
|
|
294
|
+
the entry file. SQL-backed extension actions such as update, delete, share, and
|
|
295
|
+
history do not apply; use your editor, Codex, Claude Code, or Git history for
|
|
296
|
+
source changes.
|
|
297
|
+
|
|
298
|
+
For v1, local extensions are intentionally conservative:
|
|
299
|
+
|
|
300
|
+
- they can use `extensionData` for their own small runtime state
|
|
301
|
+
- they can call only the `appAction`s listed in `extension.json`
|
|
302
|
+
- raw SQL helpers and external `extensionFetch` are disabled
|
|
303
|
+
- slot targets are declared in `extension.json`, not installed through SQL
|
|
304
|
+
|
|
305
|
+
This gives local workspaces an Obsidian-like plugin surface without letting an
|
|
306
|
+
arbitrary repo file inherit every capability of a database-backed extension.
|
|
307
|
+
|
|
155
308
|
## How Apps Use It
|
|
156
309
|
|
|
157
310
|
Local File Mode is implemented through the framework's local artifact helpers.
|