@ai-agent-forge/plugin-workspace-files 0.88.11 → 0.88.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/README.md CHANGED
@@ -16,7 +16,7 @@ their profile machinery.
16
16
  agent-forge plugin install ./plugins/workspace-files
17
17
 
18
18
  # from npm
19
- agent-forge plugin install @agent-forge/plugin-workspace-files
19
+ agent-forge plugin install @ai-agent-forge/plugin-workspace-files
20
20
  ```
21
21
 
22
22
  The package ships two manifests: `agent-forge.json` (ecosystem manifest for the deterministic plugin resolver) and
package/agent-forge.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "packageFormatVersion": 1,
3
3
  "id": "agent-forge.plugin.workspace-files",
4
- "pluginVersion": "0.88.11",
4
+ "pluginVersion": "0.88.13",
5
5
  "apiVersion": "1",
6
6
  "minHostVersion": "0.84.4",
7
7
  "capabilityRefs": [
@@ -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;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"]}
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,CAoGrH","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\treadonlySafe: true,\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\treadonlySafe: true,\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\treadonlySafe: true,\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"]}
@@ -180,6 +180,7 @@ export function createWorkspaceFilesCapabilityFactoryV1(runtime) {
180
180
  return (api) => {
181
181
  api.registerTool({
182
182
  name: "workspace_list",
183
+ readonlySafe: true,
183
184
  label: "List workspace files",
184
185
  description: "List bounded workspace entries through host-owned opaque references",
185
186
  parameters: Type.Object({ request: listSchema }, { additionalProperties: false }),
@@ -204,6 +205,7 @@ export function createWorkspaceFilesCapabilityFactoryV1(runtime) {
204
205
  });
205
206
  api.registerTool({
206
207
  name: "workspace_read",
208
+ readonlySafe: true,
207
209
  label: "Read workspace file",
208
210
  description: "Read a bounded preview from a host-owned workspace file reference",
209
211
  parameters: Type.Object({ request: readSchema }, { additionalProperties: false }),
@@ -225,6 +227,7 @@ export function createWorkspaceFilesCapabilityFactoryV1(runtime) {
225
227
  });
226
228
  api.registerTool({
227
229
  name: "workspace_find",
230
+ readonlySafe: true,
228
231
  label: "Find in workspace",
229
232
  description: "Return bounded workspace matches without injecting the full file contents",
230
233
  parameters: Type.Object({ request: findSchema }, { additionalProperties: false }),
@@ -1 +1 @@
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"]}
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,yEAAyE;IACzE,iEAAiE;IACjE,yEAAyE;IACzE,oDAAoD;IACpD,MAAM,KAAK,GAAG,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACpG,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,YAAY,EAAE,IAAI;YAClB,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,YAAY,EAAE,IAAI;YAClB,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,YAAY,EAAE,IAAI;YAClB,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\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\treadonlySafe: true,\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\treadonlySafe: true,\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\treadonlySafe: true,\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.88.11",
3
+ "version": "0.88.13",
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",
@@ -21,7 +21,8 @@
21
21
  "clean": "shx rm -rf dist",
22
22
  "build": "tsgo -p tsconfig.build.json",
23
23
  "test": "vitest --run",
24
- "prepublishOnly": "npm run clean && npm run build"
24
+ "prepublishOnly": "npm run clean && npm run build",
25
+ "test:coverage": "vitest --run --coverage"
25
26
  },
26
27
  "keywords": [
27
28
  "agent-forge",
@@ -45,10 +46,10 @@
45
46
  },
46
47
  "dependencies": {
47
48
  "typebox": "1.3.27",
48
- "@ai-agent-forge/plugin-sdk": "^0.88.11"
49
+ "@ai-agent-forge/plugin-sdk": "^0.88.13"
49
50
  },
50
51
  "devDependencies": {
51
- "shx": "0.4.0",
52
+ "shx": "0.3.4",
52
53
  "vitest": "4.1.11"
53
54
  }
54
55
  }
package/plugin.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "agent-forge.plugin.workspace-files",
3
- "version": "0.88.11",
3
+ "version": "0.88.13",
4
4
  "apiVersion": "1-draft",
5
5
  "entry": "./dist/entry.js",
6
6
  "hostVersion": ">=0.84.4",