@glodon-aiot/bot-client-sdk 3.25.1-alpha.7 → 3.26.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +543 -98
  2. package/dist/es/AgentSession.mjs +230 -165
  3. package/dist/es/BotClient.mjs +186 -136
  4. package/dist/es/Config.mjs +111 -26
  5. package/dist/es/Session.mjs +12 -0
  6. package/dist/es/api/index.mjs +42 -33
  7. package/dist/es/index.mjs +68 -9
  8. package/dist/es/localFiles/adapters/FileSystemAccessAdapter.mjs +174 -0
  9. package/dist/es/localFiles/adapters/HostBridgeAdapter.mjs +172 -0
  10. package/dist/es/localFiles/adapters/MemoryWorkspaceAdapter.mjs +162 -0
  11. package/dist/es/localFiles/adapters/WorkspaceFileAdapter.mjs +50 -0
  12. package/dist/es/localFiles/adapters/fsaTypes.mjs +9 -0
  13. package/dist/es/localFiles/constants.mjs +47 -0
  14. package/dist/es/localFiles/createLocalFilesPlugin.mjs +255 -0
  15. package/dist/es/localFiles/createLocalPythonPlugin.mjs +196 -0
  16. package/dist/es/localFiles/errors.mjs +57 -0
  17. package/dist/es/localFiles/host/connectHostBridge.mjs +50 -0
  18. package/dist/es/localFiles/host/protocol.mjs +26 -0
  19. package/dist/es/localFiles/limits.mjs +22 -0
  20. package/dist/es/localFiles/schemas.mjs +327 -0
  21. package/dist/es/localFiles/security/downloadUrlPolicy.mjs +39 -0
  22. package/dist/es/localFiles/security/glob.mjs +28 -0
  23. package/dist/es/localFiles/security/pathPolicy.mjs +59 -0
  24. package/dist/es/localFiles/security/sensitiveFiles.mjs +115 -0
  25. package/dist/es/localFiles/tools/readTools.mjs +333 -0
  26. package/dist/es/localFiles/tools/runtime.mjs +108 -0
  27. package/dist/es/localFiles/tools/transferTools.mjs +228 -0
  28. package/dist/es/localFiles/tools/writeTools.mjs +173 -0
  29. package/dist/es/localFiles/transfer/SessionFileTransfer.mjs +111 -0
  30. package/dist/es/localFiles/validate.mjs +66 -0
  31. package/dist/es/localFiles/workspace/LocalWorkspace.mjs +339 -0
  32. package/dist/es/localFiles/workspace/handleStore.mjs +79 -0
  33. package/dist/es/localFiles/workspace/watchDirectory.mjs +38 -0
  34. package/dist/es/package.json.mjs +7 -4
  35. package/dist/lib/index.js +9 -4
  36. package/dist/src/AgentSession.d.ts +9 -0
  37. package/dist/src/BotClient.d.ts +12 -2
  38. package/dist/src/Config.d.ts +22 -0
  39. package/dist/src/Session.d.ts +5 -1
  40. package/dist/src/api/index.d.ts +3 -1
  41. package/dist/src/index.d.ts +4 -2
  42. package/dist/src/localFiles/adapters/FileSystemAccessAdapter.d.ts +17 -0
  43. package/dist/src/localFiles/adapters/HostBridgeAdapter.d.ts +24 -0
  44. package/dist/src/localFiles/adapters/MemoryWorkspaceAdapter.d.ts +18 -0
  45. package/dist/src/localFiles/adapters/WorkspaceFileAdapter.d.ts +26 -0
  46. package/dist/src/localFiles/adapters/fsaTypes.d.ts +39 -0
  47. package/dist/src/localFiles/constants.d.ts +50 -0
  48. package/dist/src/localFiles/createLocalFilesPlugin.d.ts +11 -0
  49. package/dist/src/localFiles/createLocalPythonPlugin.d.ts +12 -0
  50. package/dist/src/localFiles/errors.d.ts +34 -0
  51. package/dist/src/localFiles/host/connectHostBridge.d.ts +6 -0
  52. package/dist/src/localFiles/host/protocol.d.ts +33 -0
  53. package/dist/src/localFiles/index.d.ts +21 -0
  54. package/dist/src/localFiles/limits.d.ts +3 -0
  55. package/dist/src/localFiles/schemas.d.ts +30 -0
  56. package/dist/src/localFiles/security/downloadUrlPolicy.d.ts +4 -0
  57. package/dist/src/localFiles/security/glob.d.ts +3 -0
  58. package/dist/src/localFiles/security/pathPolicy.d.ts +14 -0
  59. package/dist/src/localFiles/security/sensitiveFiles.d.ts +23 -0
  60. package/dist/src/localFiles/tools/readTools.d.ts +7 -0
  61. package/dist/src/localFiles/tools/runtime.d.ts +43 -0
  62. package/dist/src/localFiles/tools/transferTools.d.ts +4 -0
  63. package/dist/src/localFiles/tools/writeTools.d.ts +4 -0
  64. package/dist/src/localFiles/transfer/SessionFileTransfer.d.ts +40 -0
  65. package/dist/src/localFiles/types.d.ts +306 -0
  66. package/dist/src/localFiles/validate.d.ts +2 -0
  67. package/dist/src/localFiles/workspace/LocalWorkspace.d.ts +99 -0
  68. package/dist/src/localFiles/workspace/handleStore.d.ts +11 -0
  69. package/dist/src/localFiles/workspace/watchDirectory.d.ts +7 -0
  70. package/package.json +7 -4
