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

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 (96) hide show
  1. package/README.md +572 -98
  2. package/dist/es/AgentSession.mjs +230 -165
  3. package/dist/es/BotClient.mjs +186 -136
  4. package/dist/es/Config.mjs +89 -26
  5. package/dist/es/Session.mjs +12 -0
  6. package/dist/es/api/index.mjs +42 -33
  7. package/dist/es/builtinTools/browserRuntime/BrowserCommandRunner.mjs +201 -0
  8. package/dist/es/builtinTools/browserRuntime/PythonRunner.mjs +356 -0
  9. package/dist/es/builtinTools/browserRuntime/WorkspaceBashFs.mjs +350 -0
  10. package/dist/es/builtinTools/browserRuntime/assets.mjs +9 -0
  11. package/dist/es/builtinTools/browserRuntime/loadBash.mjs +17 -0
  12. package/dist/es/builtinTools/browserRuntime/pyodideRunner.py.mjs +96 -0
  13. package/dist/es/builtinTools/browserRuntime/pyodideWorker.mjs +242 -0
  14. package/dist/es/builtinTools/command.mjs +56 -0
  15. package/dist/es/builtinTools/constants.mjs +10 -0
  16. package/dist/es/builtinTools/createBuiltinToolsPlugin.mjs +236 -0
  17. package/dist/es/builtinTools/overview.mjs +77 -0
  18. package/dist/es/builtinTools/paths.mjs +63 -0
  19. package/dist/es/builtinTools/schemas.mjs +216 -0
  20. package/dist/es/builtinTools/tools.mjs +471 -0
  21. package/dist/es/index.mjs +69 -9
  22. package/dist/es/localFiles/adapters/FileSystemAccessAdapter.mjs +264 -0
  23. package/dist/es/localFiles/adapters/HostBridgeAdapter.mjs +233 -0
  24. package/dist/es/localFiles/adapters/MemoryWorkspaceAdapter.mjs +197 -0
  25. package/dist/es/localFiles/adapters/WorkspaceFileAdapter.mjs +54 -0
  26. package/dist/es/localFiles/adapters/fsaTypes.mjs +9 -0
  27. package/dist/es/localFiles/constants.mjs +47 -0
  28. package/dist/es/localFiles/createLocalFilesPlugin.mjs +255 -0
  29. package/dist/es/localFiles/errors.mjs +57 -0
  30. package/dist/es/localFiles/host/connectHostBridge.mjs +54 -0
  31. package/dist/es/localFiles/host/protocol.mjs +27 -0
  32. package/dist/es/localFiles/limits.mjs +22 -0
  33. package/dist/es/localFiles/schemas.mjs +312 -0
  34. package/dist/es/localFiles/security/downloadUrlPolicy.mjs +39 -0
  35. package/dist/es/localFiles/security/glob.mjs +28 -0
  36. package/dist/es/localFiles/security/pathPolicy.mjs +59 -0
  37. package/dist/es/localFiles/security/sensitiveFiles.mjs +115 -0
  38. package/dist/es/localFiles/tools/readTools.mjs +333 -0
  39. package/dist/es/localFiles/tools/runtime.mjs +108 -0
  40. package/dist/es/localFiles/tools/transferTools.mjs +228 -0
  41. package/dist/es/localFiles/tools/writeTools.mjs +173 -0
  42. package/dist/es/localFiles/transfer/SessionFileTransfer.mjs +111 -0
  43. package/dist/es/localFiles/validate.mjs +66 -0
  44. package/dist/es/localFiles/workspace/LocalWorkspace.mjs +358 -0
  45. package/dist/es/localFiles/workspace/handleStore.mjs +79 -0
  46. package/dist/es/localFiles/workspace/watchDirectory.mjs +38 -0
  47. package/dist/es/package.json.mjs +38 -29
  48. package/dist/lib/index.js +373 -5
  49. package/dist/src/AgentSession.d.ts +9 -0
  50. package/dist/src/BotClient.d.ts +12 -2
  51. package/dist/src/Config.d.ts +22 -0
  52. package/dist/src/Session.d.ts +5 -1
  53. package/dist/src/api/index.d.ts +3 -1
  54. package/dist/src/builtinTools/browserRuntime/BrowserCommandRunner.d.ts +26 -0
  55. package/dist/src/builtinTools/browserRuntime/PythonRunner.d.ts +67 -0
  56. package/dist/src/builtinTools/browserRuntime/WorkspaceBashFs.d.ts +51 -0
  57. package/dist/src/builtinTools/browserRuntime/assets.d.ts +13 -0
  58. package/dist/src/builtinTools/browserRuntime/loadBash.d.ts +3 -0
  59. package/dist/src/builtinTools/browserRuntime/pyodideWorker.d.ts +44 -0
  60. package/dist/src/builtinTools/command.d.ts +26 -0
  61. package/dist/src/builtinTools/constants.d.ts +17 -0
  62. package/dist/src/builtinTools/createBuiltinToolsPlugin.d.ts +11 -0
  63. package/dist/src/builtinTools/overview.d.ts +5 -0
  64. package/dist/src/builtinTools/paths.d.ts +15 -0
  65. package/dist/src/builtinTools/schemas.d.ts +3 -0
  66. package/dist/src/builtinTools/tools.d.ts +60 -0
  67. package/dist/src/index.d.ts +4 -2
  68. package/dist/src/localFiles/adapters/FileSystemAccessAdapter.d.ts +20 -0
  69. package/dist/src/localFiles/adapters/HostBridgeAdapter.d.ts +43 -0
  70. package/dist/src/localFiles/adapters/MemoryWorkspaceAdapter.d.ts +21 -0
  71. package/dist/src/localFiles/adapters/WorkspaceFileAdapter.d.ts +40 -0
  72. package/dist/src/localFiles/adapters/fsaTypes.d.ts +41 -0
  73. package/dist/src/localFiles/constants.d.ts +51 -0
  74. package/dist/src/localFiles/createLocalFilesPlugin.d.ts +11 -0
  75. package/dist/src/localFiles/createLocalPythonPlugin.d.ts +12 -0
  76. package/dist/src/localFiles/errors.d.ts +34 -0
  77. package/dist/src/localFiles/host/connectHostBridge.d.ts +6 -0
  78. package/dist/src/localFiles/host/protocol.d.ts +46 -0
  79. package/dist/src/localFiles/index.d.ts +22 -0
  80. package/dist/src/localFiles/limits.d.ts +3 -0
  81. package/dist/src/localFiles/schemas.d.ts +29 -0
  82. package/dist/src/localFiles/security/downloadUrlPolicy.d.ts +4 -0
  83. package/dist/src/localFiles/security/glob.d.ts +3 -0
  84. package/dist/src/localFiles/security/pathPolicy.d.ts +14 -0
  85. package/dist/src/localFiles/security/sensitiveFiles.d.ts +23 -0
  86. package/dist/src/localFiles/tools/readTools.d.ts +7 -0
  87. package/dist/src/localFiles/tools/runtime.d.ts +43 -0
  88. package/dist/src/localFiles/tools/transferTools.d.ts +4 -0
  89. package/dist/src/localFiles/tools/writeTools.d.ts +4 -0
  90. package/dist/src/localFiles/transfer/SessionFileTransfer.d.ts +40 -0
  91. package/dist/src/localFiles/types.d.ts +319 -0
  92. package/dist/src/localFiles/validate.d.ts +2 -0
  93. package/dist/src/localFiles/workspace/LocalWorkspace.d.ts +111 -0
  94. package/dist/src/localFiles/workspace/handleStore.d.ts +11 -0
  95. package/dist/src/localFiles/workspace/watchDirectory.d.ts +7 -0
  96. package/package.json +13 -4
