@alfe.ai/openclaw-teams 0.0.44 → 0.0.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/plugin.d.cts +1 -0
- package/dist/plugin.d.cts.map +1 -1
- package/dist/plugin.d.ts +1 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin2.cjs +5 -1
- package/dist/plugin2.js +5 -1
- package/dist/plugin2.js.map +1 -1
- package/package.json +2 -2
package/dist/plugin.d.cts
CHANGED
package/dist/plugin.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.cts","names":["KitLogger","ToolResult","ToolDef","TParameters","Record","Promise","PublicToolError","Error","publicToolError","ok","errResult","defineTool","IpcResponse","IpcClient","IpcModule","ConnectToDaemonOptions","ConnectToDaemonDependencies","connectToDaemon","ResolveOpenClawSdkOptions","ResolveOpenClawSdkDependencies","resolveOpenClawSdk","T","getActivationKey","isActivated","resetActivation","guardedStart"],"sources":["../../openclaw-plugin-kit/dist/index.d.ts","../src/types.ts","../src/plugin.ts"],"sourcesContent":["//#region src/types.d.ts\n/**\n * Minimal logger contract shared by every helper in the kit.\n *\n * Deliberately the *narrowest* shape in the fleet: some plugins declare\n * variadic loggers (`info(msg: string, ...args: unknown[])`), others\n * single-arg (`info(msg: string)`). Both are assignable to this. The kit\n * only ever calls with a single string.\n */\ninterface KitLogger {\n info(msg: string): void;\n warn(msg: string): void;\n error(msg: string): void;\n debug(msg: string): void;\n}\n//# sourceMappingURL=types.d.ts.map\n//#endregion\n//#region src/tools.d.ts\n/** Shape returned to OpenClaw from a tool `execute`. */\ninterface ToolResult {\n content: {\n type: \"text\";\n text: string;\n }[];\n details: unknown;\n isError?: boolean;\n}\ninterface ToolDef<TParameters = unknown> {\n name: string;\n description: string;\n label: string;\n parameters: TParameters;\n execute: (toolCallId: string, params: Record<string, unknown>) => Promise<ToolResult>;\n}\n/** Deliberately model-safe validation/usage failure. Other exceptions stay private. */\ndeclare class PublicToolError extends Error {\n readonly name = \"PublicToolError\";\n}\ndeclare function publicToolError(message: string): PublicToolError;\n/** Wrap bounded JSON in the OpenClaw tool-result envelope. */\ndeclare function ok(data: unknown): ToolResult;\n/** Wrap an explicitly public error in a captured OpenClaw error envelope. */\ndeclare function errResult(message: string): ToolResult;\n/**\n * Define a tool whose unexpected exceptions never expose provider, filesystem,\n * credential, or transport diagnostics to the model. Throw `PublicToolError`\n * only for a message deliberately safe for model display.\n */\ndeclare function defineTool<TParameters>(def: {\n name: string;\n description: string;\n parameters: TParameters;\n handler: (params: Record<string, unknown>) => Promise<unknown>;\n}): ToolDef<TParameters>;\n//# sourceMappingURL=tools.d.ts.map\n//#endregion\n//#region src/daemon.d.ts\ninterface IpcResponse {\n ok: boolean;\n error?: {\n message?: string;\n };\n [key: string]: unknown;\n}\ninterface IpcClient {\n on(event: string, handler: (...args: unknown[]) => void): void;\n request(method: string, params: Record<string, unknown>): Promise<IpcResponse>;\n start(): void;\n stop(): void;\n}\ninterface IpcModule {\n IPCClient: new (socketPath: string, log: KitLogger) => IpcClient;\n}\ninterface ConnectToDaemonOptions {\n pluginId: string;\n capabilities?: readonly string[];\n onMessage?: (msg: Record<string, unknown>) => void;\n standaloneNote?: string;\n}\ninterface ConnectToDaemonDependencies {\n loadIpcModule?: () => Promise<IpcModule>;\n}\ndeclare function connectToDaemon(socketPath: string, log: KitLogger, options: ConnectToDaemonOptions, dependencies?: ConnectToDaemonDependencies): Promise<IpcClient | null>;\n//#endregion\n//#region src/sdk.d.ts\ninterface ResolveOpenClawSdkOptions {\n specifier?: string;\n exportName?: string;\n unresolvableNote?: string;\n}\ninterface ResolveOpenClawSdkDependencies {\n anchors?: readonly string[];\n globalPackageJsonPath?: string;\n requireFrom?: (anchor: string) => (specifier: string) => unknown;\n}\ndeclare function resolveOpenClawSdk<T = unknown>(log: KitLogger, options?: ResolveOpenClawSdkOptions, dependencies?: ResolveOpenClawSdkDependencies): T | null;\n//# sourceMappingURL=sdk.d.ts.map\n\n//#endregion\n//#region src/activation.d.ts\n/**\n * Canonical activation-flag key for a plugin: `__alfe<Name>PluginActivated`.\n *\n * Accepts a short name (`\"google\"`, `\"google-chat\"`) or a full package name\n * (`\"@alfe.ai/openclaw-teams\"`); scope + `openclaw-` prefix are stripped\n * and the remainder PascalCased:\n *\n * getActivationKey(\"google\") → \"__alfeGooglePluginActivated\"\n * getActivationKey(\"google-chat\") → \"__alfeGoogleChatPluginActivated\"\n * getActivationKey(\"@alfe.ai/openclaw-teams\") → \"__alfeTeamsPluginActivated\"\n */\ndeclare function getActivationKey(name: string): string;\n/** True when the activation flag for `key` is currently set. */\ndeclare function isActivated(key: string): boolean;\n/**\n * Clear the activation flag so a later start can run again.\n *\n * Call this LAST in stop/deactivate paths — after side effects are stopped\n * (see the ordering rule in the module doc). Also exported for soft-failure\n * paths inside a `guardedStart` fn that want to log at a custom level and\n * return normally instead of throwing.\n */\ndeclare function resetActivation(key: string): void;\n/**\n * Run a service start exactly once per activation cycle.\n *\n * - If the flag is already set, logs at debug and returns `false` (skipped).\n * - Otherwise sets the flag and runs `fn`.\n * - If `fn` throws synchronously OR returns a promise that rejects, the\n * flag is RESET (so a later activate can retry) and the error is logged.\n * Errors are not rethrown — matching fleet behavior where a failed start\n * must never crash the host's plugin loader.\n *\n * Returns `true` when the start was initiated (even if an async portion\n * later fails), `false` when skipped or when `fn` threw synchronously.\n *\n * Note: cleaning up partial side effects on failure is `fn`'s job (throw\n * only after tearing down what was started); the kit only guarantees the\n * flag reset happens after `fn` has failed — i.e. after `fn`'s own cleanup.\n */\ndeclare function guardedStart(key: string, log: KitLogger, fn: () => void | Promise<void>): boolean;\n//# sourceMappingURL=activation.d.ts.map\n\n//#endregion\nexport { type ConnectToDaemonDependencies, type ConnectToDaemonOptions, type IpcClient, type IpcResponse, type KitLogger, PublicToolError, type ResolveOpenClawSdkDependencies, type ResolveOpenClawSdkOptions, type ToolDef, type ToolResult, connectToDaemon, defineTool, errResult, getActivationKey, guardedStart, isActivated, ok, publicToolError, resetActivation, resolveOpenClawSdk };\n//# sourceMappingURL=index.d.ts.map"],"mappings":";;;;;;UAmBUC,UAAAA;;;;;;;;UAQAC;;;;cAIIC;wCAC0BC,4BAA4BC,QAAQJ;;;;;AAblEA,UCjBO,MAAA,CDiBG;EAQVC,IAAAA,CAAAA,OAAO,EAAA,MAAA,EAAA,GAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA;EAAA,IAAA,CAAA,OAAA,EAAA,MAAA,EAAA,GAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA;OAIHC,CAAAA,OAAAA,EAAAA,MAAAA,EAAAA,GAAAA,IAAAA,EAAAA,OAAAA,EAAAA,CAAAA,EAAAA,IAAAA;OAC0BC,CAAAA,OAAAA,EAAAA,MAAAA,EAAAA,GAAAA,IAAAA,EAAAA,OAAAA,EAAAA,CAAAA,EAAAA,IAAAA;;UCVvB,iBAAA;UACP;qBACW;;;;;;EDLXH,
|
|
1
|
+
{"version":3,"file":"plugin.d.cts","names":["KitLogger","ToolResult","ToolDef","TParameters","Record","Promise","PublicToolError","Error","publicToolError","ok","errResult","defineTool","IpcResponse","IpcClient","IpcModule","ConnectToDaemonOptions","ConnectToDaemonDependencies","connectToDaemon","ResolveOpenClawSdkOptions","ResolveOpenClawSdkDependencies","resolveOpenClawSdk","T","getActivationKey","isActivated","resetActivation","guardedStart"],"sources":["../../openclaw-plugin-kit/dist/index.d.ts","../src/types.ts","../src/plugin.ts"],"sourcesContent":["//#region src/types.d.ts\n/**\n * Minimal logger contract shared by every helper in the kit.\n *\n * Deliberately the *narrowest* shape in the fleet: some plugins declare\n * variadic loggers (`info(msg: string, ...args: unknown[])`), others\n * single-arg (`info(msg: string)`). Both are assignable to this. The kit\n * only ever calls with a single string.\n */\ninterface KitLogger {\n info(msg: string): void;\n warn(msg: string): void;\n error(msg: string): void;\n debug(msg: string): void;\n}\n//# sourceMappingURL=types.d.ts.map\n//#endregion\n//#region src/tools.d.ts\n/** Shape returned to OpenClaw from a tool `execute`. */\ninterface ToolResult {\n content: {\n type: \"text\";\n text: string;\n }[];\n details: unknown;\n isError?: boolean;\n}\ninterface ToolDef<TParameters = unknown> {\n name: string;\n description: string;\n label: string;\n parameters: TParameters;\n execute: (toolCallId: string, params: Record<string, unknown>) => Promise<ToolResult>;\n}\n/** Deliberately model-safe validation/usage failure. Other exceptions stay private. */\ndeclare class PublicToolError extends Error {\n readonly name = \"PublicToolError\";\n}\ndeclare function publicToolError(message: string): PublicToolError;\n/** Wrap bounded JSON in the OpenClaw tool-result envelope. */\ndeclare function ok(data: unknown): ToolResult;\n/** Wrap an explicitly public error in a captured OpenClaw error envelope. */\ndeclare function errResult(message: string): ToolResult;\n/**\n * Define a tool whose unexpected exceptions never expose provider, filesystem,\n * credential, or transport diagnostics to the model. Throw `PublicToolError`\n * only for a message deliberately safe for model display.\n */\ndeclare function defineTool<TParameters>(def: {\n name: string;\n description: string;\n parameters: TParameters;\n handler: (params: Record<string, unknown>) => Promise<unknown>;\n}): ToolDef<TParameters>;\n//# sourceMappingURL=tools.d.ts.map\n//#endregion\n//#region src/daemon.d.ts\ninterface IpcResponse {\n ok: boolean;\n error?: {\n message?: string;\n };\n [key: string]: unknown;\n}\ninterface IpcClient {\n on(event: string, handler: (...args: unknown[]) => void): void;\n request(method: string, params: Record<string, unknown>): Promise<IpcResponse>;\n start(): void;\n stop(): void;\n}\ninterface IpcModule {\n IPCClient: new (socketPath: string, log: KitLogger) => IpcClient;\n}\ninterface ConnectToDaemonOptions {\n pluginId: string;\n capabilities?: readonly string[];\n onMessage?: (msg: Record<string, unknown>) => void;\n standaloneNote?: string;\n}\ninterface ConnectToDaemonDependencies {\n loadIpcModule?: () => Promise<IpcModule>;\n}\ndeclare function connectToDaemon(socketPath: string, log: KitLogger, options: ConnectToDaemonOptions, dependencies?: ConnectToDaemonDependencies): Promise<IpcClient | null>;\n//#endregion\n//#region src/sdk.d.ts\ninterface ResolveOpenClawSdkOptions {\n specifier?: string;\n exportName?: string;\n unresolvableNote?: string;\n}\ninterface ResolveOpenClawSdkDependencies {\n anchors?: readonly string[];\n globalPackageJsonPath?: string;\n requireFrom?: (anchor: string) => (specifier: string) => unknown;\n}\ndeclare function resolveOpenClawSdk<T = unknown>(log: KitLogger, options?: ResolveOpenClawSdkOptions, dependencies?: ResolveOpenClawSdkDependencies): T | null;\n//# sourceMappingURL=sdk.d.ts.map\n\n//#endregion\n//#region src/activation.d.ts\n/**\n * Canonical activation-flag key for a plugin: `__alfe<Name>PluginActivated`.\n *\n * Accepts a short name (`\"google\"`, `\"google-chat\"`) or a full package name\n * (`\"@alfe.ai/openclaw-teams\"`); scope + `openclaw-` prefix are stripped\n * and the remainder PascalCased:\n *\n * getActivationKey(\"google\") → \"__alfeGooglePluginActivated\"\n * getActivationKey(\"google-chat\") → \"__alfeGoogleChatPluginActivated\"\n * getActivationKey(\"@alfe.ai/openclaw-teams\") → \"__alfeTeamsPluginActivated\"\n */\ndeclare function getActivationKey(name: string): string;\n/** True when the activation flag for `key` is currently set. */\ndeclare function isActivated(key: string): boolean;\n/**\n * Clear the activation flag so a later start can run again.\n *\n * Call this LAST in stop/deactivate paths — after side effects are stopped\n * (see the ordering rule in the module doc). Also exported for soft-failure\n * paths inside a `guardedStart` fn that want to log at a custom level and\n * return normally instead of throwing.\n */\ndeclare function resetActivation(key: string): void;\n/**\n * Run a service start exactly once per activation cycle.\n *\n * - If the flag is already set, logs at debug and returns `false` (skipped).\n * - Otherwise sets the flag and runs `fn`.\n * - If `fn` throws synchronously OR returns a promise that rejects, the\n * flag is RESET (so a later activate can retry) and the error is logged.\n * Errors are not rethrown — matching fleet behavior where a failed start\n * must never crash the host's plugin loader.\n *\n * Returns `true` when the start was initiated (even if an async portion\n * later fails), `false` when skipped or when `fn` threw synchronously.\n *\n * Note: cleaning up partial side effects on failure is `fn`'s job (throw\n * only after tearing down what was started); the kit only guarantees the\n * flag reset happens after `fn` has failed — i.e. after `fn`'s own cleanup.\n */\ndeclare function guardedStart(key: string, log: KitLogger, fn: () => void | Promise<void>): boolean;\n//# sourceMappingURL=activation.d.ts.map\n\n//#endregion\nexport { type ConnectToDaemonDependencies, type ConnectToDaemonOptions, type IpcClient, type IpcResponse, type KitLogger, PublicToolError, type ResolveOpenClawSdkDependencies, type ResolveOpenClawSdkOptions, type ToolDef, type ToolResult, connectToDaemon, defineTool, errResult, getActivationKey, guardedStart, isActivated, ok, publicToolError, resetActivation, resolveOpenClawSdk };\n//# sourceMappingURL=index.d.ts.map"],"mappings":";;;;;;UAmBUC,UAAAA;;;;;;;;UAQAC;;;;cAIIC;wCAC0BC,4BAA4BC,QAAQJ;;;;;AAblEA,UCjBO,MAAA,CDiBG;EAQVC,IAAAA,CAAAA,OAAO,EAAA,MAAA,EAAA,GAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA;EAAA,IAAA,CAAA,OAAA,EAAA,MAAA,EAAA,GAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA;OAIHC,CAAAA,OAAAA,EAAAA,MAAAA,EAAAA,GAAAA,IAAAA,EAAAA,OAAAA,EAAAA,CAAAA,EAAAA,IAAAA;OAC0BC,CAAAA,OAAAA,EAAAA,MAAAA,EAAAA,GAAAA,IAAAA,EAAAA,OAAAA,EAAAA,CAAAA,EAAAA,IAAAA;;UCVvB,iBAAA;UACP;qBACW;;;;;;EDLXH,QAAAA,EAAAA,CAAAA,GAAU,mBAAA,EAAA,GAAA,IAAA;EAQVC,EAAAA,EAAAA,MAAO;EAAA,IAAA,EAAA,MAAA;aAIHC,EAAAA,MAAAA;SAC0BC,EAAAA,MAAAA;UAAoCH,CAAAA,GAAAA,mBAAAA,CAAAA,EAAAA,IAAAA;YAARI,CAAAA,GAAAA,mBAAAA,CAAAA,EAAAA,IAAAA;CAAO"}
|
package/dist/plugin.d.ts
CHANGED
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","names":["KitLogger","ToolResult","ToolDef","TParameters","Record","Promise","PublicToolError","Error","publicToolError","ok","errResult","defineTool","IpcResponse","IpcClient","IpcModule","ConnectToDaemonOptions","ConnectToDaemonDependencies","connectToDaemon","ResolveOpenClawSdkOptions","ResolveOpenClawSdkDependencies","resolveOpenClawSdk","T","getActivationKey","isActivated","resetActivation","guardedStart"],"sources":["../../openclaw-plugin-kit/dist/index.d.ts","../src/types.ts","../src/plugin.ts"],"sourcesContent":["//#region src/types.d.ts\n/**\n * Minimal logger contract shared by every helper in the kit.\n *\n * Deliberately the *narrowest* shape in the fleet: some plugins declare\n * variadic loggers (`info(msg: string, ...args: unknown[])`), others\n * single-arg (`info(msg: string)`). Both are assignable to this. The kit\n * only ever calls with a single string.\n */\ninterface KitLogger {\n info(msg: string): void;\n warn(msg: string): void;\n error(msg: string): void;\n debug(msg: string): void;\n}\n//# sourceMappingURL=types.d.ts.map\n//#endregion\n//#region src/tools.d.ts\n/** Shape returned to OpenClaw from a tool `execute`. */\ninterface ToolResult {\n content: {\n type: \"text\";\n text: string;\n }[];\n details: unknown;\n isError?: boolean;\n}\ninterface ToolDef<TParameters = unknown> {\n name: string;\n description: string;\n label: string;\n parameters: TParameters;\n execute: (toolCallId: string, params: Record<string, unknown>) => Promise<ToolResult>;\n}\n/** Deliberately model-safe validation/usage failure. Other exceptions stay private. */\ndeclare class PublicToolError extends Error {\n readonly name = \"PublicToolError\";\n}\ndeclare function publicToolError(message: string): PublicToolError;\n/** Wrap bounded JSON in the OpenClaw tool-result envelope. */\ndeclare function ok(data: unknown): ToolResult;\n/** Wrap an explicitly public error in a captured OpenClaw error envelope. */\ndeclare function errResult(message: string): ToolResult;\n/**\n * Define a tool whose unexpected exceptions never expose provider, filesystem,\n * credential, or transport diagnostics to the model. Throw `PublicToolError`\n * only for a message deliberately safe for model display.\n */\ndeclare function defineTool<TParameters>(def: {\n name: string;\n description: string;\n parameters: TParameters;\n handler: (params: Record<string, unknown>) => Promise<unknown>;\n}): ToolDef<TParameters>;\n//# sourceMappingURL=tools.d.ts.map\n//#endregion\n//#region src/daemon.d.ts\ninterface IpcResponse {\n ok: boolean;\n error?: {\n message?: string;\n };\n [key: string]: unknown;\n}\ninterface IpcClient {\n on(event: string, handler: (...args: unknown[]) => void): void;\n request(method: string, params: Record<string, unknown>): Promise<IpcResponse>;\n start(): void;\n stop(): void;\n}\ninterface IpcModule {\n IPCClient: new (socketPath: string, log: KitLogger) => IpcClient;\n}\ninterface ConnectToDaemonOptions {\n pluginId: string;\n capabilities?: readonly string[];\n onMessage?: (msg: Record<string, unknown>) => void;\n standaloneNote?: string;\n}\ninterface ConnectToDaemonDependencies {\n loadIpcModule?: () => Promise<IpcModule>;\n}\ndeclare function connectToDaemon(socketPath: string, log: KitLogger, options: ConnectToDaemonOptions, dependencies?: ConnectToDaemonDependencies): Promise<IpcClient | null>;\n//#endregion\n//#region src/sdk.d.ts\ninterface ResolveOpenClawSdkOptions {\n specifier?: string;\n exportName?: string;\n unresolvableNote?: string;\n}\ninterface ResolveOpenClawSdkDependencies {\n anchors?: readonly string[];\n globalPackageJsonPath?: string;\n requireFrom?: (anchor: string) => (specifier: string) => unknown;\n}\ndeclare function resolveOpenClawSdk<T = unknown>(log: KitLogger, options?: ResolveOpenClawSdkOptions, dependencies?: ResolveOpenClawSdkDependencies): T | null;\n//# sourceMappingURL=sdk.d.ts.map\n\n//#endregion\n//#region src/activation.d.ts\n/**\n * Canonical activation-flag key for a plugin: `__alfe<Name>PluginActivated`.\n *\n * Accepts a short name (`\"google\"`, `\"google-chat\"`) or a full package name\n * (`\"@alfe.ai/openclaw-teams\"`); scope + `openclaw-` prefix are stripped\n * and the remainder PascalCased:\n *\n * getActivationKey(\"google\") → \"__alfeGooglePluginActivated\"\n * getActivationKey(\"google-chat\") → \"__alfeGoogleChatPluginActivated\"\n * getActivationKey(\"@alfe.ai/openclaw-teams\") → \"__alfeTeamsPluginActivated\"\n */\ndeclare function getActivationKey(name: string): string;\n/** True when the activation flag for `key` is currently set. */\ndeclare function isActivated(key: string): boolean;\n/**\n * Clear the activation flag so a later start can run again.\n *\n * Call this LAST in stop/deactivate paths — after side effects are stopped\n * (see the ordering rule in the module doc). Also exported for soft-failure\n * paths inside a `guardedStart` fn that want to log at a custom level and\n * return normally instead of throwing.\n */\ndeclare function resetActivation(key: string): void;\n/**\n * Run a service start exactly once per activation cycle.\n *\n * - If the flag is already set, logs at debug and returns `false` (skipped).\n * - Otherwise sets the flag and runs `fn`.\n * - If `fn` throws synchronously OR returns a promise that rejects, the\n * flag is RESET (so a later activate can retry) and the error is logged.\n * Errors are not rethrown — matching fleet behavior where a failed start\n * must never crash the host's plugin loader.\n *\n * Returns `true` when the start was initiated (even if an async portion\n * later fails), `false` when skipped or when `fn` threw synchronously.\n *\n * Note: cleaning up partial side effects on failure is `fn`'s job (throw\n * only after tearing down what was started); the kit only guarantees the\n * flag reset happens after `fn` has failed — i.e. after `fn`'s own cleanup.\n */\ndeclare function guardedStart(key: string, log: KitLogger, fn: () => void | Promise<void>): boolean;\n//# sourceMappingURL=activation.d.ts.map\n\n//#endregion\nexport { type ConnectToDaemonDependencies, type ConnectToDaemonOptions, type IpcClient, type IpcResponse, type KitLogger, PublicToolError, type ResolveOpenClawSdkDependencies, type ResolveOpenClawSdkOptions, type ToolDef, type ToolResult, connectToDaemon, defineTool, errResult, getActivationKey, guardedStart, isActivated, ok, publicToolError, resetActivation, resolveOpenClawSdk };\n//# sourceMappingURL=index.d.ts.map"],"mappings":";;;;;;UAmBUC,UAAAA;;;;;;;;UAQAC;;;;cAIIC;wCAC0BC,4BAA4BC,QAAQJ;;;;;AAblEA,UCjBO,MAAA,CDiBG;EAQVC,IAAAA,CAAAA,OAAO,EAAA,MAAA,EAAA,GAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA;EAAA,IAAA,CAAA,OAAA,EAAA,MAAA,EAAA,GAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA;OAIHC,CAAAA,OAAAA,EAAAA,MAAAA,EAAAA,GAAAA,IAAAA,EAAAA,OAAAA,EAAAA,CAAAA,EAAAA,IAAAA;OAC0BC,CAAAA,OAAAA,EAAAA,MAAAA,EAAAA,GAAAA,IAAAA,EAAAA,OAAAA,EAAAA,CAAAA,EAAAA,IAAAA;;UCVvB,iBAAA;UACP;qBACW;;;;;;EDLXH,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","names":["KitLogger","ToolResult","ToolDef","TParameters","Record","Promise","PublicToolError","Error","publicToolError","ok","errResult","defineTool","IpcResponse","IpcClient","IpcModule","ConnectToDaemonOptions","ConnectToDaemonDependencies","connectToDaemon","ResolveOpenClawSdkOptions","ResolveOpenClawSdkDependencies","resolveOpenClawSdk","T","getActivationKey","isActivated","resetActivation","guardedStart"],"sources":["../../openclaw-plugin-kit/dist/index.d.ts","../src/types.ts","../src/plugin.ts"],"sourcesContent":["//#region src/types.d.ts\n/**\n * Minimal logger contract shared by every helper in the kit.\n *\n * Deliberately the *narrowest* shape in the fleet: some plugins declare\n * variadic loggers (`info(msg: string, ...args: unknown[])`), others\n * single-arg (`info(msg: string)`). Both are assignable to this. The kit\n * only ever calls with a single string.\n */\ninterface KitLogger {\n info(msg: string): void;\n warn(msg: string): void;\n error(msg: string): void;\n debug(msg: string): void;\n}\n//# sourceMappingURL=types.d.ts.map\n//#endregion\n//#region src/tools.d.ts\n/** Shape returned to OpenClaw from a tool `execute`. */\ninterface ToolResult {\n content: {\n type: \"text\";\n text: string;\n }[];\n details: unknown;\n isError?: boolean;\n}\ninterface ToolDef<TParameters = unknown> {\n name: string;\n description: string;\n label: string;\n parameters: TParameters;\n execute: (toolCallId: string, params: Record<string, unknown>) => Promise<ToolResult>;\n}\n/** Deliberately model-safe validation/usage failure. Other exceptions stay private. */\ndeclare class PublicToolError extends Error {\n readonly name = \"PublicToolError\";\n}\ndeclare function publicToolError(message: string): PublicToolError;\n/** Wrap bounded JSON in the OpenClaw tool-result envelope. */\ndeclare function ok(data: unknown): ToolResult;\n/** Wrap an explicitly public error in a captured OpenClaw error envelope. */\ndeclare function errResult(message: string): ToolResult;\n/**\n * Define a tool whose unexpected exceptions never expose provider, filesystem,\n * credential, or transport diagnostics to the model. Throw `PublicToolError`\n * only for a message deliberately safe for model display.\n */\ndeclare function defineTool<TParameters>(def: {\n name: string;\n description: string;\n parameters: TParameters;\n handler: (params: Record<string, unknown>) => Promise<unknown>;\n}): ToolDef<TParameters>;\n//# sourceMappingURL=tools.d.ts.map\n//#endregion\n//#region src/daemon.d.ts\ninterface IpcResponse {\n ok: boolean;\n error?: {\n message?: string;\n };\n [key: string]: unknown;\n}\ninterface IpcClient {\n on(event: string, handler: (...args: unknown[]) => void): void;\n request(method: string, params: Record<string, unknown>): Promise<IpcResponse>;\n start(): void;\n stop(): void;\n}\ninterface IpcModule {\n IPCClient: new (socketPath: string, log: KitLogger) => IpcClient;\n}\ninterface ConnectToDaemonOptions {\n pluginId: string;\n capabilities?: readonly string[];\n onMessage?: (msg: Record<string, unknown>) => void;\n standaloneNote?: string;\n}\ninterface ConnectToDaemonDependencies {\n loadIpcModule?: () => Promise<IpcModule>;\n}\ndeclare function connectToDaemon(socketPath: string, log: KitLogger, options: ConnectToDaemonOptions, dependencies?: ConnectToDaemonDependencies): Promise<IpcClient | null>;\n//#endregion\n//#region src/sdk.d.ts\ninterface ResolveOpenClawSdkOptions {\n specifier?: string;\n exportName?: string;\n unresolvableNote?: string;\n}\ninterface ResolveOpenClawSdkDependencies {\n anchors?: readonly string[];\n globalPackageJsonPath?: string;\n requireFrom?: (anchor: string) => (specifier: string) => unknown;\n}\ndeclare function resolveOpenClawSdk<T = unknown>(log: KitLogger, options?: ResolveOpenClawSdkOptions, dependencies?: ResolveOpenClawSdkDependencies): T | null;\n//# sourceMappingURL=sdk.d.ts.map\n\n//#endregion\n//#region src/activation.d.ts\n/**\n * Canonical activation-flag key for a plugin: `__alfe<Name>PluginActivated`.\n *\n * Accepts a short name (`\"google\"`, `\"google-chat\"`) or a full package name\n * (`\"@alfe.ai/openclaw-teams\"`); scope + `openclaw-` prefix are stripped\n * and the remainder PascalCased:\n *\n * getActivationKey(\"google\") → \"__alfeGooglePluginActivated\"\n * getActivationKey(\"google-chat\") → \"__alfeGoogleChatPluginActivated\"\n * getActivationKey(\"@alfe.ai/openclaw-teams\") → \"__alfeTeamsPluginActivated\"\n */\ndeclare function getActivationKey(name: string): string;\n/** True when the activation flag for `key` is currently set. */\ndeclare function isActivated(key: string): boolean;\n/**\n * Clear the activation flag so a later start can run again.\n *\n * Call this LAST in stop/deactivate paths — after side effects are stopped\n * (see the ordering rule in the module doc). Also exported for soft-failure\n * paths inside a `guardedStart` fn that want to log at a custom level and\n * return normally instead of throwing.\n */\ndeclare function resetActivation(key: string): void;\n/**\n * Run a service start exactly once per activation cycle.\n *\n * - If the flag is already set, logs at debug and returns `false` (skipped).\n * - Otherwise sets the flag and runs `fn`.\n * - If `fn` throws synchronously OR returns a promise that rejects, the\n * flag is RESET (so a later activate can retry) and the error is logged.\n * Errors are not rethrown — matching fleet behavior where a failed start\n * must never crash the host's plugin loader.\n *\n * Returns `true` when the start was initiated (even if an async portion\n * later fails), `false` when skipped or when `fn` threw synchronously.\n *\n * Note: cleaning up partial side effects on failure is `fn`'s job (throw\n * only after tearing down what was started); the kit only guarantees the\n * flag reset happens after `fn` has failed — i.e. after `fn`'s own cleanup.\n */\ndeclare function guardedStart(key: string, log: KitLogger, fn: () => void | Promise<void>): boolean;\n//# sourceMappingURL=activation.d.ts.map\n\n//#endregion\nexport { type ConnectToDaemonDependencies, type ConnectToDaemonOptions, type IpcClient, type IpcResponse, type KitLogger, PublicToolError, type ResolveOpenClawSdkDependencies, type ResolveOpenClawSdkOptions, type ToolDef, type ToolResult, connectToDaemon, defineTool, errResult, getActivationKey, guardedStart, isActivated, ok, publicToolError, resetActivation, resolveOpenClawSdk };\n//# sourceMappingURL=index.d.ts.map"],"mappings":";;;;;;UAmBUC,UAAAA;;;;;;;;UAQAC;;;;cAIIC;wCAC0BC,4BAA4BC,QAAQJ;;;;;AAblEA,UCjBO,MAAA,CDiBG;EAQVC,IAAAA,CAAAA,OAAO,EAAA,MAAA,EAAA,GAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA;EAAA,IAAA,CAAA,OAAA,EAAA,MAAA,EAAA,GAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA;OAIHC,CAAAA,OAAAA,EAAAA,MAAAA,EAAAA,GAAAA,IAAAA,EAAAA,OAAAA,EAAAA,CAAAA,EAAAA,IAAAA;OAC0BC,CAAAA,OAAAA,EAAAA,MAAAA,EAAAA,GAAAA,IAAAA,EAAAA,OAAAA,EAAAA,CAAAA,EAAAA,IAAAA;;UCVvB,iBAAA;UACP;qBACW;;;;;;EDLXH,QAAAA,EAAAA,CAAAA,GAAU,mBAAA,EAAA,GAAA,IAAA;EAQVC,EAAAA,EAAAA,MAAO;EAAA,IAAA,EAAA,MAAA;aAIHC,EAAAA,MAAAA;SAC0BC,EAAAA,MAAAA;UAAoCH,CAAAA,GAAAA,mBAAAA,CAAAA,EAAAA,IAAAA;YAARI,CAAAA,GAAAA,mBAAAA,CAAAA,EAAAA,IAAAA;CAAO"}
|
package/dist/plugin2.cjs
CHANGED
|
@@ -252,7 +252,11 @@ function validatePackageVersion(value) {
|
|
|
252
252
|
}
|
|
253
253
|
//#endregion
|
|
254
254
|
//#region src/plugin.ts
|
|
255
|
-
|
|
255
|
+
const plugin = createTeamsPlugin();
|
|
256
|
+
var plugin_default = {
|
|
257
|
+
...plugin,
|
|
258
|
+
register: plugin.activate.bind(plugin)
|
|
259
|
+
};
|
|
256
260
|
//#endregion
|
|
257
261
|
Object.defineProperty(exports, "plugin_default", {
|
|
258
262
|
enumerable: true,
|
package/dist/plugin2.js
CHANGED
|
@@ -252,7 +252,11 @@ function validatePackageVersion(value) {
|
|
|
252
252
|
}
|
|
253
253
|
//#endregion
|
|
254
254
|
//#region src/plugin.ts
|
|
255
|
-
|
|
255
|
+
const plugin = createTeamsPlugin();
|
|
256
|
+
var plugin_default = {
|
|
257
|
+
...plugin,
|
|
258
|
+
register: plugin.activate.bind(plugin)
|
|
259
|
+
};
|
|
256
260
|
//#endregion
|
|
257
261
|
export { plugin_default as t };
|
|
258
262
|
|
package/dist/plugin2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin2.js","names":[],"sources":["../src/boundary.ts","../src/tools.ts","../src/runtime.ts","../src/plugin.ts"],"sourcesContent":["import { publicToolError } from \"@alfe.ai/openclaw-plugin-kit\";\n\nexport const MAX_CONVERSATION_ID_CHARS = 256;\nexport const MAX_MESSAGE_TEXT_CHARS = 40_000;\nexport const MAX_ADAPTIVE_CARD_BYTES = 100 * 1024;\nexport const MAX_ADAPTIVE_CARD_DEPTH = 12;\nexport const MAX_ADAPTIVE_CARD_ENTRIES = 200;\nexport const MAX_ADAPTIVE_CARD_KEY_CHARS = 128;\nexport const MAX_ADAPTIVE_CARD_STRING_CHARS = 40_000;\nconst MAX_CHANNELS = 200;\nconst MAX_INSPECTED_CHANNELS = 1_000;\nconst MAX_CHANNEL_ID_CHARS = 1_024;\nconst MAX_CHANNEL_NAME_CHARS = 512;\nconst MAX_CHANNEL_DESCRIPTION_CHARS = 1_000;\nconst MAX_ACTIVITY_ID_CHARS = 1_024;\nconst FORBIDDEN_CARD_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\ntype JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue };\n\nexport function parseMessageInput(params: Record<string, unknown>): {\n conversationId: string;\n text: string;\n} {\n requireExactFields(params, new Set([\"conversationId\", \"text\"]), \"teams_send_message\");\n return {\n conversationId: requireBoundedString(\n params.conversationId,\n \"conversationId\",\n MAX_CONVERSATION_ID_CHARS,\n false,\n ),\n text: requireBoundedString(params.text, \"text\", MAX_MESSAGE_TEXT_CHARS, true),\n };\n}\n\nexport function parseCardInput(params: Record<string, unknown>): {\n conversationId: string;\n adaptiveCard: Record<string, unknown>;\n} {\n requireExactFields(params, new Set([\"conversationId\", \"adaptiveCard\"]), \"teams_send_card\");\n const conversationId = requireBoundedString(\n params.conversationId,\n \"conversationId\",\n MAX_CONVERSATION_ID_CHARS,\n false,\n );\n const adaptiveCard = cloneAdaptiveCard(params.adaptiveCard);\n const serialized = JSON.stringify(adaptiveCard);\n if (Buffer.byteLength(serialized, \"utf8\") > MAX_ADAPTIVE_CARD_BYTES) {\n throw publicToolError(`adaptiveCard must not exceed ${String(MAX_ADAPTIVE_CARD_BYTES)} bytes`);\n }\n return { conversationId, adaptiveCard };\n}\n\nexport function parseListInput(params: Record<string, unknown>): void {\n requireExactFields(params, new Set(), \"teams_list_channels\");\n}\n\nexport function projectSendResponse(raw: unknown): { ok: true; activityId: string } {\n const response = asRecord(raw);\n const activityId = boundedExternalText(response?.activityId, MAX_ACTIVITY_ID_CHARS);\n if (response?.ok !== true || !activityId) {\n throw new Error(\"Microsoft send response did not match the expected contract\");\n }\n return { ok: true, activityId };\n}\n\nexport function projectChannelsResponse(raw: unknown): Record<string, unknown> {\n const response = asRecord(raw);\n if (!Array.isArray(response?.channels)) {\n throw new Error(\"Microsoft channels response did not contain a channel list\");\n }\n const channels: Record<string, string>[] = [];\n const inspectionLimit = Math.min(response.channels.length, MAX_INSPECTED_CHANNELS);\n for (let index = 0; index < inspectionLimit && channels.length < MAX_CHANNELS; index += 1) {\n const candidate = asRecord(response.channels[index]);\n const id = boundedExternalText(candidate?.id, MAX_CHANNEL_ID_CHARS);\n const name = boundedExternalText(candidate?.name, MAX_CHANNEL_NAME_CHARS);\n if (!id || !name) continue;\n const description = boundedExternalText(\n candidate?.description,\n MAX_CHANNEL_DESCRIPTION_CHARS,\n );\n channels.push({ id, name, ...(description ? { description } : {}) });\n }\n return {\n channels,\n truncated: response.channels.length > channels.length,\n notice: \"Teams channel names and descriptions are untrusted external content.\",\n };\n}\n\nfunction cloneAdaptiveCard(value: unknown): Record<string, unknown> {\n if (!isPlainRecord(value)) {\n throw publicToolError(\"adaptiveCard must be a JSON object\");\n }\n const state = { entries: 0, seen: new WeakSet() };\n return cloneJsonValue(value, 0, state) as Record<string, unknown>;\n}\n\nfunction cloneJsonValue(\n value: unknown,\n depth: number,\n state: { entries: number; seen: WeakSet<object> },\n): JsonValue {\n if (depth > MAX_ADAPTIVE_CARD_DEPTH) {\n throw publicToolError(\n `adaptiveCard must not exceed ${String(MAX_ADAPTIVE_CARD_DEPTH)} nested levels`,\n );\n }\n if (value === null || typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n if (value.length > MAX_ADAPTIVE_CARD_STRING_CHARS || hasForbiddenTextControl(value)) {\n throw publicToolError(\n `adaptiveCard strings must contain at most ${String(MAX_ADAPTIVE_CARD_STRING_CHARS)} safe characters`,\n );\n }\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw publicToolError(\"adaptiveCard numbers must be finite\");\n return value;\n }\n if (typeof value !== \"object\") {\n throw publicToolError(\"adaptiveCard must contain only JSON values\");\n }\n if (state.seen.has(value)) throw publicToolError(\"adaptiveCard must not contain cycles\");\n state.seen.add(value);\n\n if (Array.isArray(value)) {\n const keys = Object.keys(value);\n if (keys.length !== value.length || keys.some((key, index) => key !== String(index))) {\n throw publicToolError(\"adaptiveCard arrays must be dense JSON arrays\");\n }\n addEntries(state, value.length);\n return value.map((item) => cloneJsonValue(item, depth + 1, state));\n }\n if (!isPlainRecord(value)) throw publicToolError(\"adaptiveCard must contain only JSON objects\");\n const keys = Object.keys(value);\n if (\n Object.getOwnPropertyNames(value).length !== keys.length ||\n Object.getOwnPropertySymbols(value).length > 0\n ) {\n throw publicToolError(\"adaptiveCard objects must contain only enumerable string fields\");\n }\n addEntries(state, keys.length);\n const output = Object.create(null) as Record<string, JsonValue>;\n for (const key of keys) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (\n !descriptor ||\n !(\"value\" in descriptor) ||\n !descriptor.enumerable ||\n key.length < 1 ||\n key.length > MAX_ADAPTIVE_CARD_KEY_CHARS ||\n hasForbiddenTextControl(key) ||\n FORBIDDEN_CARD_KEYS.has(key)\n ) {\n throw publicToolError(\n `adaptiveCard keys must contain 1 to ${String(MAX_ADAPTIVE_CARD_KEY_CHARS)} safe characters`,\n );\n }\n output[key] = cloneJsonValue(descriptor.value, depth + 1, state);\n }\n return output;\n}\n\nfunction addEntries(state: { entries: number }, count: number): void {\n state.entries += count;\n if (state.entries > MAX_ADAPTIVE_CARD_ENTRIES) {\n throw publicToolError(\n `adaptiveCard must not exceed ${String(MAX_ADAPTIVE_CARD_ENTRIES)} total entries`,\n );\n }\n}\n\nfunction requireExactFields(\n params: Record<string, unknown>,\n allowed: ReadonlySet<string>,\n toolName: string,\n): void {\n if (Object.keys(params).some((key) => !allowed.has(key))) {\n throw publicToolError(`${toolName} contains unsupported fields`);\n }\n}\n\nfunction requireBoundedString(\n value: unknown,\n label: string,\n maximum: number,\n allowFormattingControls: boolean,\n): string {\n if (\n typeof value !== \"string\" ||\n value.length < 1 ||\n value.length > maximum ||\n (allowFormattingControls ? hasForbiddenTextControl(value) : hasAnyControl(value))\n ) {\n throw publicToolError(`${label} must contain 1 to ${String(maximum)} safe characters`);\n }\n return value;\n}\n\nfunction boundedExternalText(value: unknown, maximum: number): string | undefined {\n if (typeof value !== \"string\" || value.length < 1) return undefined;\n const flattened = flattenExternalControls(value).replace(/\\s+/gu, \" \").trim();\n return flattened.slice(0, maximum) || undefined;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value) as unknown;\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction hasAnyControl(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code < 32 || (code >= 127 && code <= 159)) return true;\n }\n return false;\n}\n\nfunction flattenExternalControls(value: string): string {\n let output = \"\";\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n output += code < 32 || (code >= 127 && code <= 159) ? \" \" : value[index];\n }\n return output;\n}\n\nfunction hasForbiddenTextControl(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (\n (code < 32 && code !== 9 && code !== 10 && code !== 13) ||\n (code >= 127 && code <= 159)\n ) return true;\n }\n return false;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined;\n}\n","import { Type } from \"@sinclair/typebox\";\nimport { defineTool, type ToolDef } from \"@alfe.ai/openclaw-plugin-kit\";\nimport {\n MAX_CONVERSATION_ID_CHARS,\n MAX_MESSAGE_TEXT_CHARS,\n parseCardInput,\n parseListInput,\n parseMessageInput,\n projectChannelsResponse,\n projectSendResponse,\n} from \"./boundary.js\";\nimport type { TeamsClientResolver } from \"./types.js\";\n\nexport function createTeamsTools(resolver: TeamsClientResolver): ToolDef[] {\n return [\n defineTool({\n name: \"teams_send_message\",\n description:\n \"Send text to a Microsoft Teams conversation. Use a conversationId from an inbound Teams message or teams_list_channels.\",\n parameters: Type.Object({\n conversationId: Type.String({ minLength: 1, maxLength: MAX_CONVERSATION_ID_CHARS }),\n text: Type.String({ minLength: 1, maxLength: MAX_MESSAGE_TEXT_CHARS }),\n }, { additionalProperties: false }),\n handler: async (params) => {\n const input = parseMessageInput(params);\n return projectSendResponse(await resolver.getClient().sendTeamsMessage(input));\n },\n }),\n defineTool({\n name: \"teams_send_card\",\n description:\n \"Send a bounded Adaptive Card JSON object to a Microsoft Teams conversation.\",\n parameters: Type.Object({\n conversationId: Type.String({ minLength: 1, maxLength: MAX_CONVERSATION_ID_CHARS }),\n adaptiveCard: Type.Object({}, { additionalProperties: true }),\n }, { additionalProperties: false }),\n handler: async (params) => {\n const input = parseCardInput(params);\n return projectSendResponse(await resolver.getClient().sendTeamsMessage(input));\n },\n }),\n defineTool({\n name: \"teams_list_channels\",\n description:\n \"List bounded Microsoft Teams channel and conversation metadata available to this agent's bot.\",\n parameters: Type.Object({}, { additionalProperties: false }),\n handler: async (params) => {\n parseListInput(params);\n return projectChannelsResponse(await resolver.getClient().listTeamsChannels());\n },\n }),\n ];\n}\n","import { createRequire } from \"node:module\";\nimport { AgentApiClient, installToolErrorCapture } from \"@alfe.ai/agent-api-client\";\nimport { resolveConfig, type ResolvedConfig } from \"@alfe.ai/config\";\nimport { publicToolError } from \"@alfe.ai/openclaw-plugin-kit\";\nimport { createTeamsTools } from \"./tools.js\";\nimport type { OpenClawPluginApi, TeamsClient, TeamsClientResolver } from \"./types.js\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\") as { version?: unknown };\n\nexport const PLUGIN_VERSION = validatePackageVersion(pkg.version);\n\nexport interface TeamsPluginDependencies {\n resolveConfig?: () => ResolvedConfig;\n createClient?: (config: { apiKey: string; apiUrl: string }) => TeamsClient;\n installErrorCapture?: typeof installToolErrorCapture;\n}\n\nexport function createTeamsPlugin(dependencies: TeamsPluginDependencies = {}) {\n const resolveRuntimeConfig = dependencies.resolveConfig ?? resolveConfig;\n const createClient = dependencies.createClient ?? ((config) => new AgentApiClient(config));\n const installErrorCapture = dependencies.installErrorCapture ?? installToolErrorCapture;\n const resolver = createTeamsClientResolver(resolveRuntimeConfig, createClient);\n\n return {\n id: \"@alfe.ai/openclaw-teams\",\n name: \"Alfe Teams Plugin\",\n description: \"Microsoft Teams integration — send messages and adaptive cards\",\n version: PLUGIN_VERSION,\n\n activate(api: OpenClawPluginApi): void {\n installErrorCapture(api, { plugin: \"openclaw-teams\" });\n const tools = createTeamsTools(resolver);\n for (const tool of tools) api.registerTool(tool);\n api.logger.info(`Registered ${String(tools.length)} Microsoft Teams tools`);\n },\n\n deactivate(api: OpenClawPluginApi): void {\n api.logger.info(\"Microsoft Teams plugin deactivated\");\n },\n };\n}\n\nexport function createTeamsClientResolver(\n resolveRuntimeConfig: () => ResolvedConfig,\n createClient: (config: { apiKey: string; apiUrl: string }) => TeamsClient,\n): TeamsClientResolver {\n let cached: { apiKey: string; apiUrl: string; client: TeamsClient } | undefined;\n return {\n getClient(): TeamsClient {\n let config: ResolvedConfig;\n try {\n config = resolveRuntimeConfig();\n } catch {\n throw publicToolError(\n \"Microsoft Teams is not configured; run alfe setup or repair ~/.alfe/config.toml, then retry.\",\n );\n }\n if (cached?.apiKey === config.apiKey && cached.apiUrl === config.apiUrl) {\n return cached.client;\n }\n const client = createClient({ apiKey: config.apiKey, apiUrl: config.apiUrl });\n cached = { apiKey: config.apiKey, apiUrl: config.apiUrl, client };\n return client;\n },\n };\n}\n\nfunction validatePackageVersion(value: unknown): string {\n if (typeof value !== \"string\" || !/^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$/u.test(value)) {\n throw new Error(\"openclaw-teams package version is invalid\");\n }\n return value;\n}\n","import { createTeamsPlugin } from \"./runtime.js\";\n\nexport default createTeamsPlugin();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin2.js","names":[],"sources":["../src/boundary.ts","../src/tools.ts","../src/runtime.ts","../src/plugin.ts"],"sourcesContent":["import { publicToolError } from \"@alfe.ai/openclaw-plugin-kit\";\n\nexport const MAX_CONVERSATION_ID_CHARS = 256;\nexport const MAX_MESSAGE_TEXT_CHARS = 40_000;\nexport const MAX_ADAPTIVE_CARD_BYTES = 100 * 1024;\nexport const MAX_ADAPTIVE_CARD_DEPTH = 12;\nexport const MAX_ADAPTIVE_CARD_ENTRIES = 200;\nexport const MAX_ADAPTIVE_CARD_KEY_CHARS = 128;\nexport const MAX_ADAPTIVE_CARD_STRING_CHARS = 40_000;\nconst MAX_CHANNELS = 200;\nconst MAX_INSPECTED_CHANNELS = 1_000;\nconst MAX_CHANNEL_ID_CHARS = 1_024;\nconst MAX_CHANNEL_NAME_CHARS = 512;\nconst MAX_CHANNEL_DESCRIPTION_CHARS = 1_000;\nconst MAX_ACTIVITY_ID_CHARS = 1_024;\nconst FORBIDDEN_CARD_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\ntype JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue };\n\nexport function parseMessageInput(params: Record<string, unknown>): {\n conversationId: string;\n text: string;\n} {\n requireExactFields(params, new Set([\"conversationId\", \"text\"]), \"teams_send_message\");\n return {\n conversationId: requireBoundedString(\n params.conversationId,\n \"conversationId\",\n MAX_CONVERSATION_ID_CHARS,\n false,\n ),\n text: requireBoundedString(params.text, \"text\", MAX_MESSAGE_TEXT_CHARS, true),\n };\n}\n\nexport function parseCardInput(params: Record<string, unknown>): {\n conversationId: string;\n adaptiveCard: Record<string, unknown>;\n} {\n requireExactFields(params, new Set([\"conversationId\", \"adaptiveCard\"]), \"teams_send_card\");\n const conversationId = requireBoundedString(\n params.conversationId,\n \"conversationId\",\n MAX_CONVERSATION_ID_CHARS,\n false,\n );\n const adaptiveCard = cloneAdaptiveCard(params.adaptiveCard);\n const serialized = JSON.stringify(adaptiveCard);\n if (Buffer.byteLength(serialized, \"utf8\") > MAX_ADAPTIVE_CARD_BYTES) {\n throw publicToolError(`adaptiveCard must not exceed ${String(MAX_ADAPTIVE_CARD_BYTES)} bytes`);\n }\n return { conversationId, adaptiveCard };\n}\n\nexport function parseListInput(params: Record<string, unknown>): void {\n requireExactFields(params, new Set(), \"teams_list_channels\");\n}\n\nexport function projectSendResponse(raw: unknown): { ok: true; activityId: string } {\n const response = asRecord(raw);\n const activityId = boundedExternalText(response?.activityId, MAX_ACTIVITY_ID_CHARS);\n if (response?.ok !== true || !activityId) {\n throw new Error(\"Microsoft send response did not match the expected contract\");\n }\n return { ok: true, activityId };\n}\n\nexport function projectChannelsResponse(raw: unknown): Record<string, unknown> {\n const response = asRecord(raw);\n if (!Array.isArray(response?.channels)) {\n throw new Error(\"Microsoft channels response did not contain a channel list\");\n }\n const channels: Record<string, string>[] = [];\n const inspectionLimit = Math.min(response.channels.length, MAX_INSPECTED_CHANNELS);\n for (let index = 0; index < inspectionLimit && channels.length < MAX_CHANNELS; index += 1) {\n const candidate = asRecord(response.channels[index]);\n const id = boundedExternalText(candidate?.id, MAX_CHANNEL_ID_CHARS);\n const name = boundedExternalText(candidate?.name, MAX_CHANNEL_NAME_CHARS);\n if (!id || !name) continue;\n const description = boundedExternalText(\n candidate?.description,\n MAX_CHANNEL_DESCRIPTION_CHARS,\n );\n channels.push({ id, name, ...(description ? { description } : {}) });\n }\n return {\n channels,\n truncated: response.channels.length > channels.length,\n notice: \"Teams channel names and descriptions are untrusted external content.\",\n };\n}\n\nfunction cloneAdaptiveCard(value: unknown): Record<string, unknown> {\n if (!isPlainRecord(value)) {\n throw publicToolError(\"adaptiveCard must be a JSON object\");\n }\n const state = { entries: 0, seen: new WeakSet() };\n return cloneJsonValue(value, 0, state) as Record<string, unknown>;\n}\n\nfunction cloneJsonValue(\n value: unknown,\n depth: number,\n state: { entries: number; seen: WeakSet<object> },\n): JsonValue {\n if (depth > MAX_ADAPTIVE_CARD_DEPTH) {\n throw publicToolError(\n `adaptiveCard must not exceed ${String(MAX_ADAPTIVE_CARD_DEPTH)} nested levels`,\n );\n }\n if (value === null || typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n if (value.length > MAX_ADAPTIVE_CARD_STRING_CHARS || hasForbiddenTextControl(value)) {\n throw publicToolError(\n `adaptiveCard strings must contain at most ${String(MAX_ADAPTIVE_CARD_STRING_CHARS)} safe characters`,\n );\n }\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw publicToolError(\"adaptiveCard numbers must be finite\");\n return value;\n }\n if (typeof value !== \"object\") {\n throw publicToolError(\"adaptiveCard must contain only JSON values\");\n }\n if (state.seen.has(value)) throw publicToolError(\"adaptiveCard must not contain cycles\");\n state.seen.add(value);\n\n if (Array.isArray(value)) {\n const keys = Object.keys(value);\n if (keys.length !== value.length || keys.some((key, index) => key !== String(index))) {\n throw publicToolError(\"adaptiveCard arrays must be dense JSON arrays\");\n }\n addEntries(state, value.length);\n return value.map((item) => cloneJsonValue(item, depth + 1, state));\n }\n if (!isPlainRecord(value)) throw publicToolError(\"adaptiveCard must contain only JSON objects\");\n const keys = Object.keys(value);\n if (\n Object.getOwnPropertyNames(value).length !== keys.length ||\n Object.getOwnPropertySymbols(value).length > 0\n ) {\n throw publicToolError(\"adaptiveCard objects must contain only enumerable string fields\");\n }\n addEntries(state, keys.length);\n const output = Object.create(null) as Record<string, JsonValue>;\n for (const key of keys) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (\n !descriptor ||\n !(\"value\" in descriptor) ||\n !descriptor.enumerable ||\n key.length < 1 ||\n key.length > MAX_ADAPTIVE_CARD_KEY_CHARS ||\n hasForbiddenTextControl(key) ||\n FORBIDDEN_CARD_KEYS.has(key)\n ) {\n throw publicToolError(\n `adaptiveCard keys must contain 1 to ${String(MAX_ADAPTIVE_CARD_KEY_CHARS)} safe characters`,\n );\n }\n output[key] = cloneJsonValue(descriptor.value, depth + 1, state);\n }\n return output;\n}\n\nfunction addEntries(state: { entries: number }, count: number): void {\n state.entries += count;\n if (state.entries > MAX_ADAPTIVE_CARD_ENTRIES) {\n throw publicToolError(\n `adaptiveCard must not exceed ${String(MAX_ADAPTIVE_CARD_ENTRIES)} total entries`,\n );\n }\n}\n\nfunction requireExactFields(\n params: Record<string, unknown>,\n allowed: ReadonlySet<string>,\n toolName: string,\n): void {\n if (Object.keys(params).some((key) => !allowed.has(key))) {\n throw publicToolError(`${toolName} contains unsupported fields`);\n }\n}\n\nfunction requireBoundedString(\n value: unknown,\n label: string,\n maximum: number,\n allowFormattingControls: boolean,\n): string {\n if (\n typeof value !== \"string\" ||\n value.length < 1 ||\n value.length > maximum ||\n (allowFormattingControls ? hasForbiddenTextControl(value) : hasAnyControl(value))\n ) {\n throw publicToolError(`${label} must contain 1 to ${String(maximum)} safe characters`);\n }\n return value;\n}\n\nfunction boundedExternalText(value: unknown, maximum: number): string | undefined {\n if (typeof value !== \"string\" || value.length < 1) return undefined;\n const flattened = flattenExternalControls(value).replace(/\\s+/gu, \" \").trim();\n return flattened.slice(0, maximum) || undefined;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value) as unknown;\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction hasAnyControl(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code < 32 || (code >= 127 && code <= 159)) return true;\n }\n return false;\n}\n\nfunction flattenExternalControls(value: string): string {\n let output = \"\";\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n output += code < 32 || (code >= 127 && code <= 159) ? \" \" : value[index];\n }\n return output;\n}\n\nfunction hasForbiddenTextControl(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (\n (code < 32 && code !== 9 && code !== 10 && code !== 13) ||\n (code >= 127 && code <= 159)\n ) return true;\n }\n return false;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined;\n}\n","import { Type } from \"@sinclair/typebox\";\nimport { defineTool, type ToolDef } from \"@alfe.ai/openclaw-plugin-kit\";\nimport {\n MAX_CONVERSATION_ID_CHARS,\n MAX_MESSAGE_TEXT_CHARS,\n parseCardInput,\n parseListInput,\n parseMessageInput,\n projectChannelsResponse,\n projectSendResponse,\n} from \"./boundary.js\";\nimport type { TeamsClientResolver } from \"./types.js\";\n\nexport function createTeamsTools(resolver: TeamsClientResolver): ToolDef[] {\n return [\n defineTool({\n name: \"teams_send_message\",\n description:\n \"Send text to a Microsoft Teams conversation. Use a conversationId from an inbound Teams message or teams_list_channels.\",\n parameters: Type.Object({\n conversationId: Type.String({ minLength: 1, maxLength: MAX_CONVERSATION_ID_CHARS }),\n text: Type.String({ minLength: 1, maxLength: MAX_MESSAGE_TEXT_CHARS }),\n }, { additionalProperties: false }),\n handler: async (params) => {\n const input = parseMessageInput(params);\n return projectSendResponse(await resolver.getClient().sendTeamsMessage(input));\n },\n }),\n defineTool({\n name: \"teams_send_card\",\n description:\n \"Send a bounded Adaptive Card JSON object to a Microsoft Teams conversation.\",\n parameters: Type.Object({\n conversationId: Type.String({ minLength: 1, maxLength: MAX_CONVERSATION_ID_CHARS }),\n adaptiveCard: Type.Object({}, { additionalProperties: true }),\n }, { additionalProperties: false }),\n handler: async (params) => {\n const input = parseCardInput(params);\n return projectSendResponse(await resolver.getClient().sendTeamsMessage(input));\n },\n }),\n defineTool({\n name: \"teams_list_channels\",\n description:\n \"List bounded Microsoft Teams channel and conversation metadata available to this agent's bot.\",\n parameters: Type.Object({}, { additionalProperties: false }),\n handler: async (params) => {\n parseListInput(params);\n return projectChannelsResponse(await resolver.getClient().listTeamsChannels());\n },\n }),\n ];\n}\n","import { createRequire } from \"node:module\";\nimport { AgentApiClient, installToolErrorCapture } from \"@alfe.ai/agent-api-client\";\nimport { resolveConfig, type ResolvedConfig } from \"@alfe.ai/config\";\nimport { publicToolError } from \"@alfe.ai/openclaw-plugin-kit\";\nimport { createTeamsTools } from \"./tools.js\";\nimport type { OpenClawPluginApi, TeamsClient, TeamsClientResolver } from \"./types.js\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\") as { version?: unknown };\n\nexport const PLUGIN_VERSION = validatePackageVersion(pkg.version);\n\nexport interface TeamsPluginDependencies {\n resolveConfig?: () => ResolvedConfig;\n createClient?: (config: { apiKey: string; apiUrl: string }) => TeamsClient;\n installErrorCapture?: typeof installToolErrorCapture;\n}\n\nexport function createTeamsPlugin(dependencies: TeamsPluginDependencies = {}) {\n const resolveRuntimeConfig = dependencies.resolveConfig ?? resolveConfig;\n const createClient = dependencies.createClient ?? ((config) => new AgentApiClient(config));\n const installErrorCapture = dependencies.installErrorCapture ?? installToolErrorCapture;\n const resolver = createTeamsClientResolver(resolveRuntimeConfig, createClient);\n\n return {\n id: \"@alfe.ai/openclaw-teams\",\n name: \"Alfe Teams Plugin\",\n description: \"Microsoft Teams integration — send messages and adaptive cards\",\n version: PLUGIN_VERSION,\n\n activate(api: OpenClawPluginApi): void {\n installErrorCapture(api, { plugin: \"openclaw-teams\" });\n const tools = createTeamsTools(resolver);\n for (const tool of tools) api.registerTool(tool);\n api.logger.info(`Registered ${String(tools.length)} Microsoft Teams tools`);\n },\n\n deactivate(api: OpenClawPluginApi): void {\n api.logger.info(\"Microsoft Teams plugin deactivated\");\n },\n };\n}\n\nexport function createTeamsClientResolver(\n resolveRuntimeConfig: () => ResolvedConfig,\n createClient: (config: { apiKey: string; apiUrl: string }) => TeamsClient,\n): TeamsClientResolver {\n let cached: { apiKey: string; apiUrl: string; client: TeamsClient } | undefined;\n return {\n getClient(): TeamsClient {\n let config: ResolvedConfig;\n try {\n config = resolveRuntimeConfig();\n } catch {\n throw publicToolError(\n \"Microsoft Teams is not configured; run alfe setup or repair ~/.alfe/config.toml, then retry.\",\n );\n }\n if (cached?.apiKey === config.apiKey && cached.apiUrl === config.apiUrl) {\n return cached.client;\n }\n const client = createClient({ apiKey: config.apiKey, apiUrl: config.apiUrl });\n cached = { apiKey: config.apiKey, apiUrl: config.apiUrl, client };\n return client;\n },\n };\n}\n\nfunction validatePackageVersion(value: unknown): string {\n if (typeof value !== \"string\" || !/^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$/u.test(value)) {\n throw new Error(\"openclaw-teams package version is invalid\");\n }\n return value;\n}\n","import { createTeamsPlugin } from \"./runtime.js\";\n\nconst plugin = createTeamsPlugin();\n\nexport default { ...plugin, register: plugin.activate.bind(plugin) };\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alfe.ai/openclaw-teams",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.46",
|
|
4
4
|
"description": "OpenClaw Microsoft Teams plugin for Alfe — send messages and adaptive cards to Teams",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@sinclair/typebox": "^0.34.48",
|
|
32
|
-
"@alfe.ai/agent-api-client": "0.
|
|
32
|
+
"@alfe.ai/agent-api-client": "0.19.1",
|
|
33
33
|
"@alfe.ai/config": "0.4.1",
|
|
34
34
|
"@alfe.ai/openclaw-plugin-kit": "0.2.0"
|
|
35
35
|
},
|