@@ -1,2 +1,4 @@
1
- import { CVForceApi } from '@glodon-aiot/apis';
1
+ import { AIShopApi, CVForceApi } from '@glodon-aiot/apis';
2
2
  export declare function getCVForceService(apiBase: string, token: string, errorHandler: (status: number, message: string) => void): CVForceApi;
3
+ /** 平台文件上传与查询,base 为 `${apiRoot}/aishop`。 */
4
+ export declare function getAIShopService(apiBase: string, token: string, errorHandler: (status: number, message: string) => void): AIShopApi;
@@ -1,5 +1,7 @@
1
- export type { AgentPluginRegistor, AgentPluginMap, MCPConfig, McpServer } from './Config';
2
- export { configure, configuration } from './Config';
1
+ export type { AgentPluginRegistor, AgentPluginMap, BotClientConfig, MCPConfig, McpServer } from './Config';
2
+ export { configure, configuration, getRegisteredLocalFilesPluginCode, getRegisteredLocalPythonPluginCode, resolveLocalFilesPluginCode, } from './Config';
3
+ export type { ISessionArtifact } from '@glodon-aiot/apis';
3
4
  export { default as BotClient } from './BotClient';
4
5
  export { default as Session } from './Session';
5
6
  export { default as AgentPlugin } from './AgentPlugin';
