@ai-agent-forge/plugin-workspace-files 0.85.6 → 0.85.8
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/agent-forge.json +1 -1
- package/dist/capability.d.ts.map +1 -1
- package/dist/capability.js +5 -1
- package/dist/capability.js.map +1 -1
- package/package.json +5 -5
- package/plugin.json +1 -1
package/agent-forge.json
CHANGED
package/dist/capability.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAY3E,OAAO,KAAK,EACX,uBAAuB,EAIvB,MAAM,YAAY,CAAC;AA+NpB,iFAAiF;AACjF,wBAAgB,uCAAuC,CAAC,OAAO,EAAE,uBAAuB,GAAG,2BAA2B,CAiGrH","sourcesContent":["import type { CapabilityPluginSyncFactory } from \"@agent-forge/plugin-sdk\";\nimport { Type } from \"typebox\";\nimport {\n\tprojectFind,\n\tprojectList,\n\tprojectRead,\n\tsanitizeWorkspaceFilesTextV1,\n\tWORKSPACE_FILES_MAX_MATCHES_V1,\n\tWORKSPACE_FILES_MAX_OPERATION_ID_CHARS_V1,\n\tWORKSPACE_FILES_MAX_QUERY_CHARS_V1,\n\tWORKSPACE_FILES_MAX_READ_BYTES_V1,\n} from \"./node-adapter.ts\";\nimport type {\n\tWorkspaceFilesAdapterV1,\n\tWorkspaceFilesFindResultV1,\n\tWorkspaceFilesListResultV1,\n\tWorkspaceFilesReadResultV1,\n} from \"./types.ts\";\n\nconst refSchema = Type.String({ minLength: 1, maxLength: 256, pattern: \"^[A-Za-z0-9][A-Za-z0-9._:-]*$\" });\nconst listSchema = Type.Object(\n\t{\n\t\tworkspaceRef: refSchema,\n\t\tdirectoryRef: Type.Optional(refSchema),\n\t\tlimit: Type.Optional(Type.Integer({ minimum: 1, maximum: 256 })),\n\t},\n\t{ additionalProperties: false },\n);\nconst readSchema = Type.Object(\n\t{\n\t\tfileRef: refSchema,\n\t\tmaxBytes: Type.Optional(Type.Integer({ minimum: 1, maximum: WORKSPACE_FILES_MAX_READ_BYTES_V1 })),\n\t},\n\t{ additionalProperties: false },\n);\nconst findSchema = Type.Object(\n\t{\n\t\tworkspaceRef: refSchema,\n\t\tquery: Type.String({ minLength: 1, maxLength: WORKSPACE_FILES_MAX_QUERY_CHARS_V1 }),\n\t\tlimit: Type.Optional(Type.Integer({ minimum: 1, maximum: WORKSPACE_FILES_MAX_MATCHES_V1 })),\n\t},\n\t{ additionalProperties: false },\n);\n\ntype Result = WorkspaceFilesListResultV1 | WorkspaceFilesReadResultV1 | WorkspaceFilesFindResultV1;\n\nfunction input(\n\tfirst: unknown,\n\tsecond: unknown,\n): { readonly request: Record<string, unknown>; readonly operationId: string } {\n\tconst value = second === undefined ? first : second;\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value))\n\t\tthrow new Error(\"workspace input must be an object\");\n\tconst operationId =\n\t\ttypeof first === \"string\" && first.trim() !== \"\" && first.length <= WORKSPACE_FILES_MAX_OPERATION_ID_CHARS_V1\n\t\t\t? first\n\t\t\t: \"profile-runtime-tool-call\";\n\tconst outer = value as Record<string, unknown>;\n\tif (outer.request === null || typeof outer.request !== \"object\" || Array.isArray(outer.request))\n\t\tthrow new Error(\"workspace request must be an object\");\n\treturn { request: outer.request as Record<string, unknown>, operationId };\n}\n\nfunction signalFrom(value: unknown): AbortSignal | undefined {\n\treturn value instanceof AbortSignal ? value : undefined;\n}\n\nconst NON_SUCCESS_STATUSES = new Set([\"failed\", \"cancelled\", \"needs_user\", \"unsupported\"]);\n\nfunction nonSuccessError(value: unknown): WorkspaceFilesListResultV1[\"error\"] | undefined {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\tconst error = value as Record<string, unknown>;\n\tif (\n\t\terror.version !== 1 ||\n\t\ttypeof error.code !== \"string\" ||\n\t\t!/^[a-z][a-z0-9_]{0,127}$/u.test(error.code) ||\n\t\ttypeof error.message !== \"string\" ||\n\t\terror.message.trim() === \"\" ||\n\t\terror.message.length > 512\n\t)\n\t\treturn undefined;\n\treturn { version: 1, code: error.code, message: sanitizeWorkspaceFilesTextV1(error.message, 512) };\n}\n\nfunction projectNonSuccess(value: unknown, operationId: string, kind: \"list\" | \"read\" | \"find\"): Result | undefined {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\tconst result = value as Record<string, unknown>;\n\tif (result.version !== 1 || result.operationId !== operationId || typeof result.status !== \"string\")\n\t\treturn undefined;\n\tif (!NON_SUCCESS_STATUSES.has(result.status)) return undefined;\n\tconst error = nonSuccessError(result.error);\n\tif (error === undefined) return undefined;\n\tif (kind === \"list\") {\n\t\tif (\n\t\t\tObject.keys(result).some(\n\t\t\t\t(key) => ![\"version\", \"operationId\", \"status\", \"entries\", \"entriesTruncated\", \"error\"].includes(key),\n\t\t\t) ||\n\t\t\t!Array.isArray(result.entries) ||\n\t\t\tresult.entries.length !== 0 ||\n\t\t\tresult.entriesTruncated !== false\n\t\t)\n\t\t\treturn undefined;\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\toperationId,\n\t\t\tstatus: result.status as WorkspaceFilesListResultV1[\"status\"],\n\t\t\tentries: [],\n\t\t\tentriesTruncated: false,\n\t\t\terror,\n\t\t};\n\t}\n\tif (kind === \"read\") {\n\t\tif (\n\t\t\tObject.keys(result).some(\n\t\t\t\t(key) =>\n\t\t\t\t\t![\n\t\t\t\t\t\t\"version\",\n\t\t\t\t\t\t\"operationId\",\n\t\t\t\t\t\t\"status\",\n\t\t\t\t\t\t\"contentPreview\",\n\t\t\t\t\t\t\"contentBytes\",\n\t\t\t\t\t\t\"contentTruncated\",\n\t\t\t\t\t\t\"artifactRef\",\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t].includes(key),\n\t\t\t) ||\n\t\t\tresult.contentPreview !== \"\" ||\n\t\t\tresult.contentBytes !== 0 ||\n\t\t\tresult.contentTruncated !== false\n\t\t)\n\t\t\treturn undefined;\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\toperationId,\n\t\t\tstatus: result.status as WorkspaceFilesReadResultV1[\"status\"],\n\t\t\tcontentPreview: \"\",\n\t\t\tcontentBytes: 0,\n\t\t\tcontentTruncated: false,\n\t\t\terror,\n\t\t};\n\t}\n\tif (\n\t\tObject.keys(result).some(\n\t\t\t(key) => ![\"version\", \"operationId\", \"status\", \"matches\", \"matchesTruncated\", \"error\"].includes(key),\n\t\t) ||\n\t\t!Array.isArray(result.matches) ||\n\t\tresult.matches.length !== 0 ||\n\t\tresult.matchesTruncated !== false\n\t)\n\t\treturn undefined;\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus: result.status as WorkspaceFilesFindResultV1[\"status\"],\n\t\tmatches: [],\n\t\tmatchesTruncated: false,\n\t\terror,\n\t};\n}\n\nfunction projectListResult(value: unknown, operationId: string): WorkspaceFilesListResultV1 | undefined {\n\treturn (\n\t\tprojectList(value, operationId) ??\n\t\t(projectNonSuccess(value, operationId, \"list\") as WorkspaceFilesListResultV1 | undefined)\n\t);\n}\n\nfunction projectReadResult(value: unknown, operationId: string): WorkspaceFilesReadResultV1 | undefined {\n\treturn (\n\t\tprojectRead(value, operationId) ??\n\t\t(projectNonSuccess(value, operationId, \"read\") as WorkspaceFilesReadResultV1 | undefined)\n\t);\n}\n\nfunction projectFindResult(value: unknown, operationId: string): WorkspaceFilesFindResultV1 | undefined {\n\treturn (\n\t\tprojectFind(value, operationId) ??\n\t\t(projectNonSuccess(value, operationId, \"find\") as WorkspaceFilesFindResultV1 | undefined)\n\t);\n}\n\nfunction errorFor(status: \"failed\" | \"cancelled\") {\n\tconst error = {\n\t\tversion: 1 as const,\n\t\tcode: status === \"cancelled\" ? \"cancelled\" : \"adapter_failed\",\n\t\tmessage: status === \"cancelled\" ? \"Workspace operation was cancelled\" : \"Workspace file adapter failed\",\n\t};\n\treturn error;\n}\n\nfunction listFallback(operationId: string, status: \"failed\" | \"cancelled\"): WorkspaceFilesListResultV1 {\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus,\n\t\tentries: [],\n\t\tentriesTruncated: false,\n\t\terror: errorFor(status),\n\t};\n}\n\nfunction readFallback(operationId: string, status: \"failed\" | \"cancelled\"): WorkspaceFilesReadResultV1 {\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus,\n\t\tcontentPreview: \"\",\n\t\tcontentBytes: 0,\n\t\tcontentTruncated: false,\n\t\terror: errorFor(status),\n\t};\n}\n\nfunction findFallback(operationId: string, status: \"failed\" | \"cancelled\"): WorkspaceFilesFindResultV1 {\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus,\n\t\tmatches: [],\n\t\tmatchesTruncated: false,\n\t\terror: errorFor(status),\n\t};\n}\n\nasync function execute<T extends Result>(\n\toperationId: string,\n\tsignal: AbortSignal | undefined,\n\trun: () => Promise<T>,\n\tproject: (value: unknown, operationId: string) => T | undefined,\n\tfallbackResult: (status: \"failed\" | \"cancelled\") => T,\n): Promise<T> {\n\tif (signal?.aborted) return fallbackResult(\"cancelled\");\n\ttry {\n\t\tconst result = await run();\n\t\treturn project(result, operationId) ?? fallbackResult(\"failed\");\n\t} catch {\n\t\treturn fallbackResult(\"failed\");\n\t}\n}\n\n/** Registers bounded workspace reads using only opaque host-owned references. */\nexport function createWorkspaceFilesCapabilityFactoryV1(runtime: WorkspaceFilesAdapterV1): CapabilityPluginSyncFactory {\n\treturn (api) => {\n\t\tapi.registerTool({\n\t\t\tname: \"workspace_list\",\n\t\t\tlabel: \"List workspace files\",\n\t\t\tdescription: \"List bounded workspace entries through host-owned opaque references\",\n\t\t\tparameters: Type.Object({ request: listSchema }, { additionalProperties: false }),\n\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst { request, operationId } = input(first, second);\n\t\t\t\t\tconst signal = signalFrom(third);\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\toperationId,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\truntime.list(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\t\tworkspaceRef: request.workspaceRef as string,\n\t\t\t\t\t\t\t\t\t...(request.directoryRef === undefined\n\t\t\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t\t\t: { directoryRef: request.directoryRef as string }),\n\t\t\t\t\t\t\t\t\t...(request.limit === undefined ? {} : { limit: request.limit as number }),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t(value, id) => projectListResult(value, id),\n\t\t\t\t\t\t(status) => listFallback(operationId, status),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\treturn listFallback(\"profile-runtime-tool-call\", \"failed\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\tapi.registerTool({\n\t\t\tname: \"workspace_read\",\n\t\t\tlabel: \"Read workspace file\",\n\t\t\tdescription: \"Read a bounded preview from a host-owned workspace file reference\",\n\t\t\tparameters: Type.Object({ request: readSchema }, { additionalProperties: false }),\n\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst { request, operationId } = input(first, second);\n\t\t\t\t\tconst signal = signalFrom(third);\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\toperationId,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\truntime.read(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\t\tfileRef: request.fileRef as string,\n\t\t\t\t\t\t\t\t\t...(request.maxBytes === undefined ? {} : { maxBytes: request.maxBytes as number }),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t(value, id) => projectReadResult(value, id),\n\t\t\t\t\t\t(status) => readFallback(operationId, status),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\treturn readFallback(\"profile-runtime-tool-call\", \"failed\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\tapi.registerTool({\n\t\t\tname: \"workspace_find\",\n\t\t\tlabel: \"Find in workspace\",\n\t\t\tdescription: \"Return bounded workspace matches without injecting the full file contents\",\n\t\t\tparameters: Type.Object({ request: findSchema }, { additionalProperties: false }),\n\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst { request, operationId } = input(first, second);\n\t\t\t\t\tconst signal = signalFrom(third);\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\toperationId,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\truntime.find(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\t\tworkspaceRef: request.workspaceRef as string,\n\t\t\t\t\t\t\t\t\tquery: request.query as string,\n\t\t\t\t\t\t\t\t\t...(request.limit === undefined ? {} : { limit: request.limit as number }),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t(value, id) => projectFindResult(value, id),\n\t\t\t\t\t\t(status) => findFallback(operationId, status),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\treturn findFallback(\"profile-runtime-tool-call\", \"failed\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAY3E,OAAO,KAAK,EACX,uBAAuB,EAIvB,MAAM,YAAY,CAAC;AAmOpB,iFAAiF;AACjF,wBAAgB,uCAAuC,CAAC,OAAO,EAAE,uBAAuB,GAAG,2BAA2B,CAiGrH","sourcesContent":["import type { CapabilityPluginSyncFactory } from \"@agent-forge/plugin-sdk\";\nimport { Type } from \"typebox\";\nimport {\n\tprojectFind,\n\tprojectList,\n\tprojectRead,\n\tsanitizeWorkspaceFilesTextV1,\n\tWORKSPACE_FILES_MAX_MATCHES_V1,\n\tWORKSPACE_FILES_MAX_OPERATION_ID_CHARS_V1,\n\tWORKSPACE_FILES_MAX_QUERY_CHARS_V1,\n\tWORKSPACE_FILES_MAX_READ_BYTES_V1,\n} from \"./node-adapter.ts\";\nimport type {\n\tWorkspaceFilesAdapterV1,\n\tWorkspaceFilesFindResultV1,\n\tWorkspaceFilesListResultV1,\n\tWorkspaceFilesReadResultV1,\n} from \"./types.ts\";\n\nconst refSchema = Type.String({ minLength: 1, maxLength: 256, pattern: \"^[A-Za-z0-9][A-Za-z0-9._:-]*$\" });\nconst listSchema = Type.Object(\n\t{\n\t\tworkspaceRef: refSchema,\n\t\tdirectoryRef: Type.Optional(refSchema),\n\t\tlimit: Type.Optional(Type.Integer({ minimum: 1, maximum: 256 })),\n\t},\n\t{ additionalProperties: false },\n);\nconst readSchema = Type.Object(\n\t{\n\t\tfileRef: refSchema,\n\t\tmaxBytes: Type.Optional(Type.Integer({ minimum: 1, maximum: WORKSPACE_FILES_MAX_READ_BYTES_V1 })),\n\t},\n\t{ additionalProperties: false },\n);\nconst findSchema = Type.Object(\n\t{\n\t\tworkspaceRef: refSchema,\n\t\tquery: Type.String({ minLength: 1, maxLength: WORKSPACE_FILES_MAX_QUERY_CHARS_V1 }),\n\t\tlimit: Type.Optional(Type.Integer({ minimum: 1, maximum: WORKSPACE_FILES_MAX_MATCHES_V1 })),\n\t},\n\t{ additionalProperties: false },\n);\n\ntype Result = WorkspaceFilesListResultV1 | WorkspaceFilesReadResultV1 | WorkspaceFilesFindResultV1;\n\nfunction input(\n\tfirst: unknown,\n\tsecond: unknown,\n): { readonly request: Record<string, unknown>; readonly operationId: string } {\n\t// Shape-based dual-convention read (aligned with subagent-delegate): the\n\t// runtime invoke face passes the input object first and the host\n\t// CapabilityToolContext second; the agent tool face passes the tool call\n\t// id (a string) first and the params object second.\n\tconst value = first !== null && typeof first === \"object\" && !Array.isArray(first) ? first : second;\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value))\n\t\tthrow new Error(\"workspace input must be an object\");\n\tconst operationId =\n\t\ttypeof first === \"string\" && first.trim() !== \"\" && first.length <= WORKSPACE_FILES_MAX_OPERATION_ID_CHARS_V1\n\t\t\t? first\n\t\t\t: \"profile-runtime-tool-call\";\n\tconst outer = value as Record<string, unknown>;\n\tif (outer.request === null || typeof outer.request !== \"object\" || Array.isArray(outer.request))\n\t\tthrow new Error(\"workspace request must be an object\");\n\treturn { request: outer.request as Record<string, unknown>, operationId };\n}\n\nfunction signalFrom(value: unknown): AbortSignal | undefined {\n\treturn value instanceof AbortSignal ? value : undefined;\n}\n\nconst NON_SUCCESS_STATUSES = new Set([\"failed\", \"cancelled\", \"needs_user\", \"unsupported\"]);\n\nfunction nonSuccessError(value: unknown): WorkspaceFilesListResultV1[\"error\"] | undefined {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\tconst error = value as Record<string, unknown>;\n\tif (\n\t\terror.version !== 1 ||\n\t\ttypeof error.code !== \"string\" ||\n\t\t!/^[a-z][a-z0-9_]{0,127}$/u.test(error.code) ||\n\t\ttypeof error.message !== \"string\" ||\n\t\terror.message.trim() === \"\" ||\n\t\terror.message.length > 512\n\t)\n\t\treturn undefined;\n\treturn { version: 1, code: error.code, message: sanitizeWorkspaceFilesTextV1(error.message, 512) };\n}\n\nfunction projectNonSuccess(value: unknown, operationId: string, kind: \"list\" | \"read\" | \"find\"): Result | undefined {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\tconst result = value as Record<string, unknown>;\n\tif (result.version !== 1 || result.operationId !== operationId || typeof result.status !== \"string\")\n\t\treturn undefined;\n\tif (!NON_SUCCESS_STATUSES.has(result.status)) return undefined;\n\tconst error = nonSuccessError(result.error);\n\tif (error === undefined) return undefined;\n\tif (kind === \"list\") {\n\t\tif (\n\t\t\tObject.keys(result).some(\n\t\t\t\t(key) => ![\"version\", \"operationId\", \"status\", \"entries\", \"entriesTruncated\", \"error\"].includes(key),\n\t\t\t) ||\n\t\t\t!Array.isArray(result.entries) ||\n\t\t\tresult.entries.length !== 0 ||\n\t\t\tresult.entriesTruncated !== false\n\t\t)\n\t\t\treturn undefined;\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\toperationId,\n\t\t\tstatus: result.status as WorkspaceFilesListResultV1[\"status\"],\n\t\t\tentries: [],\n\t\t\tentriesTruncated: false,\n\t\t\terror,\n\t\t};\n\t}\n\tif (kind === \"read\") {\n\t\tif (\n\t\t\tObject.keys(result).some(\n\t\t\t\t(key) =>\n\t\t\t\t\t![\n\t\t\t\t\t\t\"version\",\n\t\t\t\t\t\t\"operationId\",\n\t\t\t\t\t\t\"status\",\n\t\t\t\t\t\t\"contentPreview\",\n\t\t\t\t\t\t\"contentBytes\",\n\t\t\t\t\t\t\"contentTruncated\",\n\t\t\t\t\t\t\"artifactRef\",\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t].includes(key),\n\t\t\t) ||\n\t\t\tresult.contentPreview !== \"\" ||\n\t\t\tresult.contentBytes !== 0 ||\n\t\t\tresult.contentTruncated !== false\n\t\t)\n\t\t\treturn undefined;\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\toperationId,\n\t\t\tstatus: result.status as WorkspaceFilesReadResultV1[\"status\"],\n\t\t\tcontentPreview: \"\",\n\t\t\tcontentBytes: 0,\n\t\t\tcontentTruncated: false,\n\t\t\terror,\n\t\t};\n\t}\n\tif (\n\t\tObject.keys(result).some(\n\t\t\t(key) => ![\"version\", \"operationId\", \"status\", \"matches\", \"matchesTruncated\", \"error\"].includes(key),\n\t\t) ||\n\t\t!Array.isArray(result.matches) ||\n\t\tresult.matches.length !== 0 ||\n\t\tresult.matchesTruncated !== false\n\t)\n\t\treturn undefined;\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus: result.status as WorkspaceFilesFindResultV1[\"status\"],\n\t\tmatches: [],\n\t\tmatchesTruncated: false,\n\t\terror,\n\t};\n}\n\nfunction projectListResult(value: unknown, operationId: string): WorkspaceFilesListResultV1 | undefined {\n\treturn (\n\t\tprojectList(value, operationId) ??\n\t\t(projectNonSuccess(value, operationId, \"list\") as WorkspaceFilesListResultV1 | undefined)\n\t);\n}\n\nfunction projectReadResult(value: unknown, operationId: string): WorkspaceFilesReadResultV1 | undefined {\n\treturn (\n\t\tprojectRead(value, operationId) ??\n\t\t(projectNonSuccess(value, operationId, \"read\") as WorkspaceFilesReadResultV1 | undefined)\n\t);\n}\n\nfunction projectFindResult(value: unknown, operationId: string): WorkspaceFilesFindResultV1 | undefined {\n\treturn (\n\t\tprojectFind(value, operationId) ??\n\t\t(projectNonSuccess(value, operationId, \"find\") as WorkspaceFilesFindResultV1 | undefined)\n\t);\n}\n\nfunction errorFor(status: \"failed\" | \"cancelled\") {\n\tconst error = {\n\t\tversion: 1 as const,\n\t\tcode: status === \"cancelled\" ? \"cancelled\" : \"adapter_failed\",\n\t\tmessage: status === \"cancelled\" ? \"Workspace operation was cancelled\" : \"Workspace file adapter failed\",\n\t};\n\treturn error;\n}\n\nfunction listFallback(operationId: string, status: \"failed\" | \"cancelled\"): WorkspaceFilesListResultV1 {\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus,\n\t\tentries: [],\n\t\tentriesTruncated: false,\n\t\terror: errorFor(status),\n\t};\n}\n\nfunction readFallback(operationId: string, status: \"failed\" | \"cancelled\"): WorkspaceFilesReadResultV1 {\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus,\n\t\tcontentPreview: \"\",\n\t\tcontentBytes: 0,\n\t\tcontentTruncated: false,\n\t\terror: errorFor(status),\n\t};\n}\n\nfunction findFallback(operationId: string, status: \"failed\" | \"cancelled\"): WorkspaceFilesFindResultV1 {\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus,\n\t\tmatches: [],\n\t\tmatchesTruncated: false,\n\t\terror: errorFor(status),\n\t};\n}\n\nasync function execute<T extends Result>(\n\toperationId: string,\n\tsignal: AbortSignal | undefined,\n\trun: () => Promise<T>,\n\tproject: (value: unknown, operationId: string) => T | undefined,\n\tfallbackResult: (status: \"failed\" | \"cancelled\") => T,\n): Promise<T> {\n\tif (signal?.aborted) return fallbackResult(\"cancelled\");\n\ttry {\n\t\tconst result = await run();\n\t\treturn project(result, operationId) ?? fallbackResult(\"failed\");\n\t} catch {\n\t\treturn fallbackResult(\"failed\");\n\t}\n}\n\n/** Registers bounded workspace reads using only opaque host-owned references. */\nexport function createWorkspaceFilesCapabilityFactoryV1(runtime: WorkspaceFilesAdapterV1): CapabilityPluginSyncFactory {\n\treturn (api) => {\n\t\tapi.registerTool({\n\t\t\tname: \"workspace_list\",\n\t\t\tlabel: \"List workspace files\",\n\t\t\tdescription: \"List bounded workspace entries through host-owned opaque references\",\n\t\t\tparameters: Type.Object({ request: listSchema }, { additionalProperties: false }),\n\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst { request, operationId } = input(first, second);\n\t\t\t\t\tconst signal = signalFrom(third);\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\toperationId,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\truntime.list(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\t\tworkspaceRef: request.workspaceRef as string,\n\t\t\t\t\t\t\t\t\t...(request.directoryRef === undefined\n\t\t\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t\t\t: { directoryRef: request.directoryRef as string }),\n\t\t\t\t\t\t\t\t\t...(request.limit === undefined ? {} : { limit: request.limit as number }),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t(value, id) => projectListResult(value, id),\n\t\t\t\t\t\t(status) => listFallback(operationId, status),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\treturn listFallback(\"profile-runtime-tool-call\", \"failed\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\tapi.registerTool({\n\t\t\tname: \"workspace_read\",\n\t\t\tlabel: \"Read workspace file\",\n\t\t\tdescription: \"Read a bounded preview from a host-owned workspace file reference\",\n\t\t\tparameters: Type.Object({ request: readSchema }, { additionalProperties: false }),\n\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst { request, operationId } = input(first, second);\n\t\t\t\t\tconst signal = signalFrom(third);\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\toperationId,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\truntime.read(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\t\tfileRef: request.fileRef as string,\n\t\t\t\t\t\t\t\t\t...(request.maxBytes === undefined ? {} : { maxBytes: request.maxBytes as number }),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t(value, id) => projectReadResult(value, id),\n\t\t\t\t\t\t(status) => readFallback(operationId, status),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\treturn readFallback(\"profile-runtime-tool-call\", \"failed\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\tapi.registerTool({\n\t\t\tname: \"workspace_find\",\n\t\t\tlabel: \"Find in workspace\",\n\t\t\tdescription: \"Return bounded workspace matches without injecting the full file contents\",\n\t\t\tparameters: Type.Object({ request: findSchema }, { additionalProperties: false }),\n\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst { request, operationId } = input(first, second);\n\t\t\t\t\tconst signal = signalFrom(third);\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\toperationId,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\truntime.find(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\t\tworkspaceRef: request.workspaceRef as string,\n\t\t\t\t\t\t\t\t\tquery: request.query as string,\n\t\t\t\t\t\t\t\t\t...(request.limit === undefined ? {} : { limit: request.limit as number }),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t(value, id) => projectFindResult(value, id),\n\t\t\t\t\t\t(status) => findFallback(operationId, status),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\treturn findFallback(\"profile-runtime-tool-call\", \"failed\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t};\n}\n"]}
|
package/dist/capability.js
CHANGED
|
@@ -16,7 +16,11 @@ const findSchema = Type.Object({
|
|
|
16
16
|
limit: Type.Optional(Type.Integer({ minimum: 1, maximum: WORKSPACE_FILES_MAX_MATCHES_V1 })),
|
|
17
17
|
}, { additionalProperties: false });
|
|
18
18
|
function input(first, second) {
|
|
19
|
-
|
|
19
|
+
// Shape-based dual-convention read (aligned with subagent-delegate): the
|
|
20
|
+
// runtime invoke face passes the input object first and the host
|
|
21
|
+
// CapabilityToolContext second; the agent tool face passes the tool call
|
|
22
|
+
// id (a string) first and the params object second.
|
|
23
|
+
const value = first !== null && typeof first === "object" && !Array.isArray(first) ? first : second;
|
|
20
24
|
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
21
25
|
throw new Error("workspace input must be an object");
|
|
22
26
|
const operationId = typeof first === "string" && first.trim() !== "" && first.length <= WORKSPACE_FILES_MAX_OPERATION_ID_CHARS_V1
|
package/dist/capability.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability.js","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EACN,WAAW,EACX,WAAW,EACX,WAAW,EACX,4BAA4B,EAC5B,8BAA8B,EAC9B,yCAAyC,EACzC,kCAAkC,EAClC,iCAAiC,GACjC,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,CAAC;AAC1G,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAC7B;IACC,YAAY,EAAE,SAAS;IACvB,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;IACtC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;CAChE,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AACF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAC7B;IACC,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAC;CACjG,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AACF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAC7B;IACC,YAAY,EAAE,SAAS;IACvB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,kCAAkC,EAAE,CAAC;IACnF,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAC;CAC3F,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAIF,SAAS,KAAK,CACb,KAAc,EACd,MAAe,EAC+D;IAC9E,MAAM,KAAK,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACpD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACtD,MAAM,WAAW,GAChB,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,IAAI,yCAAyC;QAC5G,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,2BAA2B,CAAC;IAChC,MAAM,KAAK,GAAG,KAAgC,CAAC;IAC/C,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAC9F,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACxD,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAkC,EAAE,WAAW,EAAE,CAAC;AAAA,CAC1E;AAED,SAAS,UAAU,CAAC,KAAc,EAA2B;IAC5D,OAAO,KAAK,YAAY,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CACxD;AAED,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;AAE3F,SAAS,eAAe,CAAC,KAAc,EAAmD;IACzF,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1F,MAAM,KAAK,GAAG,KAAgC,CAAC;IAC/C,IACC,KAAK,CAAC,OAAO,KAAK,CAAC;QACnB,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5C,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE;QAC3B,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG;QAE1B,OAAO,SAAS,CAAC;IAClB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,4BAA4B,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;AAAA,CACnG;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,WAAmB,EAAE,IAA8B,EAAsB;IACnH,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1F,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QAClG,OAAO,SAAS,CAAC;IAClB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/D,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACrB,IACC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CACvB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CACpG;YACD,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAC3B,MAAM,CAAC,gBAAgB,KAAK,KAAK;YAEjC,OAAO,SAAS,CAAC;QAClB,OAAO;YACN,OAAO,EAAE,CAAC;YACV,WAAW;YACX,MAAM,EAAE,MAAM,CAAC,MAA8C;YAC7D,OAAO,EAAE,EAAE;YACX,gBAAgB,EAAE,KAAK;YACvB,KAAK;SACL,CAAC;IACH,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACrB,IACC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CACvB,CAAC,GAAG,EAAE,EAAE,CACP,CAAC;YACA,SAAS;YACT,aAAa;YACb,QAAQ;YACR,gBAAgB;YAChB,cAAc;YACd,kBAAkB;YAClB,aAAa;YACb,OAAO;SACP,CAAC,QAAQ,CAAC,GAAG,CAAC,CAChB;YACD,MAAM,CAAC,cAAc,KAAK,EAAE;YAC5B,MAAM,CAAC,YAAY,KAAK,CAAC;YACzB,MAAM,CAAC,gBAAgB,KAAK,KAAK;YAEjC,OAAO,SAAS,CAAC;QAClB,OAAO;YACN,OAAO,EAAE,CAAC;YACV,WAAW;YACX,MAAM,EAAE,MAAM,CAAC,MAA8C;YAC7D,cAAc,EAAE,EAAE;YAClB,YAAY,EAAE,CAAC;YACf,gBAAgB,EAAE,KAAK;YACvB,KAAK;SACL,CAAC;IACH,CAAC;IACD,IACC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CACvB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CACpG;QACD,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;QAC9B,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAC3B,MAAM,CAAC,gBAAgB,KAAK,KAAK;QAEjC,OAAO,SAAS,CAAC;IAClB,OAAO;QACN,OAAO,EAAE,CAAC;QACV,WAAW;QACX,MAAM,EAAE,MAAM,CAAC,MAA8C;QAC7D,OAAO,EAAE,EAAE;QACX,gBAAgB,EAAE,KAAK;QACvB,KAAK;KACL,CAAC;AAAA,CACF;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,WAAmB,EAA0C;IACvG,OAAO,CACN,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC;QAC9B,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAA4C,CACzF,CAAC;AAAA,CACF;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,WAAmB,EAA0C;IACvG,OAAO,CACN,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC;QAC9B,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAA4C,CACzF,CAAC;AAAA,CACF;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,WAAmB,EAA0C;IACvG,OAAO,CACN,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC;QAC9B,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAA4C,CACzF,CAAC;AAAA,CACF;AAED,SAAS,QAAQ,CAAC,MAA8B,EAAE;IACjD,MAAM,KAAK,GAAG;QACb,OAAO,EAAE,CAAU;QACnB,IAAI,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB;QAC7D,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,+BAA+B;KACvG,CAAC;IACF,OAAO,KAAK,CAAC;AAAA,CACb;AAED,SAAS,YAAY,CAAC,WAAmB,EAAE,MAA8B,EAA8B;IACtG,OAAO;QACN,OAAO,EAAE,CAAC;QACV,WAAW;QACX,MAAM;QACN,OAAO,EAAE,EAAE;QACX,gBAAgB,EAAE,KAAK;QACvB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;KACvB,CAAC;AAAA,CACF;AAED,SAAS,YAAY,CAAC,WAAmB,EAAE,MAA8B,EAA8B;IACtG,OAAO;QACN,OAAO,EAAE,CAAC;QACV,WAAW;QACX,MAAM;QACN,cAAc,EAAE,EAAE;QAClB,YAAY,EAAE,CAAC;QACf,gBAAgB,EAAE,KAAK;QACvB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;KACvB,CAAC;AAAA,CACF;AAED,SAAS,YAAY,CAAC,WAAmB,EAAE,MAA8B,EAA8B;IACtG,OAAO;QACN,OAAO,EAAE,CAAC;QACV,WAAW;QACX,MAAM;QACN,OAAO,EAAE,EAAE;QACX,gBAAgB,EAAE,KAAK;QACvB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;KACvB,CAAC;AAAA,CACF;AAED,KAAK,UAAU,OAAO,CACrB,WAAmB,EACnB,MAA+B,EAC/B,GAAqB,EACrB,OAA+D,EAC/D,cAAqD,EACxC;IACb,IAAI,MAAM,EAAE,OAAO;QAAE,OAAO,cAAc,CAAC,WAAW,CAAC,CAAC;IACxD,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;AAAA,CACD;AAED,iFAAiF;AACjF,MAAM,UAAU,uCAAuC,CAAC,OAAgC,EAA+B;IACtH,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QACf,GAAG,CAAC,YAAY,CAAC;YAChB,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,sBAAsB;YAC7B,WAAW,EAAE,qEAAqE;YAClF,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;YACjF,OAAO,EAAE,KAAK,EAAE,KAAc,EAAE,MAAgB,EAAE,KAAe,EAAE,EAAE,CAAC;gBACrE,IAAI,CAAC;oBACJ,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;oBACtD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;oBACjC,OAAO,OAAO,CACb,WAAW,EACX,MAAM,EACN,GAAG,EAAE,CACJ,OAAO,CAAC,IAAI,CACX;wBACC,OAAO,EAAE,CAAC;wBACV,WAAW;wBACX,YAAY,EAAE,OAAO,CAAC,YAAsB;wBAC5C,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS;4BACrC,CAAC,CAAC,EAAE;4BACJ,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAsB,EAAE,CAAC;wBACpD,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAe,EAAE,CAAC;qBAC1E,EACD,MAAM,CACN,EACF,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,EAC3C,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAC7C,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACR,OAAO,YAAY,CAAC,2BAA2B,EAAE,QAAQ,CAAC,CAAC;gBAC5D,CAAC;YAAA,CACD;SACD,CAAC,CAAC;QACH,GAAG,CAAC,YAAY,CAAC;YAChB,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EAAE,mEAAmE;YAChF,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;YACjF,OAAO,EAAE,KAAK,EAAE,KAAc,EAAE,MAAgB,EAAE,KAAe,EAAE,EAAE,CAAC;gBACrE,IAAI,CAAC;oBACJ,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;oBACtD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;oBACjC,OAAO,OAAO,CACb,WAAW,EACX,MAAM,EACN,GAAG,EAAE,CACJ,OAAO,CAAC,IAAI,CACX;wBACC,OAAO,EAAE,CAAC;wBACV,WAAW;wBACX,OAAO,EAAE,OAAO,CAAC,OAAiB;wBAClC,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAkB,EAAE,CAAC;qBACnF,EACD,MAAM,CACN,EACF,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,EAC3C,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAC7C,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACR,OAAO,YAAY,CAAC,2BAA2B,EAAE,QAAQ,CAAC,CAAC;gBAC5D,CAAC;YAAA,CACD;SACD,CAAC,CAAC;QACH,GAAG,CAAC,YAAY,CAAC;YAChB,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,mBAAmB;YAC1B,WAAW,EAAE,2EAA2E;YACxF,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;YACjF,OAAO,EAAE,KAAK,EAAE,KAAc,EAAE,MAAgB,EAAE,KAAe,EAAE,EAAE,CAAC;gBACrE,IAAI,CAAC;oBACJ,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;oBACtD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;oBACjC,OAAO,OAAO,CACb,WAAW,EACX,MAAM,EACN,GAAG,EAAE,CACJ,OAAO,CAAC,IAAI,CACX;wBACC,OAAO,EAAE,CAAC;wBACV,WAAW;wBACX,YAAY,EAAE,OAAO,CAAC,YAAsB;wBAC5C,KAAK,EAAE,OAAO,CAAC,KAAe;wBAC9B,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAe,EAAE,CAAC;qBAC1E,EACD,MAAM,CACN,EACF,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,EAC3C,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAC7C,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACR,OAAO,YAAY,CAAC,2BAA2B,EAAE,QAAQ,CAAC,CAAC;gBAC5D,CAAC;YAAA,CACD;SACD,CAAC,CAAC;IAAA,CACH,CAAC;AAAA,CACF","sourcesContent":["import type { CapabilityPluginSyncFactory } from \"@agent-forge/plugin-sdk\";\nimport { Type } from \"typebox\";\nimport {\n\tprojectFind,\n\tprojectList,\n\tprojectRead,\n\tsanitizeWorkspaceFilesTextV1,\n\tWORKSPACE_FILES_MAX_MATCHES_V1,\n\tWORKSPACE_FILES_MAX_OPERATION_ID_CHARS_V1,\n\tWORKSPACE_FILES_MAX_QUERY_CHARS_V1,\n\tWORKSPACE_FILES_MAX_READ_BYTES_V1,\n} from \"./node-adapter.ts\";\nimport type {\n\tWorkspaceFilesAdapterV1,\n\tWorkspaceFilesFindResultV1,\n\tWorkspaceFilesListResultV1,\n\tWorkspaceFilesReadResultV1,\n} from \"./types.ts\";\n\nconst refSchema = Type.String({ minLength: 1, maxLength: 256, pattern: \"^[A-Za-z0-9][A-Za-z0-9._:-]*$\" });\nconst listSchema = Type.Object(\n\t{\n\t\tworkspaceRef: refSchema,\n\t\tdirectoryRef: Type.Optional(refSchema),\n\t\tlimit: Type.Optional(Type.Integer({ minimum: 1, maximum: 256 })),\n\t},\n\t{ additionalProperties: false },\n);\nconst readSchema = Type.Object(\n\t{\n\t\tfileRef: refSchema,\n\t\tmaxBytes: Type.Optional(Type.Integer({ minimum: 1, maximum: WORKSPACE_FILES_MAX_READ_BYTES_V1 })),\n\t},\n\t{ additionalProperties: false },\n);\nconst findSchema = Type.Object(\n\t{\n\t\tworkspaceRef: refSchema,\n\t\tquery: Type.String({ minLength: 1, maxLength: WORKSPACE_FILES_MAX_QUERY_CHARS_V1 }),\n\t\tlimit: Type.Optional(Type.Integer({ minimum: 1, maximum: WORKSPACE_FILES_MAX_MATCHES_V1 })),\n\t},\n\t{ additionalProperties: false },\n);\n\ntype Result = WorkspaceFilesListResultV1 | WorkspaceFilesReadResultV1 | WorkspaceFilesFindResultV1;\n\nfunction input(\n\tfirst: unknown,\n\tsecond: unknown,\n): { readonly request: Record<string, unknown>; readonly operationId: string } {\n\tconst value = second === undefined ? first : second;\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value))\n\t\tthrow new Error(\"workspace input must be an object\");\n\tconst operationId =\n\t\ttypeof first === \"string\" && first.trim() !== \"\" && first.length <= WORKSPACE_FILES_MAX_OPERATION_ID_CHARS_V1\n\t\t\t? first\n\t\t\t: \"profile-runtime-tool-call\";\n\tconst outer = value as Record<string, unknown>;\n\tif (outer.request === null || typeof outer.request !== \"object\" || Array.isArray(outer.request))\n\t\tthrow new Error(\"workspace request must be an object\");\n\treturn { request: outer.request as Record<string, unknown>, operationId };\n}\n\nfunction signalFrom(value: unknown): AbortSignal | undefined {\n\treturn value instanceof AbortSignal ? value : undefined;\n}\n\nconst NON_SUCCESS_STATUSES = new Set([\"failed\", \"cancelled\", \"needs_user\", \"unsupported\"]);\n\nfunction nonSuccessError(value: unknown): WorkspaceFilesListResultV1[\"error\"] | undefined {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\tconst error = value as Record<string, unknown>;\n\tif (\n\t\terror.version !== 1 ||\n\t\ttypeof error.code !== \"string\" ||\n\t\t!/^[a-z][a-z0-9_]{0,127}$/u.test(error.code) ||\n\t\ttypeof error.message !== \"string\" ||\n\t\terror.message.trim() === \"\" ||\n\t\terror.message.length > 512\n\t)\n\t\treturn undefined;\n\treturn { version: 1, code: error.code, message: sanitizeWorkspaceFilesTextV1(error.message, 512) };\n}\n\nfunction projectNonSuccess(value: unknown, operationId: string, kind: \"list\" | \"read\" | \"find\"): Result | undefined {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\tconst result = value as Record<string, unknown>;\n\tif (result.version !== 1 || result.operationId !== operationId || typeof result.status !== \"string\")\n\t\treturn undefined;\n\tif (!NON_SUCCESS_STATUSES.has(result.status)) return undefined;\n\tconst error = nonSuccessError(result.error);\n\tif (error === undefined) return undefined;\n\tif (kind === \"list\") {\n\t\tif (\n\t\t\tObject.keys(result).some(\n\t\t\t\t(key) => ![\"version\", \"operationId\", \"status\", \"entries\", \"entriesTruncated\", \"error\"].includes(key),\n\t\t\t) ||\n\t\t\t!Array.isArray(result.entries) ||\n\t\t\tresult.entries.length !== 0 ||\n\t\t\tresult.entriesTruncated !== false\n\t\t)\n\t\t\treturn undefined;\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\toperationId,\n\t\t\tstatus: result.status as WorkspaceFilesListResultV1[\"status\"],\n\t\t\tentries: [],\n\t\t\tentriesTruncated: false,\n\t\t\terror,\n\t\t};\n\t}\n\tif (kind === \"read\") {\n\t\tif (\n\t\t\tObject.keys(result).some(\n\t\t\t\t(key) =>\n\t\t\t\t\t![\n\t\t\t\t\t\t\"version\",\n\t\t\t\t\t\t\"operationId\",\n\t\t\t\t\t\t\"status\",\n\t\t\t\t\t\t\"contentPreview\",\n\t\t\t\t\t\t\"contentBytes\",\n\t\t\t\t\t\t\"contentTruncated\",\n\t\t\t\t\t\t\"artifactRef\",\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t].includes(key),\n\t\t\t) ||\n\t\t\tresult.contentPreview !== \"\" ||\n\t\t\tresult.contentBytes !== 0 ||\n\t\t\tresult.contentTruncated !== false\n\t\t)\n\t\t\treturn undefined;\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\toperationId,\n\t\t\tstatus: result.status as WorkspaceFilesReadResultV1[\"status\"],\n\t\t\tcontentPreview: \"\",\n\t\t\tcontentBytes: 0,\n\t\t\tcontentTruncated: false,\n\t\t\terror,\n\t\t};\n\t}\n\tif (\n\t\tObject.keys(result).some(\n\t\t\t(key) => ![\"version\", \"operationId\", \"status\", \"matches\", \"matchesTruncated\", \"error\"].includes(key),\n\t\t) ||\n\t\t!Array.isArray(result.matches) ||\n\t\tresult.matches.length !== 0 ||\n\t\tresult.matchesTruncated !== false\n\t)\n\t\treturn undefined;\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus: result.status as WorkspaceFilesFindResultV1[\"status\"],\n\t\tmatches: [],\n\t\tmatchesTruncated: false,\n\t\terror,\n\t};\n}\n\nfunction projectListResult(value: unknown, operationId: string): WorkspaceFilesListResultV1 | undefined {\n\treturn (\n\t\tprojectList(value, operationId) ??\n\t\t(projectNonSuccess(value, operationId, \"list\") as WorkspaceFilesListResultV1 | undefined)\n\t);\n}\n\nfunction projectReadResult(value: unknown, operationId: string): WorkspaceFilesReadResultV1 | undefined {\n\treturn (\n\t\tprojectRead(value, operationId) ??\n\t\t(projectNonSuccess(value, operationId, \"read\") as WorkspaceFilesReadResultV1 | undefined)\n\t);\n}\n\nfunction projectFindResult(value: unknown, operationId: string): WorkspaceFilesFindResultV1 | undefined {\n\treturn (\n\t\tprojectFind(value, operationId) ??\n\t\t(projectNonSuccess(value, operationId, \"find\") as WorkspaceFilesFindResultV1 | undefined)\n\t);\n}\n\nfunction errorFor(status: \"failed\" | \"cancelled\") {\n\tconst error = {\n\t\tversion: 1 as const,\n\t\tcode: status === \"cancelled\" ? \"cancelled\" : \"adapter_failed\",\n\t\tmessage: status === \"cancelled\" ? \"Workspace operation was cancelled\" : \"Workspace file adapter failed\",\n\t};\n\treturn error;\n}\n\nfunction listFallback(operationId: string, status: \"failed\" | \"cancelled\"): WorkspaceFilesListResultV1 {\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus,\n\t\tentries: [],\n\t\tentriesTruncated: false,\n\t\terror: errorFor(status),\n\t};\n}\n\nfunction readFallback(operationId: string, status: \"failed\" | \"cancelled\"): WorkspaceFilesReadResultV1 {\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus,\n\t\tcontentPreview: \"\",\n\t\tcontentBytes: 0,\n\t\tcontentTruncated: false,\n\t\terror: errorFor(status),\n\t};\n}\n\nfunction findFallback(operationId: string, status: \"failed\" | \"cancelled\"): WorkspaceFilesFindResultV1 {\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus,\n\t\tmatches: [],\n\t\tmatchesTruncated: false,\n\t\terror: errorFor(status),\n\t};\n}\n\nasync function execute<T extends Result>(\n\toperationId: string,\n\tsignal: AbortSignal | undefined,\n\trun: () => Promise<T>,\n\tproject: (value: unknown, operationId: string) => T | undefined,\n\tfallbackResult: (status: \"failed\" | \"cancelled\") => T,\n): Promise<T> {\n\tif (signal?.aborted) return fallbackResult(\"cancelled\");\n\ttry {\n\t\tconst result = await run();\n\t\treturn project(result, operationId) ?? fallbackResult(\"failed\");\n\t} catch {\n\t\treturn fallbackResult(\"failed\");\n\t}\n}\n\n/** Registers bounded workspace reads using only opaque host-owned references. */\nexport function createWorkspaceFilesCapabilityFactoryV1(runtime: WorkspaceFilesAdapterV1): CapabilityPluginSyncFactory {\n\treturn (api) => {\n\t\tapi.registerTool({\n\t\t\tname: \"workspace_list\",\n\t\t\tlabel: \"List workspace files\",\n\t\t\tdescription: \"List bounded workspace entries through host-owned opaque references\",\n\t\t\tparameters: Type.Object({ request: listSchema }, { additionalProperties: false }),\n\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst { request, operationId } = input(first, second);\n\t\t\t\t\tconst signal = signalFrom(third);\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\toperationId,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\truntime.list(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\t\tworkspaceRef: request.workspaceRef as string,\n\t\t\t\t\t\t\t\t\t...(request.directoryRef === undefined\n\t\t\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t\t\t: { directoryRef: request.directoryRef as string }),\n\t\t\t\t\t\t\t\t\t...(request.limit === undefined ? {} : { limit: request.limit as number }),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t(value, id) => projectListResult(value, id),\n\t\t\t\t\t\t(status) => listFallback(operationId, status),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\treturn listFallback(\"profile-runtime-tool-call\", \"failed\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\tapi.registerTool({\n\t\t\tname: \"workspace_read\",\n\t\t\tlabel: \"Read workspace file\",\n\t\t\tdescription: \"Read a bounded preview from a host-owned workspace file reference\",\n\t\t\tparameters: Type.Object({ request: readSchema }, { additionalProperties: false }),\n\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst { request, operationId } = input(first, second);\n\t\t\t\t\tconst signal = signalFrom(third);\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\toperationId,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\truntime.read(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\t\tfileRef: request.fileRef as string,\n\t\t\t\t\t\t\t\t\t...(request.maxBytes === undefined ? {} : { maxBytes: request.maxBytes as number }),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t(value, id) => projectReadResult(value, id),\n\t\t\t\t\t\t(status) => readFallback(operationId, status),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\treturn readFallback(\"profile-runtime-tool-call\", \"failed\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\tapi.registerTool({\n\t\t\tname: \"workspace_find\",\n\t\t\tlabel: \"Find in workspace\",\n\t\t\tdescription: \"Return bounded workspace matches without injecting the full file contents\",\n\t\t\tparameters: Type.Object({ request: findSchema }, { additionalProperties: false }),\n\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst { request, operationId } = input(first, second);\n\t\t\t\t\tconst signal = signalFrom(third);\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\toperationId,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\truntime.find(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\t\tworkspaceRef: request.workspaceRef as string,\n\t\t\t\t\t\t\t\t\tquery: request.query as string,\n\t\t\t\t\t\t\t\t\t...(request.limit === undefined ? {} : { limit: request.limit as number }),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t(value, id) => projectFindResult(value, id),\n\t\t\t\t\t\t(status) => findFallback(operationId, status),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\treturn findFallback(\"profile-runtime-tool-call\", \"failed\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"capability.js","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CapabilityPluginSyncFactory } from \"@agent-forge/plugin-sdk\";\nimport { Type } from \"typebox\";\nimport {\n\tprojectFind,\n\tprojectList,\n\tprojectRead,\n\tsanitizeWorkspaceFilesTextV1,\n\tWORKSPACE_FILES_MAX_MATCHES_V1,\n\tWORKSPACE_FILES_MAX_OPERATION_ID_CHARS_V1,\n\tWORKSPACE_FILES_MAX_QUERY_CHARS_V1,\n\tWORKSPACE_FILES_MAX_READ_BYTES_V1,\n} from \"./node-adapter.ts\";\nimport type {\n\tWorkspaceFilesAdapterV1,\n\tWorkspaceFilesFindResultV1,\n\tWorkspaceFilesListResultV1,\n\tWorkspaceFilesReadResultV1,\n} from \"./types.ts\";\n\nconst refSchema = Type.String({ minLength: 1, maxLength: 256, pattern: \"^[A-Za-z0-9][A-Za-z0-9._:-]*$\" });\nconst listSchema = Type.Object(\n\t{\n\t\tworkspaceRef: refSchema,\n\t\tdirectoryRef: Type.Optional(refSchema),\n\t\tlimit: Type.Optional(Type.Integer({ minimum: 1, maximum: 256 })),\n\t},\n\t{ additionalProperties: false },\n);\nconst readSchema = Type.Object(\n\t{\n\t\tfileRef: refSchema,\n\t\tmaxBytes: Type.Optional(Type.Integer({ minimum: 1, maximum: WORKSPACE_FILES_MAX_READ_BYTES_V1 })),\n\t},\n\t{ additionalProperties: false },\n);\nconst findSchema = Type.Object(\n\t{\n\t\tworkspaceRef: refSchema,\n\t\tquery: Type.String({ minLength: 1, maxLength: WORKSPACE_FILES_MAX_QUERY_CHARS_V1 }),\n\t\tlimit: Type.Optional(Type.Integer({ minimum: 1, maximum: WORKSPACE_FILES_MAX_MATCHES_V1 })),\n\t},\n\t{ additionalProperties: false },\n);\n\ntype Result = WorkspaceFilesListResultV1 | WorkspaceFilesReadResultV1 | WorkspaceFilesFindResultV1;\n\nfunction input(\n\tfirst: unknown,\n\tsecond: unknown,\n): { readonly request: Record<string, unknown>; readonly operationId: string } {\n\t// Shape-based dual-convention read (aligned with subagent-delegate): the\n\t// runtime invoke face passes the input object first and the host\n\t// CapabilityToolContext second; the agent tool face passes the tool call\n\t// id (a string) first and the params object second.\n\tconst value = first !== null && typeof first === \"object\" && !Array.isArray(first) ? first : second;\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value))\n\t\tthrow new Error(\"workspace input must be an object\");\n\tconst operationId =\n\t\ttypeof first === \"string\" && first.trim() !== \"\" && first.length <= WORKSPACE_FILES_MAX_OPERATION_ID_CHARS_V1\n\t\t\t? first\n\t\t\t: \"profile-runtime-tool-call\";\n\tconst outer = value as Record<string, unknown>;\n\tif (outer.request === null || typeof outer.request !== \"object\" || Array.isArray(outer.request))\n\t\tthrow new Error(\"workspace request must be an object\");\n\treturn { request: outer.request as Record<string, unknown>, operationId };\n}\n\nfunction signalFrom(value: unknown): AbortSignal | undefined {\n\treturn value instanceof AbortSignal ? value : undefined;\n}\n\nconst NON_SUCCESS_STATUSES = new Set([\"failed\", \"cancelled\", \"needs_user\", \"unsupported\"]);\n\nfunction nonSuccessError(value: unknown): WorkspaceFilesListResultV1[\"error\"] | undefined {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\tconst error = value as Record<string, unknown>;\n\tif (\n\t\terror.version !== 1 ||\n\t\ttypeof error.code !== \"string\" ||\n\t\t!/^[a-z][a-z0-9_]{0,127}$/u.test(error.code) ||\n\t\ttypeof error.message !== \"string\" ||\n\t\terror.message.trim() === \"\" ||\n\t\terror.message.length > 512\n\t)\n\t\treturn undefined;\n\treturn { version: 1, code: error.code, message: sanitizeWorkspaceFilesTextV1(error.message, 512) };\n}\n\nfunction projectNonSuccess(value: unknown, operationId: string, kind: \"list\" | \"read\" | \"find\"): Result | undefined {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\tconst result = value as Record<string, unknown>;\n\tif (result.version !== 1 || result.operationId !== operationId || typeof result.status !== \"string\")\n\t\treturn undefined;\n\tif (!NON_SUCCESS_STATUSES.has(result.status)) return undefined;\n\tconst error = nonSuccessError(result.error);\n\tif (error === undefined) return undefined;\n\tif (kind === \"list\") {\n\t\tif (\n\t\t\tObject.keys(result).some(\n\t\t\t\t(key) => ![\"version\", \"operationId\", \"status\", \"entries\", \"entriesTruncated\", \"error\"].includes(key),\n\t\t\t) ||\n\t\t\t!Array.isArray(result.entries) ||\n\t\t\tresult.entries.length !== 0 ||\n\t\t\tresult.entriesTruncated !== false\n\t\t)\n\t\t\treturn undefined;\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\toperationId,\n\t\t\tstatus: result.status as WorkspaceFilesListResultV1[\"status\"],\n\t\t\tentries: [],\n\t\t\tentriesTruncated: false,\n\t\t\terror,\n\t\t};\n\t}\n\tif (kind === \"read\") {\n\t\tif (\n\t\t\tObject.keys(result).some(\n\t\t\t\t(key) =>\n\t\t\t\t\t![\n\t\t\t\t\t\t\"version\",\n\t\t\t\t\t\t\"operationId\",\n\t\t\t\t\t\t\"status\",\n\t\t\t\t\t\t\"contentPreview\",\n\t\t\t\t\t\t\"contentBytes\",\n\t\t\t\t\t\t\"contentTruncated\",\n\t\t\t\t\t\t\"artifactRef\",\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t].includes(key),\n\t\t\t) ||\n\t\t\tresult.contentPreview !== \"\" ||\n\t\t\tresult.contentBytes !== 0 ||\n\t\t\tresult.contentTruncated !== false\n\t\t)\n\t\t\treturn undefined;\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\toperationId,\n\t\t\tstatus: result.status as WorkspaceFilesReadResultV1[\"status\"],\n\t\t\tcontentPreview: \"\",\n\t\t\tcontentBytes: 0,\n\t\t\tcontentTruncated: false,\n\t\t\terror,\n\t\t};\n\t}\n\tif (\n\t\tObject.keys(result).some(\n\t\t\t(key) => ![\"version\", \"operationId\", \"status\", \"matches\", \"matchesTruncated\", \"error\"].includes(key),\n\t\t) ||\n\t\t!Array.isArray(result.matches) ||\n\t\tresult.matches.length !== 0 ||\n\t\tresult.matchesTruncated !== false\n\t)\n\t\treturn undefined;\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus: result.status as WorkspaceFilesFindResultV1[\"status\"],\n\t\tmatches: [],\n\t\tmatchesTruncated: false,\n\t\terror,\n\t};\n}\n\nfunction projectListResult(value: unknown, operationId: string): WorkspaceFilesListResultV1 | undefined {\n\treturn (\n\t\tprojectList(value, operationId) ??\n\t\t(projectNonSuccess(value, operationId, \"list\") as WorkspaceFilesListResultV1 | undefined)\n\t);\n}\n\nfunction projectReadResult(value: unknown, operationId: string): WorkspaceFilesReadResultV1 | undefined {\n\treturn (\n\t\tprojectRead(value, operationId) ??\n\t\t(projectNonSuccess(value, operationId, \"read\") as WorkspaceFilesReadResultV1 | undefined)\n\t);\n}\n\nfunction projectFindResult(value: unknown, operationId: string): WorkspaceFilesFindResultV1 | undefined {\n\treturn (\n\t\tprojectFind(value, operationId) ??\n\t\t(projectNonSuccess(value, operationId, \"find\") as WorkspaceFilesFindResultV1 | undefined)\n\t);\n}\n\nfunction errorFor(status: \"failed\" | \"cancelled\") {\n\tconst error = {\n\t\tversion: 1 as const,\n\t\tcode: status === \"cancelled\" ? \"cancelled\" : \"adapter_failed\",\n\t\tmessage: status === \"cancelled\" ? \"Workspace operation was cancelled\" : \"Workspace file adapter failed\",\n\t};\n\treturn error;\n}\n\nfunction listFallback(operationId: string, status: \"failed\" | \"cancelled\"): WorkspaceFilesListResultV1 {\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus,\n\t\tentries: [],\n\t\tentriesTruncated: false,\n\t\terror: errorFor(status),\n\t};\n}\n\nfunction readFallback(operationId: string, status: \"failed\" | \"cancelled\"): WorkspaceFilesReadResultV1 {\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus,\n\t\tcontentPreview: \"\",\n\t\tcontentBytes: 0,\n\t\tcontentTruncated: false,\n\t\terror: errorFor(status),\n\t};\n}\n\nfunction findFallback(operationId: string, status: \"failed\" | \"cancelled\"): WorkspaceFilesFindResultV1 {\n\treturn {\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus,\n\t\tmatches: [],\n\t\tmatchesTruncated: false,\n\t\terror: errorFor(status),\n\t};\n}\n\nasync function execute<T extends Result>(\n\toperationId: string,\n\tsignal: AbortSignal | undefined,\n\trun: () => Promise<T>,\n\tproject: (value: unknown, operationId: string) => T | undefined,\n\tfallbackResult: (status: \"failed\" | \"cancelled\") => T,\n): Promise<T> {\n\tif (signal?.aborted) return fallbackResult(\"cancelled\");\n\ttry {\n\t\tconst result = await run();\n\t\treturn project(result, operationId) ?? fallbackResult(\"failed\");\n\t} catch {\n\t\treturn fallbackResult(\"failed\");\n\t}\n}\n\n/** Registers bounded workspace reads using only opaque host-owned references. */\nexport function createWorkspaceFilesCapabilityFactoryV1(runtime: WorkspaceFilesAdapterV1): CapabilityPluginSyncFactory {\n\treturn (api) => {\n\t\tapi.registerTool({\n\t\t\tname: \"workspace_list\",\n\t\t\tlabel: \"List workspace files\",\n\t\t\tdescription: \"List bounded workspace entries through host-owned opaque references\",\n\t\t\tparameters: Type.Object({ request: listSchema }, { additionalProperties: false }),\n\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst { request, operationId } = input(first, second);\n\t\t\t\t\tconst signal = signalFrom(third);\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\toperationId,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\truntime.list(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\t\tworkspaceRef: request.workspaceRef as string,\n\t\t\t\t\t\t\t\t\t...(request.directoryRef === undefined\n\t\t\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t\t\t: { directoryRef: request.directoryRef as string }),\n\t\t\t\t\t\t\t\t\t...(request.limit === undefined ? {} : { limit: request.limit as number }),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t(value, id) => projectListResult(value, id),\n\t\t\t\t\t\t(status) => listFallback(operationId, status),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\treturn listFallback(\"profile-runtime-tool-call\", \"failed\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\tapi.registerTool({\n\t\t\tname: \"workspace_read\",\n\t\t\tlabel: \"Read workspace file\",\n\t\t\tdescription: \"Read a bounded preview from a host-owned workspace file reference\",\n\t\t\tparameters: Type.Object({ request: readSchema }, { additionalProperties: false }),\n\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst { request, operationId } = input(first, second);\n\t\t\t\t\tconst signal = signalFrom(third);\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\toperationId,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\truntime.read(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\t\tfileRef: request.fileRef as string,\n\t\t\t\t\t\t\t\t\t...(request.maxBytes === undefined ? {} : { maxBytes: request.maxBytes as number }),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t(value, id) => projectReadResult(value, id),\n\t\t\t\t\t\t(status) => readFallback(operationId, status),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\treturn readFallback(\"profile-runtime-tool-call\", \"failed\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\tapi.registerTool({\n\t\t\tname: \"workspace_find\",\n\t\t\tlabel: \"Find in workspace\",\n\t\t\tdescription: \"Return bounded workspace matches without injecting the full file contents\",\n\t\t\tparameters: Type.Object({ request: findSchema }, { additionalProperties: false }),\n\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst { request, operationId } = input(first, second);\n\t\t\t\t\tconst signal = signalFrom(third);\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\toperationId,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\truntime.find(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\t\tworkspaceRef: request.workspaceRef as string,\n\t\t\t\t\t\t\t\t\tquery: request.query as string,\n\t\t\t\t\t\t\t\t\t...(request.limit === undefined ? {} : { limit: request.limit as number }),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t(value, id) => projectFindResult(value, id),\n\t\t\t\t\t\t(status) => findFallback(operationId, status),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\treturn findFallback(\"profile-runtime-tool-call\", \"failed\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t};\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-agent-forge/plugin-workspace-files",
|
|
3
|
-
"version": "0.85.
|
|
3
|
+
"version": "0.85.8",
|
|
4
4
|
"description": "Workspace files capability plugin for Agent Forge (read-only workspace_list/workspace_read/workspace_find tools)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -44,12 +44,12 @@
|
|
|
44
44
|
"node": ">=22.19.0"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"
|
|
48
|
-
"
|
|
47
|
+
"typebox": "1.3.27",
|
|
48
|
+
"@ai-agent-forge/plugin-sdk": "^0.85.8"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@agent-forge/agent-forge": "^0.85.6",
|
|
52
51
|
"shx": "0.4.0",
|
|
53
|
-
"vitest": "4.1.9"
|
|
52
|
+
"vitest": "4.1.9",
|
|
53
|
+
"@ai-agent-forge/agent-forge": "^0.85.8"
|
|
54
54
|
}
|
|
55
55
|
}
|