@@ -0,0 +1,41 @@
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
+ /** Chromium 部分版本支持;目录移动支持更晚。 */
15
+ move?(destination: FsaDirectoryHandle, name: string): Promise<void>;
16
+ }
17
+ export interface FsaFileHandle extends FsaHandleBase {
18
+ readonly kind: 'file';
19
+ getFile(): Promise<File>;
20
+ createWritable(options?: {
21
+ keepExistingData?: boolean;
22
+ }): Promise<FsaWritableStream>;
23
+ }
24
+ export interface FsaDirectoryHandle extends FsaHandleBase {
25
+ readonly kind: 'directory';
26
+ getDirectoryHandle(name: string, options?: {
27
+ create?: boolean;
28
+ }): Promise<FsaDirectoryHandle>;
29
+ getFileHandle(name: string, options?: {
30
+ create?: boolean;
31
+ }): Promise<FsaFileHandle>;
32
+ removeEntry(name: string, options?: {
33
+ recursive?: boolean;
34
+ }): Promise<void>;
35
+ values(): AsyncIterableIterator<FsaDirectoryHandle | FsaFileHandle>;
36
+ }
37
+ export type ShowDirectoryPicker = (options?: {
38
+ id?: string;
39
+ mode?: FsaPermissionMode;
40
+ }) => Promise<FsaDirectoryHandle>;
41
+ export declare function getNativeDirectoryPicker(): ShowDirectoryPicker | undefined;
@@ -0,0 +1,51 @@
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
+ /** 平台插件编码。与内置工具 OpenAPI 的 pluginCode 一致。 */
9
+ export declare const BUILTIN_TOOLS_PLUGIN_CODE = "builtin_tools";
10
+ export declare const BUILTIN_TOOLS_PLUGIN_CODES: Record<Env, string>;
11
+ /** 与 `BUILTIN_TOOLS_PLUGIN_CODES` 相同。文件工具和脚本工具共用一个插件编码。 */
12
+ export declare const LOCAL_FILES_PLUGIN_CODES: Record<Env, string>;
13
+ /** 本地 Python 脚本。与文件工具注册在同一个插件里。 */
14
+ export declare const LOCAL_PYTHON_FUNCTION_CODE = "run_python";
15
+ /** 与 `BUILTIN_TOOLS_PLUGIN_CODES` 相同。未单独配置时跟随文件工具的 pluginCode。 */
16
+ export declare const LOCAL_PYTHON_PLUGIN_CODES: Record<Env, string>;
17
+ export declare const PYTHON_DEFAULT_TIMEOUT_MS = 20000;
18
+ export declare const PYTHON_MAX_TIMEOUT_MS = 120000;
19
+ export declare const PYTHON_MAX_ARGS = 16;
20
+ export declare const WORKSPACE_GRANT_ID = "current-workspace";
21
+ export declare const KiB = 1024;
22
+ export declare const MiB: number;
23
+ /** 单文件上传/下载上限(MB),与 UI 拖拽上传共用。 */
24
+ export declare const TRANSFER_FILE_SIZE_LIMIT_MB = 50;
25
+ export interface LocalFilesLimits {
26
+ maxReadBytes: number;
27
+ maxWriteBytes: number;
28
+ maxSearchResults: number;
29
+ maxConcurrentRequests: number;
30
+ maxTransferBytes: number;
31
+ toolTimeoutMs: number;
32
+ searchTimeoutMs: number;
33
+ transferTimeoutMs: number;
34
+ approvalTimeoutMs: number;
35
+ }
36
+ export declare const DEFAULT_LIMITS: Readonly<LocalFilesLimits>;
37
+ export declare const LIST_DIRECTORY_DEFAULT_LIMIT = 200;
38
+ export declare const LIST_DIRECTORY_MAX_LIMIT = 1000;
39
+ export declare const SEARCH_DEFAULT_DEPTH = 8;
40
+ export declare const SEARCH_MAX_DEPTH = 16;
41
+ export declare const TEXT_SEARCH_MAX_FILES = 2000;
42
+ export declare const TEXT_SEARCH_MAX_FILE_BYTES: number;
43
+ export declare const TEXT_SEARCH_MAX_LINE_CHARS = 500;
44
+ export declare const TEXT_SEARCH_MAX_CONTEXT_LINES = 3;
45
+ export declare const BINARY_SNIFF_BYTES: number;
46
+ export declare const DEFAULT_DOWNLOAD_URL_ALLOWLIST: readonly string[];
47
+ export declare const DEFAULT_IGNORED_DIRECTORIES: readonly string[];
48
+ export declare const DEFAULT_IGNORED_FILE_PATTERNS: readonly string[];
49
+ export declare const WRITE_FUNCTION_CODES: readonly LocalFilesFunctionCode[];
50
+ export declare const SEARCH_FUNCTION_CODES: readonly LocalFilesFunctionCode[];
51
+ 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,46 @@
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
+ /**
13
+ * 宿主声明的能力。
14
+ * - `sandbox-exec`:命令交给 SDK 沙箱包执行,支持 `exec` 消息。
15
+ * - `fs-mutate`:支持 `mkdir`、`remove`、`move` 消息。
16
+ */
17
+ export type HostCapability = 'sandbox-exec' | 'fs-mutate';
18
+ /** SDK 支持的沙箱包协议版本。宿主声明的 sandboxProtocol 不同时不使用宿主沙箱。 */
19
+ export declare const SANDBOX_PROTOCOL = 1;
20
+ export interface HostWorkspaceMessage {
21
+ channel: string;
22
+ type: 'workspace';
23
+ granted?: boolean;
24
+ displayName?: string;
25
+ capabilities?: HostCapability[];
26
+ sandboxVersion?: string;
27
+ sandboxProtocol?: number;
28
+ }
29
+ export interface HostResponseMessage {
30
+ channel: string;
31
+ id: string;
32
+ ok?: boolean;
33
+ name?: string;
34
+ entries?: unknown;
35
+ entry?: unknown;
36
+ contentBase64?: string;
37
+ exitCode?: number;
38
+ timedOut?: boolean;
39
+ stdout?: string;
40
+ stderr?: string;
41
+ /** shell 结束后的工作区相对目录。 */
42
+ cwd?: string;
43
+ message?: string;
44
+ }
45
+ export declare function parseHostMessage(data: unknown): Record<string, unknown> | undefined;
46
+ export declare function getHostWebView(): HostWebView | undefined;
@@ -0,0 +1,22 @@
1
+ export * from './constants';
2
+ export * from './types';
3
+ export { ToolCode, ToolError, toToolError } from './errors';
4
+ export type { ToolErrorData, ToolErrorReason } from './errors';
5
+ export { LOCAL_FILE_TOOL_SCHEMAS, LOCAL_PYTHON_TOOL_SCHEMA } from './schemas';
6
+ export { BUILTIN_TOOL_SCHEMAS } from '../builtinTools/schemas';
7
+ export type { BuiltinToolSchema, JsonSchema, LocalFileToolSchema } from './schemas';
8
+ export { createLocalFilesPlugin } from './createLocalFilesPlugin';
9
+ export type { CreateLocalFilesPluginOptions, LocalFilesHandler, LocalFilesPluginTable, } from './createLocalFilesPlugin';
10
+ export { LocalWorkspace } from './workspace/LocalWorkspace';
11
+ export type { LocalWorkspaceOptions } from './workspace/LocalWorkspace';
12
+ export { createIndexedDbStore, createMemoryStore } from './workspace/handleStore';
13
+ export type { KeyValueStore } from './workspace/handleStore';
14
+ export type { RemoveOptions, WorkspaceEntry, WorkspaceFileAdapter, WriteOptions, WriteSource, } from './adapters/WorkspaceFileAdapter';
15
+ export { FileSystemAccessAdapter } from './adapters/FileSystemAccessAdapter';
16
+ export { MemoryWorkspaceAdapter } from './adapters/MemoryWorkspaceAdapter';
17
+ export type { FsaDirectoryHandle, ShowDirectoryPicker } from './adapters/fsaTypes';
18
+ export { createDefaultSessionFileTransfer } from './transfer/SessionFileTransfer';
19
+ export type { ResolvedDownload, SessionFileTransfer, UploadProgress, } from './transfer/SessionFileTransfer';
20
+ export { getDownloadUrlAllowlist, isDownloadUrlAllowed, } from './security/downloadUrlPolicy';
21
+ export { SDK_SENSITIVE_BASELINE } from './security/sensitiveFiles';
22
+ 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,29 @@
1
+ import { LocalFilesFunctionCode } 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
+ maxLength?: number;
13
+ minItems?: number;
14
+ maxItems?: number;
15
+ oneOf?: JsonSchema[];
16
+ }
17
+ export interface BuiltinToolSchema {
18
+ functionCode: string;
19
+ name: string;
20
+ description: string;
21
+ parameters: JsonSchema;
22
+ }
23
+ export interface LocalFileToolSchema extends BuiltinToolSchema {
24
+ functionCode: LocalFilesFunctionCode;
25
+ }
26
+ /** 9 个工具的参数 Schema,同时作为平台注册时的草案。 */
27
+ export declare const LOCAL_FILE_TOOL_SCHEMAS: Record<LocalFilesFunctionCode, LocalFileToolSchema>;
28
+ /** run_python 的参数 Schema。与文件工具一起注册到同一个插件。 */
29
+ export declare const LOCAL_PYTHON_TOOL_SCHEMA: 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;