7
+ export * from './localFiles';
@@ -0,0 +1,17 @@
1
+ import { WorkspaceEntry, WorkspaceFileAdapter, WriteOptions, WriteSource } from './WorkspaceFileAdapter';
2
+ import { FsaDirectoryHandle } from './fsaTypes';
3
+ /**
4
+ * 基于用户授权的 DirectoryHandle 的工作区。只通过逐级 getDirectoryHandle / getFileHandle
5
+ * 访问子树,不使用任何绝对路径。FSA 不暴露符号链接目标,链接的处理以浏览器行为为准。
6
+ */
7
+ export declare class FileSystemAccessAdapter implements WorkspaceFileAdapter {
8
+ private readonly root;
9
+ constructor(root: FsaDirectoryHandle);
10
+ get displayName(): string;
11
+ private resolveDirectory;
12
+ private resolveFile;
13
+ stat(path: string): Promise<WorkspaceEntry>;
14
+ listEntries(path: string, signal?: AbortSignal): Promise<WorkspaceEntry[]>;
15
+ readFile(path: string): Promise<Blob>;
16
+ writeFile(path: string, source: WriteSource, options?: WriteOptions): Promise<void>;
17
+ }
@@ -0,0 +1,24 @@
1
+ import { WorkspaceEntry, WorkspaceFileAdapter, WriteOptions, WriteSource } from './WorkspaceFileAdapter';
2
+ import { HostResponseMessage, HostWebView } from '../host/protocol';
3
+ /**
4
+ * 把工作区原语转成宿主消息。页面看不到绝对路径,目录由宿主在授权后推送。
5
+ */
6
+ export declare class HostBridgeAdapter implements WorkspaceFileAdapter {
7
+ private readonly view;
8
+ displayName: string;
9
+ private seq;
10
+ private readonly pending;
11
+ constructor(view: HostWebView, displayName?: string);
12
+ settle(message: HostResponseMessage): void;
13
+ private call;
14
+ stat(path: string): Promise<WorkspaceEntry>;
15
+ listEntries(path: string, signal?: AbortSignal): Promise<WorkspaceEntry[]>;
16
+ readFile(path: string): Promise<Blob>;
17
+ runPython(path: string, args: string[], timeoutMs: number, signal?: AbortSignal): Promise<{
18
+ exitCode: number;
19
+ timedOut: boolean;
20
+ stdout: string;
21
+ stderr: string;
22
+ }>;
23
+ writeFile(path: string, source: WriteSource, options?: WriteOptions): Promise<void>;
24
+ }
@@ -0,0 +1,18 @@
1
+ import { WorkspaceEntry, WorkspaceFileAdapter, WriteOptions, WriteSource } from './WorkspaceFileAdapter';
2
+ /** 内存工作区:用于测试与契约基准,语义与 FileSystemAccessAdapter 一致。 */
3
+ export declare class MemoryWorkspaceAdapter implements WorkspaceFileAdapter {
4
+ readonly displayName: string;
5
+ private root;
6
+ constructor(files?: Record<string, string | Uint8Array>, displayName?: string);
7
+ /**
8
+ * 直接写入文件(含中间目录),用于构造测试数据或模拟外部修改。
9
+ * 以 `/` 结尾的路径表示创建空目录。
10
+ */
11
+ seed(path: string, content?: string | Uint8Array, lastModified?: number): void;
12
+ private resolveDirectory;
13
+ private resolveNode;
14
+ stat(path: string): Promise<WorkspaceEntry>;
15
+ listEntries(path: string, signal?: AbortSignal): Promise<WorkspaceEntry[]>;
16
+ readFile(path: string): Promise<Blob>;
17
+ writeFile(path: string, source: WriteSource, options?: WriteOptions): Promise<void>;
18
+ }
@@ -0,0 +1,26 @@
1
+ export interface WorkspaceEntry {
2
+ name: string;
3
+ kind: 'file' | 'directory';
4
+ size?: number;
5
+ lastModified?: number;
6
+ }
7
+ export type WriteSource = string | Uint8Array | AsyncIterable<Uint8Array>;
8
+ export interface WriteOptions {
9
+ createDirectories?: boolean;
10
+ signal?: AbortSignal;
11
+ }
12
+ /**
13
+ * 工作区磁盘原语。路径均为已规范化的工作区相对路径,根目录为空字符串。
14
+ * 失败时抛出与 FSA 同名的 DOMException(NotFoundError、TypeMismatchError 等),
15
+ * 由工具层统一映射为错误码,保证不同后端语义一致。
16
+ */
17
+ export interface WorkspaceFileAdapter {
18
+ readonly displayName: string;
19
+ stat(path: string): Promise<WorkspaceEntry>;
20
+ listEntries(path: string, signal?: AbortSignal): Promise<WorkspaceEntry[]>;
21
+ readFile(path: string): Promise<Blob>;
22
+ /** 全部内容写完才提交;失败或取消时原文件保持不变,新建的文件不会残留。 */
23
+ writeFile(path: string, source: WriteSource, options?: WriteOptions): Promise<void>;
24
+ }
25
+ export declare function domError(name: string, message?: string): DOMException;
26
+ export declare function toChunks(source: WriteSource): AsyncIterable<Uint8Array>;
@@ -0,0 +1,39 @@
1
+ export type FsaPermissionMode = 'read' | 'readwrite';
2
+ export interface FsaPermissionDescriptor {
3
+ mode?: FsaPermissionMode;
4
+ }
5
+ export interface FsaWritableStream {
6
+ write(data: Uint8Array | Blob | string): Promise<void>;
7
+ close(): Promise<void>;
8
+ abort(reason?: unknown): Promise<void>;
9
+ }
10
+ export interface FsaHandleBase {
11
+ readonly name: string;
12
+ queryPermission?(descriptor?: FsaPermissionDescriptor): Promise<PermissionState>;
13
+ requestPermission?(descriptor?: FsaPermissionDescriptor): Promise<PermissionState>;
14
+ }
15
+ export interface FsaFileHandle extends FsaHandleBase {
16
+ readonly kind: 'file';
17
+ getFile(): Promise<File>;
18
+ createWritable(options?: {
19
+ keepExistingData?: boolean;
20
+ }): Promise<FsaWritableStream>;
21
+ }
22
+ export interface FsaDirectoryHandle extends FsaHandleBase {
23
+ readonly kind: 'directory';
24
+ getDirectoryHandle(name: string, options?: {
25
+ create?: boolean;
26
+ }): Promise<FsaDirectoryHandle>;
27
+ getFileHandle(name: string, options?: {
28
+ create?: boolean;
29
+ }): Promise<FsaFileHandle>;
30
+ removeEntry(name: string, options?: {
31
+ recursive?: boolean;
32
+ }): Promise<void>;
33
+ values(): AsyncIterableIterator<FsaDirectoryHandle | FsaFileHandle>;
34
+ }
35
+ export type ShowDirectoryPicker = (options?: {
36
+ id?: string;
37
+ mode?: FsaPermissionMode;
38
+ }) => Promise<FsaDirectoryHandle>;
39
+ export declare function getNativeDirectoryPicker(): ShowDirectoryPicker | undefined;
@@ -0,0 +1,50 @@
1
+ import { Env } from '../Config';
2
+ export declare const LOCAL_FILES_FUNCTION_CODES: readonly ["list_directory", "read_file", "stat_file", "search_files", "search_text", "apply_patch", "write_file", "upload_file", "download_file"];
3
+ export type LocalFilesFunctionCode = (typeof LOCAL_FILES_FUNCTION_CODES)[number];
4
+ /**
5
+ * 平台上的内置工具插件。本地文件工具和 `run_python` 都在这一个插件里。
6
+ * dev、test、prod、local 使用同一个 pluginCode。
7
+ */
8
+ export declare const BUILTIN_TOOLS_PLUGIN_CODE = "buildin_tools";
9
+ export declare const BUILTIN_TOOLS_PLUGIN_CODES: Record<Env, string>;
10
+ /** 与 `BUILTIN_TOOLS_PLUGIN_CODES` 相同。文件工具和脚本工具共用一个插件编码。 */
11
+ export declare const LOCAL_FILES_PLUGIN_CODES: Record<Env, string>;
12
+ /** 本地 Python 脚本。与文件工具注册在同一个插件里。 */
13
+ export declare const LOCAL_PYTHON_FUNCTION_CODE = "run_python";
14
+ /** 与 `BUILTIN_TOOLS_PLUGIN_CODES` 相同。未单独配置时跟随文件工具的 pluginCode。 */
15
+ export declare const LOCAL_PYTHON_PLUGIN_CODES: Record<Env, string>;
16
+ export declare const PYTHON_DEFAULT_TIMEOUT_MS = 20000;
17
+ export declare const PYTHON_MAX_TIMEOUT_MS = 120000;
18
+ export declare const PYTHON_MAX_ARGS = 16;
19
+ export declare const WORKSPACE_GRANT_ID = "current-workspace";
20
+ export declare const KiB = 1024;
21
+ export declare const MiB: number;
22
+ /** 单文件上传/下载上限(MB),与 UI 拖拽上传共用。 */
23
+ export declare const TRANSFER_FILE_SIZE_LIMIT_MB = 50;
24
+ export interface LocalFilesLimits {
25
+ maxReadBytes: number;
26
+ maxWriteBytes: number;
27
+ maxSearchResults: number;
28
+ maxConcurrentRequests: number;
29
+ maxTransferBytes: number;
30
+ toolTimeoutMs: number;
31
+ searchTimeoutMs: number;
32
+ transferTimeoutMs: number;
33
+ approvalTimeoutMs: number;
34
+ }
35
+ export declare const DEFAULT_LIMITS: Readonly<LocalFilesLimits>;
36
+ export declare const LIST_DIRECTORY_DEFAULT_LIMIT = 200;
37
+ export declare const LIST_DIRECTORY_MAX_LIMIT = 1000;
38
+ export declare const SEARCH_DEFAULT_DEPTH = 8;
39
+ export declare const SEARCH_MAX_DEPTH = 16;
40
+ export declare const TEXT_SEARCH_MAX_FILES = 2000;
41
+ export declare const TEXT_SEARCH_MAX_FILE_BYTES: number;
42
+ export declare const TEXT_SEARCH_MAX_LINE_CHARS = 500;
43
+ export declare const TEXT_SEARCH_MAX_CONTEXT_LINES = 3;
44
+ export declare const BINARY_SNIFF_BYTES: number;
45
+ export declare const DEFAULT_DOWNLOAD_URL_ALLOWLIST: readonly string[];
46
+ export declare const DEFAULT_IGNORED_DIRECTORIES: readonly string[];
47
+ export declare const DEFAULT_IGNORED_FILE_PATTERNS: readonly string[];
48
+ export declare const WRITE_FUNCTION_CODES: readonly LocalFilesFunctionCode[];
49
+ export declare const SEARCH_FUNCTION_CODES: readonly LocalFilesFunctionCode[];
50
+ export declare const TRANSFER_FUNCTION_CODES: readonly LocalFilesFunctionCode[];
@@ -0,0 +1,11 @@
1
+ import { LocalFilesFunctionCode } from './constants';
2
+ import { ClientPluginCallback, ToolContext } from './types';
3
+ import { LocalWorkspace } from './workspace/LocalWorkspace';
4
+ export type LocalFilesHandler = (params: unknown, callback: ClientPluginCallback, context?: Partial<ToolContext>) => void;
5
+ export type LocalFilesPluginTable = Record<string, Record<LocalFilesFunctionCode, LocalFilesHandler>>;
6
+ export interface CreateLocalFilesPluginOptions {
7
+ pluginCode: string;
8
+ workspace: LocalWorkspace;
9
+ }
10
+ /** 组装内置本地文件插件表:`{ [pluginCode]: { [functionCode]: handler } }`。 */
11
+ export declare function createLocalFilesPlugin({ pluginCode, workspace, }: CreateLocalFilesPluginOptions): LocalFilesPluginTable;
@@ -0,0 +1,12 @@
1
+ import { LOCAL_PYTHON_FUNCTION_CODE } from './constants';
2
+ import { ClientPluginCallback, PythonApprovalHandler, ToolContext } from './types';
3
+ import { LocalWorkspace } from './workspace/LocalWorkspace';
4
+ export type LocalPythonHandler = (params: unknown, callback: ClientPluginCallback, context?: Partial<ToolContext>) => void;
5
+ export type LocalPythonPluginTable = Record<string, Record<typeof LOCAL_PYTHON_FUNCTION_CODE, LocalPythonHandler>>;
6
+ export interface CreateLocalPythonPluginOptions {
7
+ pluginCode: string;
8
+ workspace: LocalWorkspace;
9
+ onApprovalRequired?: PythonApprovalHandler;
10
+ }
11
+ /** 组装 run_python。配置合并时与文件工具放进同一个 pluginCode。 */
12
+ export declare function createLocalPythonPlugin({ pluginCode, workspace, onApprovalRequired, }: CreateLocalPythonPluginOptions): LocalPythonPluginTable;
@@ -0,0 +1,34 @@
1
+ export declare enum ToolCode {
2
+ Ok = 0,
3
+ BadRequest = 400,
4
+ Forbidden = 403,
5
+ NotFound = 404,
6
+ Timeout = 408,
7
+ Conflict = 409,
8
+ TooLarge = 413,
9
+ TooManyRequests = 429,
10
+ Cancelled = 499,
11
+ Internal = 500,
12
+ NotImplemented = 501
13
+ }
14
+ export type ToolErrorReason = 'workspace_not_granted' | 'path_outside_workspace' | 'sensitive_file' | 'user_rejected' | 'approval_unavailable' | 'url_not_allowed';
15
+ export interface ToolErrorData {
16
+ reason?: ToolErrorReason;
17
+ ruleId?: string;
18
+ currentHash?: string;
19
+ [key: string]: unknown;
20
+ }
21
+ export declare class ToolError extends Error {
22
+ readonly code: ToolCode;
23
+ readonly data?: ToolErrorData;
24
+ constructor(code: ToolCode, message: string, data?: ToolErrorData);
25
+ }
26
+ export declare const WORKSPACE_NOT_GRANTED_MESSAGE = "\u5C1A\u672A\u6388\u6743\u5DE5\u4F5C\u6587\u4EF6\u5939\uFF0C\u8BF7\u5148\u5728\u52A9\u624B\u4E2D\u9009\u62E9\u6216\u6062\u590D\u8BBF\u95EE\u5DE5\u4F5C\u6587\u4EF6\u5939\u3002";
27
+ export declare function workspaceNotGranted(): ToolError;
28
+ export declare function cancelledError(): ToolError;
29
+ export declare function throwIfAborted(signal?: AbortSignal): void;
30
+ /**
31
+ * 把任意异常转换为可回传给平台的 ToolError。
32
+ * FSA 抛出的 DOMException 可能带有系统路径等信息,因此只按 name 映射为固定文案。
33
+ */
34
+ export declare function toToolError(error: unknown): ToolError;
@@ -0,0 +1,6 @@
1
+ import { LocalWorkspace } from '../workspace/LocalWorkspace';
2
+ /**
3
+ * 监听宿主推送的工程目录。宿主发 granted 后挂上适配器,页面不再调用选目录框。
4
+ * 同一页面只保留一条连接。
5
+ */
6
+ export declare function connectHostBridge(workspace: LocalWorkspace): () => void;
@@ -0,0 +1,33 @@
1
+ /** 宿主与页面之间的通道名。根目录只由宿主设置,消息里不能带绝对路径。 */
2
+ export declare const HOST_CHANNEL = "glodon-workspace";
3
+ export interface HostWebView {
4
+ postMessage(message: unknown): void;
5
+ addEventListener(type: 'message', listener: (event: {
6
+ data: unknown;
7
+ }) => void): void;
8
+ removeEventListener(type: 'message', listener: (event: {
9
+ data: unknown;
10
+ }) => void): void;
11
+ }
12
+ export interface HostWorkspaceMessage {
13
+ channel: string;
14
+ type: 'workspace';
15
+ granted?: boolean;
16
+ displayName?: string;
17
+ }
18
+ export interface HostResponseMessage {
19
+ channel: string;
20
+ id: string;
21
+ ok?: boolean;
22
+ name?: string;
23
+ entries?: unknown;
24
+ entry?: unknown;
25
+ contentBase64?: string;
26
+ exitCode?: number;
27
+ timedOut?: boolean;
28
+ stdout?: string;
29
+ stderr?: string;
30
+ message?: string;
31
+ }
32
+ export declare function parseHostMessage(data: unknown): Record<string, unknown> | undefined;
33
+ export declare function getHostWebView(): HostWebView | undefined;
@@ -0,0 +1,21 @@
1
+ export * from './constants';
2
+ export * from './types';
3
+ export { ToolCode, ToolError, toToolError } from './errors';
4
+ export type { ToolErrorData, ToolErrorReason } from './errors';
5
+ export { BUILTIN_TOOL_SCHEMAS, LOCAL_FILE_TOOL_SCHEMAS, LOCAL_PYTHON_TOOL_SCHEMA } from './schemas';
6
+ export type { BuiltinToolSchema, JsonSchema, LocalFileToolSchema } from './schemas';
7
+ export { createLocalFilesPlugin } from './createLocalFilesPlugin';
8
+ export type { CreateLocalFilesPluginOptions, LocalFilesHandler, LocalFilesPluginTable, } from './createLocalFilesPlugin';
9
+ export { LocalWorkspace } from './workspace/LocalWorkspace';
10
+ export type { LocalWorkspaceOptions } from './workspace/LocalWorkspace';
11
+ export { createIndexedDbStore, createMemoryStore } from './workspace/handleStore';
12
+ export type { KeyValueStore } from './workspace/handleStore';
13
+ export type { WorkspaceEntry, WorkspaceFileAdapter, WriteOptions, WriteSource, } from './adapters/WorkspaceFileAdapter';
14
+ export { FileSystemAccessAdapter } from './adapters/FileSystemAccessAdapter';
15
+ export { MemoryWorkspaceAdapter } from './adapters/MemoryWorkspaceAdapter';
16
+ export type { FsaDirectoryHandle, ShowDirectoryPicker } from './adapters/fsaTypes';
17
+ export { createDefaultSessionFileTransfer } from './transfer/SessionFileTransfer';
18
+ export type { ResolvedDownload, SessionFileTransfer, UploadProgress, } from './transfer/SessionFileTransfer';
19
+ export { getDownloadUrlAllowlist, isDownloadUrlAllowed, } from './security/downloadUrlPolicy';
20
+ export { SDK_SENSITIVE_BASELINE } from './security/sensitiveFiles';
21
+ export type { SensitiveRule, SensitiveRuleInput } from './security/sensitiveFiles';
@@ -0,0 +1,3 @@
1
+ import { LocalFilesLimits } from './constants';
2
+ /** 产品配置只能把限额调小;非法值或大于默认值的配置按默认值处理。 */
3
+ export declare function resolveLimits(overrides?: Partial<LocalFilesLimits>): LocalFilesLimits;
@@ -0,0 +1,30 @@
1
+ import { LocalFilesFunctionCode, LOCAL_PYTHON_FUNCTION_CODE } from './constants';
2
+ export interface JsonSchema {
3
+ type?: 'object' | 'string' | 'integer' | 'number' | 'boolean' | 'array';
4
+ description?: string;
5
+ properties?: Record<string, JsonSchema>;
6
+ required?: string[];
7
+ items?: JsonSchema;
8
+ enum?: (string | number | boolean)[];
9
+ minimum?: number;
10
+ maximum?: number;
11
+ minLength?: number;
12
+ minItems?: number;
13
+ maxItems?: number;
14
+ oneOf?: JsonSchema[];
15
+ }
16
+ export interface BuiltinToolSchema {
17
+ functionCode: string;
18
+ name: string;
19
+ description: string;
20
+ parameters: JsonSchema;
21
+ }
22
+ export interface LocalFileToolSchema extends BuiltinToolSchema {
23
+ functionCode: LocalFilesFunctionCode;
24
+ }
25
+ /** 9 个工具的参数 Schema,同时作为平台注册时的草案。 */
26
+ export declare const LOCAL_FILE_TOOL_SCHEMAS: Record<LocalFilesFunctionCode, LocalFileToolSchema>;
27
+ /** run_python 的参数 Schema。与文件工具一起注册到同一个插件。 */
28
+ export declare const LOCAL_PYTHON_TOOL_SCHEMA: BuiltinToolSchema;
29
+ /** 文件工具和 run_python。平台上对应同一个插件。 */
30
+ export declare const BUILTIN_TOOL_SCHEMAS: Record<LocalFilesFunctionCode | typeof LOCAL_PYTHON_FUNCTION_CODE, BuiltinToolSchema>;
@@ -0,0 +1,4 @@
1
+ /** 有效 allowlist = 默认 `['glodon.com']` ∪ 追加项(去重、转小写)。 */
2
+ export declare function getDownloadUrlAllowlist(append?: string[]): string[];
3
+ export declare function isDownloadUrlAllowed(url: string, append?: string[]): boolean;
4
+ export declare function isDownloadUrlAllowedByList(url: string, allowlist: string[]): boolean;
@@ -0,0 +1,3 @@
1
+ export declare function globToRegExp(pattern: string, caseSensitive?: boolean): RegExp;
2
+ export declare function matchGlob(pattern: string, target: string, caseSensitive?: boolean): boolean;
3
+ export declare function basename(path: string): string;
@@ -0,0 +1,14 @@
1
+ export declare function assertGrantId(grantId: unknown): void;
2
+ export interface NormalizePathOptions {
3
+ /** 是否允许空字符串或 `.` 表示工作区根目录。 */
4
+ allowRoot?: boolean;
5
+ field?: string;
6
+ }
7
+ /**
8
+ * 把模型给出的路径规范化为 `a/b/c` 形式的工作区相对路径,根目录返回空字符串。
9
+ * 不合法的路径直接抛出 403,调用方不需要再做二次判断。
10
+ */
11
+ export declare function normalizeWorkspacePath(input: unknown, { allowRoot, field }?: NormalizePathOptions): string;
12
+ export declare function splitPath(path: string): string[];
13
+ export declare function parentPath(path: string): string;
14
+ export declare function joinPath(base: string, name: string): string;
@@ -0,0 +1,23 @@
1
+ export type SensitiveOperation = 'read' | 'write' | 'search';
2
+ export interface SensitiveRule {
3
+ id: string;
4
+ /** glob,匹配工作区相对路径,分隔符为 `/`。 */
5
+ pattern: string;
6
+ /** basename:只比较文件名(默认);path:比较整段相对路径。 */
7
+ match?: 'basename' | 'path';
8
+ /** 默认三种操作都拦截。 */
9
+ operations?: SensitiveOperation[];
10
+ reason?: string;
11
+ source: 'sdk-baseline' | 'product' | 'enterprise';
12
+ }
13
+ export type SensitiveRuleInput = Omit<SensitiveRule, 'source'> & {
14
+ source?: 'product' | 'enterprise';
15
+ };
16
+ export declare const SDK_SENSITIVE_BASELINE: readonly SensitiveRule[];
17
+ export declare class SensitiveFilePolicy {
18
+ readonly rules: readonly SensitiveRule[];
19
+ constructor(append?: SensitiveRuleInput[]);
20
+ match(path: string, operation: SensitiveOperation): SensitiveRule | null;
21
+ isSensitive(path: string): boolean;
22
+ static reasonOf(rule: SensitiveRule): string;
23
+ }
@@ -0,0 +1,7 @@
1
+ import { ListDirectoryInput, ListDirectoryOutput, ReadFileInput, ReadFileOutput, SearchFilesInput, SearchFilesOutput, SearchTextInput, SearchTextOutput, StatFileInput, StatFileOutput } from '../types';
2
+ import { ToolImplementation } from './runtime';
3
+ export declare const listDirectory: ToolImplementation<ListDirectoryInput, ListDirectoryOutput>;
4
+ export declare const readFile: ToolImplementation<ReadFileInput, ReadFileOutput>;
5
+ export declare const statFile: ToolImplementation<StatFileInput, StatFileOutput>;
6
+ export declare const searchFiles: ToolImplementation<SearchFilesInput, SearchFilesOutput>;
7
+ export declare const searchText: ToolImplementation<SearchTextInput, SearchTextOutput>;
@@ -0,0 +1,43 @@
1
+ import { LocalFilesLimits, LocalFilesFunctionCode } from '../constants';
2
+ import { WorkspaceEntry, WorkspaceFileAdapter } from '../adapters/WorkspaceFileAdapter';
3
+ import { SensitiveFilePolicy, SensitiveOperation } from '../security/sensitiveFiles';
4
+ import { SessionFileTransfer } from '../transfer/SessionFileTransfer';
5
+ import { ApprovalPreview, ToolContext, ToolProgressEvent } from '../types';
6
+ import { ToolError } from '../errors';
7
+ export interface ToolRuntime {
8
+ adapter: WorkspaceFileAdapter;
9
+ workspaceName: string;
10
+ limits: LocalFilesLimits;
11
+ sensitive: SensitiveFilePolicy;
12
+ downloadUrlAllowlist: string[];
13
+ allowWorkspaceWideTextSearch: boolean;
14
+ transfer: SessionFileTransfer;
15
+ fetch: typeof fetch;
16
+ context: ToolContext;
17
+ signal: AbortSignal;
18
+ /** 请求用户确认;拒绝、无确认能力或被取消时抛出 ToolError。等待期间不计入工具超时。 */
19
+ requestApproval(path: string, preview: ApprovalPreview): Promise<void>;
20
+ progress(event: Pick<ToolProgressEvent, 'stage' | 'loaded' | 'total' | 'path'>): void;
21
+ }
22
+ export interface ToolOutput<T> {
23
+ data: T;
24
+ truncated?: boolean;
25
+ warnings?: string[];
26
+ }
27
+ export type ToolImplementation<I = any, O = unknown> = (input: I, runtime: ToolRuntime) => Promise<ToolOutput<O>>;
28
+ export type ToolTable = Record<LocalFilesFunctionCode, ToolImplementation>;
29
+ export declare function assertNotSensitive(runtime: ToolRuntime, path: string, operation: SensitiveOperation): void;
30
+ /** 返回目标的元数据;不存在时返回 null,其他错误照常抛出。 */
31
+ export declare function statOrNull(adapter: WorkspaceFileAdapter, path: string): Promise<WorkspaceEntry | null>;
32
+ export declare function requireFile(adapter: WorkspaceFileAdapter, path: string): Promise<WorkspaceEntry>;
33
+ export declare function sha256(data: ArrayBuffer | Uint8Array): Promise<string>;
34
+ export declare function readBytes(blob: Blob): Promise<Uint8Array<ArrayBuffer>>;
35
+ export declare function looksBinary(bytes: Uint8Array): boolean;
36
+ export declare function blobLooksBinary(blob: Blob): Promise<boolean>;
37
+ export declare function hasUtf8Bom(bytes: Uint8Array): boolean;
38
+ /** 严格 UTF-8 解码,失败时抛出 400,用于写入类工具避免改变原文件编码。 */
39
+ export declare function decodeUtf8Strict(bytes: Uint8Array): string;
40
+ export declare function utf8ByteLength(text: string): number;
41
+ export declare function yieldToMain(): Promise<void>;
42
+ export declare function describeSize(bytes: number): string;
43
+ export declare function tooLarge(limitBytes: number, what?: string): ToolError;
@@ -0,0 +1,4 @@
1
+ import { DownloadFileInput, DownloadFileOutput, UploadFileInput, UploadFileOutput } from '../types';
2
+ import { ToolImplementation } from './runtime';
3
+ export declare const uploadFile: ToolImplementation<UploadFileInput, UploadFileOutput>;
4
+ export declare const downloadFile: ToolImplementation<DownloadFileInput, DownloadFileOutput>;
@@ -0,0 +1,4 @@
1
+ import { ApplyPatchInput, WriteFileInput, WriteFileOutput, WriteResultOutput } from '../types';
2
+ import { ToolImplementation } from './runtime';
3
+ export declare const applyPatch: ToolImplementation<ApplyPatchInput, WriteResultOutput>;
4
+ export declare const writeFile: ToolImplementation<WriteFileInput, WriteFileOutput>;
@@ -0,0 +1,40 @@
1
+ import { CVForceApi } from '@glodon-aiot/apis';
2
+ import { DownloadSource, ToolContext } from '../types';
3
+ /** aishop `/v1/files`。上传返回的 url 会放进工具结果交给模型;进度事件和错误信息里不要带它。 */
4
+ export interface PlatformFileClient {
5
+ postFile(file: File, onProgress?: (loaded: number, total: number) => void): Promise<{
6
+ id: string;
7
+ bytes?: number;
8
+ url?: string;
9
+ }>;
10
+ getFile(id: string): Promise<{
11
+ url?: string;
12
+ bytes?: number;
13
+ } | undefined>;
14
+ }
15
+ export interface UploadProgress {
16
+ loaded: number;
17
+ total: number;
18
+ }
19
+ export interface ResolvedDownload {
20
+ url: string;
21
+ headers?: Record<string, string>;
22
+ name?: string;
23
+ size?: number;
24
+ }
25
+ /** upload_file / download_file 与平台交互的部分,可通过配置整体或部分替换。 */
26
+ export interface SessionFileTransfer {
27
+ upload(file: File, context: ToolContext, onProgress?: (progress: UploadProgress) => void): Promise<{
28
+ fileId: string;
29
+ url: string;
30
+ }>;
31
+ resolveDownload(source: Exclude<DownloadSource, {
32
+ type: 'url';
33
+ }>, context: ToolContext): Promise<ResolvedDownload>;
34
+ }
35
+ /**
36
+ * 默认实现。
37
+ * 上传走 aishop `POST /v1/files`,fileId 与预签名 url 都返回给调用方。
38
+ * 下载平台文件走 `GET /v1/files/{id}` 换链接后再拉取;会话文件仍走会话文件详情。
39
+ */
40
+ export declare function createDefaultSessionFileTransfer(getApi: () => CVForceApi | undefined, getPlatformFiles?: () => PlatformFileClient | undefined): SessionFileTransfer;