@xopcai/xopc 0.0.105 → 0.0.106
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/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/adapters/gateway-setup.js +2 -2
- package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -1
- package/dist/extensions/feishu/src/directory/directory-adapter.js +1 -1
- package/dist/extensions/feishu/src/directory/directory-adapter.js.map +1 -1
- package/dist/extensions/feishu/src/outbound/outbound-adapter.js +4 -3
- package/dist/extensions/feishu/src/outbound/outbound-adapter.js.map +1 -1
- package/dist/extensions/feishu/src/plugin.d.ts +6 -3
- package/dist/extensions/feishu/src/plugin.js +59 -40
- package/dist/extensions/feishu/src/plugin.js.map +1 -1
- package/dist/extensions/feishu/src/streaming/streaming-adapter.js +20 -16
- package/dist/extensions/feishu/src/streaming/streaming-adapter.js.map +1 -1
- package/dist/extensions/feishu/src/transport/socket-mode/monitor.js +1 -1
- package/dist/extensions/feishu/src/transport/webhook/monitor.js +1 -1
- package/dist/extensions/feishu/src/workflow-progress.d.ts +1 -1
- package/dist/extensions/feishu/src/workflow-progress.js +2 -2
- package/dist/extensions/feishu/src/workflow-progress.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/gateway-setup.js +8 -6
- package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -1
- package/dist/extensions/telegram/src/command-handler.d.ts +1 -1
- package/dist/extensions/telegram/src/command-handler.js +11 -9
- package/dist/extensions/telegram/src/command-handler.js.map +1 -1
- package/dist/extensions/telegram/src/inbound-processor.js +1 -2
- package/dist/extensions/telegram/src/inbound-processor.js.map +1 -1
- package/dist/extensions/telegram/src/plugin.d.ts +1 -0
- package/dist/extensions/telegram/src/plugin.js +6 -6
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/src/workflow-progress.d.ts +1 -1
- package/dist/extensions/telegram/src/workflow-progress.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/cli/gateway-qr-login.d.ts +4 -0
- package/dist/extensions/weixin/src/cli/gateway-qr-login.js +34 -5
- package/dist/extensions/weixin/src/cli/gateway-qr-login.js.map +1 -1
- package/dist/extensions/weixin/src/cli/qr-login.js +4 -3
- package/dist/extensions/weixin/src/cli/qr-login.js.map +1 -1
- package/dist/extensions/weixin/src/plugin.d.ts +1 -0
- package/dist/extensions/weixin/src/plugin.js +7 -6
- package/dist/extensions/weixin/src/plugin.js.map +1 -1
- package/dist/extensions/weixin/src/workflow-progress.d.ts +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js.map +1 -1
- package/dist/gateway/static/root/assets/{agents-XzgIVKcI.js → agents-3eP0vqFO.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-B7Us3RMl.js → apps-page-CZ2ZKrko.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-BgeV6fzw.js → channels-settings-BbETa93K.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-DKGHEeAU.js → cron-page-DCtUkHMu.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-DJDkNhu5.js → dist-OM9qGfm5.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DI1XJTJi.js → extension-debug-page-D-WHrr_w.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-SuafGTT_.js → extension-page-CCgjSoKn.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-cKmGax9v.js → extension-settings-page-BJH5a-Gn.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-CRiDcxtt.js → heartbeat-config-api-CVyP6pFj.js} +1 -1
- package/dist/gateway/static/root/assets/{index-50FVtgXU.js → index-CEZxETzw.js} +177 -177
- package/dist/gateway/static/root/assets/{logs-page-DM8o5-Bm.js → logs-page-R6Vv_Ja6.js} +1 -1
- package/dist/gateway/static/root/assets/{note-detail-page-j53jtvq9.js → note-detail-page-BUDarLhh.js} +1 -1
- package/dist/gateway/static/root/assets/{note-time-Ck2H2Qpw.js → note-time-Cc2-T21g.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-CsWIw35Q.js → notes-page-EAHl16bq.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-BvmGNxiJ.js → schema-form-CrlOmEZt.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-CLPsbyOW.js → sessions-page-Ce_xuuSB.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-advanced-gate-DRdayl8P.js → settings-advanced-gate-BBAQxxew.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-BlIYg2gZ.js → settings-form-section-DjPD-ErC.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-CRGHT_bm.js → settings-page-KhQ9QgH0.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-BlT6Akvk.js → share-preview-page-BjvPht3V.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-Ce-RIH2y.js → skills-page-C0laq7l1.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-CJGTidqc.js → voice-api-key-field-DeGckWkl.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-page.utils-_sjXCMvi.js → workflow-page.utils-D4sqR0yX.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-o63aaARK.js → workflows-page-DFjM95g5.js} +1 -1
- package/dist/gateway/static/root/index.html +1 -1
- package/dist/package.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-config.js +16 -8
- package/dist/src/agent/mcp/bundle-mcp-config.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-policy.js +2 -2
- package/dist/src/agent/mcp/bundle-mcp-policy.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/mcp-http.js +1 -1
- package/dist/src/agent/mcp/mcp-http.js.map +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +2 -6
- package/dist/src/agent/mcp/mcp-transport-config.js.map +1 -1
- package/dist/src/agent/workflow/index.js +2 -1
- package/dist/src/agent/workflow/runtime.d.ts +2 -2
- package/dist/src/agent/workflow/runtime.js +1 -14
- package/dist/src/agent/workflow/runtime.js.map +1 -1
- package/dist/src/agent/workflow/snapshot-empty.d.ts +2 -0
- package/dist/src/agent/workflow/snapshot-empty.js +19 -0
- package/dist/src/agent/workflow/snapshot-empty.js.map +1 -0
- package/dist/src/agent/workflow/snapshot.js +1 -1
- package/dist/src/agent/workflow/snapshot.js.map +1 -1
- package/dist/src/connectors/health.js +1 -1
- package/dist/src/connectors/install.js +1 -1
- package/dist/src/gateway/hono/routes/mcp.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/voice/stt/availability.d.ts +6 -0
- package/dist/src/voice/stt/availability.js +14 -6
- package/dist/src/voice/stt/availability.js.map +1 -1
- package/dist/src/voice/stt/index.js +2 -1
- package/dist/src/voice/stt/index.js.map +1 -1
- package/dist/src/voice/stt/mention.d.ts +2 -0
- package/dist/src/voice/stt/mention.js +20 -0
- package/dist/src/voice/stt/mention.js.map +1 -0
- package/dist/src/voice/stt/preflight.d.ts +1 -4
- package/dist/src/voice/stt/preflight.js +1 -18
- package/dist/src/voice/stt/preflight.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { isManagedConnectorServer } from "../../../connectors/materialize.js";
|
|
2
1
|
import { canonicalizeConfiguredMcpServer, normalizeConfiguredMcpServers } from "../../../config/mcp-config-normalize.js";
|
|
3
2
|
import { loadMergedBundleMcpConfig } from "../../../agent/mcp/bundle-mcp-config.js";
|
|
4
3
|
import { createBundleMcpToolRuntime, listBundleMcpServerToolsForGateway, mapBundleMcpToolsForGateway } from "../../../agent/mcp/bundle-mcp-materialize.js";
|
|
5
4
|
import { getWorkspacePath } from "../../../config/workspace-path-helpers.js";
|
|
5
|
+
import { isManagedConnectorServer } from "../../../connectors/materialize.js";
|
|
6
6
|
//#region src/gateway/hono/routes/mcp.ts
|
|
7
7
|
function registerMcpRoutes(authenticated, deps) {
|
|
8
8
|
authenticated.get("/api/mcp/servers", (c) => {
|
|
@@ -4,10 +4,10 @@ import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.
|
|
|
4
4
|
import { resolveBootstrapFilesSync } from "../agent/bootstrap/bootstrap-files.js";
|
|
5
5
|
import { createWorkflowCatalog } from "../agent/workflow/catalog.js";
|
|
6
6
|
import { createSkillConfigManager, isSkillEnabled } from "../agent/skills/config.js";
|
|
7
|
-
import { listConnectorInstances } from "../connectors/instances.js";
|
|
8
7
|
import { loadSkills } from "../agent/skills/index.js";
|
|
9
8
|
import { getWorkspacePath } from "../config/workspace-path-helpers.js";
|
|
10
9
|
import "../config/index.js";
|
|
10
|
+
import { listConnectorInstances } from "../connectors/instances.js";
|
|
11
11
|
import { basename } from "node:path";
|
|
12
12
|
//#region src/tui/tui-startup-resources.ts
|
|
13
13
|
init_paths();
|
|
@@ -1,2 +1,8 @@
|
|
|
1
1
|
import type { STTConfig } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Lightweight availability check for channel routing. Do not import the STT
|
|
4
|
+
* factory/provider registry here; channel plugins call this at startup and the
|
|
5
|
+
* provider registry pulls optional SDKs (e.g. openai) into Electron's dynamic
|
|
6
|
+
* extension runtime path.
|
|
7
|
+
*/
|
|
2
8
|
export declare function isSTTAvailable(config?: STTConfig): boolean;
|
|
@@ -1,12 +1,20 @@
|
|
|
1
|
-
import { resolveSTTProviderChain } from "./factory.js";
|
|
2
1
|
//#region src/voice/stt/availability.ts
|
|
2
|
+
function providerHasConfig(config, providerId) {
|
|
3
|
+
const provider = config.providers?.[providerId];
|
|
4
|
+
if (provider && Object.keys(provider).length > 0) return true;
|
|
5
|
+
return [...config.models ?? [], ...config.sharedModels ?? []].some((entry) => entry.provider === providerId && entry.capabilities?.includes("audio"));
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Lightweight availability check for channel routing. Do not import the STT
|
|
9
|
+
* factory/provider registry here; channel plugins call this at startup and the
|
|
10
|
+
* provider registry pulls optional SDKs (e.g. openai) into Electron's dynamic
|
|
11
|
+
* extension runtime path.
|
|
12
|
+
*/
|
|
3
13
|
function isSTTAvailable(config) {
|
|
4
14
|
if (!config?.enabled) return false;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
return false;
|
|
9
|
-
}
|
|
15
|
+
if (providerHasConfig(config, config.provider)) return true;
|
|
16
|
+
if (config.fallback?.enabled) return config.fallback.order.some((providerId) => providerHasConfig(config, providerId));
|
|
17
|
+
return false;
|
|
10
18
|
}
|
|
11
19
|
//#endregion
|
|
12
20
|
export { isSTTAvailable };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"availability.js","names":[],"sources":["../../../../src/voice/stt/availability.ts"],"sourcesContent":["import type { STTConfig } from './types.js';\
|
|
1
|
+
{"version":3,"file":"availability.js","names":[],"sources":["../../../../src/voice/stt/availability.ts"],"sourcesContent":["import type { STTConfig } from './types.js';\n\nfunction providerHasConfig(config: STTConfig, providerId: string): boolean {\n const provider = config.providers?.[providerId];\n if (provider && Object.keys(provider).length > 0) return true;\n return [...(config.models ?? []), ...(config.sharedModels ?? [])].some(\n (entry) => entry.provider === providerId && entry.capabilities?.includes('audio'),\n );\n}\n\n/**\n * Lightweight availability check for channel routing. Do not import the STT\n * factory/provider registry here; channel plugins call this at startup and the\n * provider registry pulls optional SDKs (e.g. openai) into Electron's dynamic\n * extension runtime path.\n */\nexport function isSTTAvailable(config?: STTConfig): boolean {\n if (!config?.enabled) return false;\n if (providerHasConfig(config, config.provider)) return true;\n if (config.fallback?.enabled) {\n return config.fallback.order.some((providerId) => providerHasConfig(config, providerId));\n }\n return false;\n}\n"],"mappings":";AAEA,SAAS,kBAAkB,QAAmB,YAA6B;CACzE,MAAM,WAAW,OAAO,YAAY;AACpC,KAAI,YAAY,OAAO,KAAK,SAAS,CAAC,SAAS,EAAG,QAAO;AACzD,QAAO,CAAC,GAAI,OAAO,UAAU,EAAE,EAAG,GAAI,OAAO,gBAAgB,EAAE,CAAE,CAAC,MAC/D,UAAU,MAAM,aAAa,cAAc,MAAM,cAAc,SAAS,QAAQ,CAClF;;;;;;;;AASH,SAAgB,eAAe,QAA6B;AAC1D,KAAI,CAAC,QAAQ,QAAS,QAAO;AAC7B,KAAI,kBAAkB,QAAQ,OAAO,SAAS,CAAE,QAAO;AACvD,KAAI,OAAO,UAAU,QACnB,QAAO,OAAO,SAAS,MAAM,MAAM,eAAe,kBAAkB,QAAQ,WAAW,CAAC;AAE1F,QAAO"}
|
|
@@ -4,7 +4,8 @@ import "./providers/index.js";
|
|
|
4
4
|
import { resolveSTTProviderChain, resolveSTTProviderConfig, resolveSTTProviderOrder } from "./factory.js";
|
|
5
5
|
import { transcribe } from "./transcribe-core.js";
|
|
6
6
|
import { isSTTAvailable } from "./availability.js";
|
|
7
|
-
import {
|
|
7
|
+
import { checkMentionInTranscription } from "./mention.js";
|
|
8
|
+
import { audioPreflightTranscribe } from "./preflight.js";
|
|
8
9
|
//#region src/voice/stt/index.ts
|
|
9
10
|
/**
|
|
10
11
|
* Single-provider transcription helper. Used by chat-commands /stt so a user
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/voice/stt/index.ts"],"sourcesContent":["/**\n * STT (Speech-to-Text) Module\n *\n * v2.0: providers implement MediaUnderstandingProvider; orchestration goes\n * through the media-understanding runner. The legacy `transcribe()` /\n * `isSTTAvailable()` API surface is preserved for channel adapters.\n */\n\nimport './providers/index.js'; // side-effect: register built-in STT providers\n\nimport type { STTConfig, STTOptions, STTResult } from './types.js';\nimport { transcribe } from './transcribe-core.js';\n\nexport { transcribe } from './transcribe-core.js';\nexport { isSTTAvailable } from './availability.js';\n\n/**\n * Single-provider transcription helper. Used by chat-commands /stt so a user\n * can force a specific provider regardless of fallback config.\n */\nexport async function transcribeWithProvider(\n audioBuffer: Buffer,\n providerName: string,\n config: STTConfig,\n options?: STTOptions,\n): Promise<STTResult> {\n // Build a per-call config that pins primary to the requested provider and\n // disables fallback. This routes through the same runner machinery without\n // needing a separate single-provider code path.\n const pinnedConfig: STTConfig = {\n ...config,\n provider: providerName,\n fallback: { enabled: false, order: [providerName] },\n };\n const result = await transcribe(audioBuffer, pinnedConfig, options);\n return {\n text: result.text,\n provider: result.provider,\n ...(result.duration !== undefined ? { duration: result.duration } : {}),\n ...(result.language ? { language: result.language } : {}),\n };\n}\n\nexport type {\n STTResult,\n STTOptions,\n STTConfig,\n STTResultWithTracking,\n STTProviderAttempt,\n STTProviderFailureReason,\n} from './types.js';\n\nexport { openAiTranscriptionProvider, alibabaTranscriptionProvider } from './providers/index.js';\n\nexport {\n resolveSTTProviderConfig,\n resolveSTTProviderChain,\n resolveSTTProviderOrder,\n} from './factory.js';\n\nexport { audioPreflightTranscribe, checkMentionInTranscription } from './preflight.js';\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/voice/stt/index.ts"],"sourcesContent":["/**\n * STT (Speech-to-Text) Module\n *\n * v2.0: providers implement MediaUnderstandingProvider; orchestration goes\n * through the media-understanding runner. The legacy `transcribe()` /\n * `isSTTAvailable()` API surface is preserved for channel adapters.\n */\n\nimport './providers/index.js'; // side-effect: register built-in STT providers\n\nimport type { STTConfig, STTOptions, STTResult } from './types.js';\nimport { transcribe } from './transcribe-core.js';\n\nexport { transcribe } from './transcribe-core.js';\nexport { isSTTAvailable } from './availability.js';\n\n/**\n * Single-provider transcription helper. Used by chat-commands /stt so a user\n * can force a specific provider regardless of fallback config.\n */\nexport async function transcribeWithProvider(\n audioBuffer: Buffer,\n providerName: string,\n config: STTConfig,\n options?: STTOptions,\n): Promise<STTResult> {\n // Build a per-call config that pins primary to the requested provider and\n // disables fallback. This routes through the same runner machinery without\n // needing a separate single-provider code path.\n const pinnedConfig: STTConfig = {\n ...config,\n provider: providerName,\n fallback: { enabled: false, order: [providerName] },\n };\n const result = await transcribe(audioBuffer, pinnedConfig, options);\n return {\n text: result.text,\n provider: result.provider,\n ...(result.duration !== undefined ? { duration: result.duration } : {}),\n ...(result.language ? { language: result.language } : {}),\n };\n}\n\nexport type {\n STTResult,\n STTOptions,\n STTConfig,\n STTResultWithTracking,\n STTProviderAttempt,\n STTProviderFailureReason,\n} from './types.js';\n\nexport { openAiTranscriptionProvider, alibabaTranscriptionProvider } from './providers/index.js';\n\nexport {\n resolveSTTProviderConfig,\n resolveSTTProviderChain,\n resolveSTTProviderOrder,\n} from './factory.js';\n\nexport { audioPreflightTranscribe, checkMentionInTranscription } from './preflight.js';\n"],"mappings":";;;;;;;;;;;;;AAoBA,eAAsB,uBACpB,aACA,cACA,QACA,SACoB;CASpB,MAAM,SAAS,MAAM,WAAW,aAAa;EAJ3C,GAAG;EACH,UAAU;EACV,UAAU;GAAE,SAAS;GAAO,OAAO,CAAC,aAAa;GAAE;EAEI,EAAE,QAAQ;AACnE,QAAO;EACL,MAAM,OAAO;EACb,UAAU,OAAO;EACjB,GAAI,OAAO,aAAa,KAAA,IAAY,EAAE,UAAU,OAAO,UAAU,GAAG,EAAE;EACtE,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,UAAU,GAAG,EAAE;EACzD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/voice/stt/mention.ts
|
|
2
|
+
/** Spoken @bot variants ("at botname", "hey botname") for STT text. */
|
|
3
|
+
function checkMentionInTranscription(transcribedText, botNames) {
|
|
4
|
+
const normalizedText = transcribedText.toLowerCase().trim();
|
|
5
|
+
for (const name of botNames) {
|
|
6
|
+
const normalizedName = name.toLowerCase().trim();
|
|
7
|
+
if (!normalizedName) continue;
|
|
8
|
+
if (normalizedText.includes(normalizedName)) return true;
|
|
9
|
+
if ([
|
|
10
|
+
`at ${normalizedName}`,
|
|
11
|
+
`hey ${normalizedName}`,
|
|
12
|
+
`hi ${normalizedName}`
|
|
13
|
+
].some((pattern) => normalizedText.includes(pattern))) return true;
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { checkMentionInTranscription };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=mention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mention.js","names":[],"sources":["../../../../src/voice/stt/mention.ts"],"sourcesContent":["/** Spoken @bot variants (\"at botname\", \"hey botname\") for STT text. */\nexport function checkMentionInTranscription(transcribedText: string, botNames: string[]): boolean {\n const normalizedText = transcribedText.toLowerCase().trim();\n\n for (const name of botNames) {\n const normalizedName = name.toLowerCase().trim();\n if (!normalizedName) continue;\n\n if (normalizedText.includes(normalizedName)) return true;\n\n const fuzzyPatterns = [`at ${normalizedName}`, `hey ${normalizedName}`, `hi ${normalizedName}`];\n if (fuzzyPatterns.some((pattern) => normalizedText.includes(pattern))) return true;\n }\n\n return false;\n}\n"],"mappings":";;AACA,SAAgB,4BAA4B,iBAAyB,UAA6B;CAChG,MAAM,iBAAiB,gBAAgB,aAAa,CAAC,MAAM;AAE3D,MAAK,MAAM,QAAQ,UAAU;EAC3B,MAAM,iBAAiB,KAAK,aAAa,CAAC,MAAM;AAChD,MAAI,CAAC,eAAgB;AAErB,MAAI,eAAe,SAAS,eAAe,CAAE,QAAO;AAGpD,MAAI;GADmB,MAAM;GAAkB,OAAO;GAAkB,MAAM;GAC7D,CAAC,MAAM,YAAY,eAAe,SAAS,QAAQ,CAAC,CAAE,QAAO;;AAGhF,QAAO"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { STTConfig } from './types.js';
|
|
2
|
+
export { checkMentionInTranscription } from './mention.js';
|
|
2
3
|
export interface AudioPreflightInput {
|
|
3
4
|
audioBuffer: Buffer;
|
|
4
5
|
mimeType?: string;
|
|
@@ -16,7 +17,3 @@ export interface AudioPreflightResult {
|
|
|
16
17
|
* Transcribe audio before mention routing (e.g. group voice → detect spoken @bot).
|
|
17
18
|
*/
|
|
18
19
|
export declare function audioPreflightTranscribe(input: AudioPreflightInput): Promise<AudioPreflightResult>;
|
|
19
|
-
/**
|
|
20
|
-
* Spoken @bot variants ("at botname", "hey botname") for STT text.
|
|
21
|
-
*/
|
|
22
|
-
export declare function checkMentionInTranscription(transcribedText: string, botNames: string[]): boolean;
|
|
@@ -2,6 +2,7 @@ import { createLogger } from "../../utils/logger/index.js";
|
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
3
|
import { transcribe } from "./transcribe-core.js";
|
|
4
4
|
import { isSTTAvailable } from "./availability.js";
|
|
5
|
+
import { checkMentionInTranscription } from "./mention.js";
|
|
5
6
|
//#region src/voice/stt/preflight.ts
|
|
6
7
|
init_logger();
|
|
7
8
|
const log = createLogger("STT:Preflight");
|
|
@@ -59,24 +60,6 @@ async function audioPreflightTranscribe(input) {
|
|
|
59
60
|
};
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
|
-
/**
|
|
63
|
-
* Spoken @bot variants ("at botname", "hey botname") for STT text.
|
|
64
|
-
*/
|
|
65
|
-
function checkMentionInTranscription(transcribedText, botNames) {
|
|
66
|
-
const normalizedText = transcribedText.toLowerCase().trim();
|
|
67
|
-
for (const name of botNames) {
|
|
68
|
-
const normalizedName = name.toLowerCase().trim();
|
|
69
|
-
if (!normalizedName) continue;
|
|
70
|
-
if (normalizedText.includes(normalizedName)) return true;
|
|
71
|
-
const fuzzyPatterns = [
|
|
72
|
-
`at ${normalizedName}`,
|
|
73
|
-
`hey ${normalizedName}`,
|
|
74
|
-
`hi ${normalizedName}`
|
|
75
|
-
];
|
|
76
|
-
for (const pattern of fuzzyPatterns) if (normalizedText.includes(pattern)) return true;
|
|
77
|
-
}
|
|
78
|
-
return false;
|
|
79
|
-
}
|
|
80
63
|
//#endregion
|
|
81
64
|
export { audioPreflightTranscribe, checkMentionInTranscription };
|
|
82
65
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.js","names":[],"sources":["../../../../src/voice/stt/preflight.ts"],"sourcesContent":["import type { STTConfig, STTResult } from './types.js';\nimport { transcribe } from './transcribe-core.js';\nimport { isSTTAvailable } from './availability.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('STT:Preflight');\n\nexport interface AudioPreflightInput {\n audioBuffer: Buffer;\n mimeType?: string;\n sttConfig: STTConfig;\n language?: string;\n}\n\nexport interface AudioPreflightResult {\n success: boolean;\n transcribedText?: string;\n provider?: string;\n duration?: number;\n error?: string;\n}\n\n/**\n * Transcribe audio before mention routing (e.g. group voice → detect spoken @bot).\n */\nexport async function audioPreflightTranscribe(\n input: AudioPreflightInput,\n): Promise<AudioPreflightResult> {\n const { audioBuffer, sttConfig, language } = input;\n\n if (!isSTTAvailable(sttConfig)) {\n log.debug('STT not available, skipping preflight');\n return { success: false, error: 'STT not available' };\n }\n\n if (!audioBuffer || audioBuffer.length === 0) {\n return { success: false, error: 'Empty audio buffer' };\n }\n\n const startTime = Date.now();\n\n try {\n const result: STTResult = await transcribe(audioBuffer, sttConfig, {\n language,\n });\n\n const duration = (Date.now() - startTime) / 1000;\n\n if (!result.text?.trim()) {\n log.debug({ duration }, 'Preflight transcription returned empty text');\n return {\n success: false,\n provider: result.provider,\n duration,\n error: 'Empty transcription result',\n };\n }\n\n log.info(\n {\n provider: result.provider,\n textLength: result.text.length,\n duration,\n },\n 'Audio preflight transcription completed',\n );\n\n return {\n success: true,\n transcribedText: result.text,\n provider: result.provider,\n duration,\n };\n } catch (error) {\n const duration = (Date.now() - startTime) / 1000;\n const errorMsg = error instanceof Error ? error.message : String(error);\n\n log.warn({ errorMessage: errorMsg, duration }, 'Audio preflight transcription failed');\n\n return {\n success: false,\n duration,\n error: errorMsg,\n };\n }\n}\n\n
|
|
1
|
+
{"version":3,"file":"preflight.js","names":[],"sources":["../../../../src/voice/stt/preflight.ts"],"sourcesContent":["import type { STTConfig, STTResult } from './types.js';\nimport { transcribe } from './transcribe-core.js';\nimport { isSTTAvailable } from './availability.js';\nexport { checkMentionInTranscription } from './mention.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('STT:Preflight');\n\nexport interface AudioPreflightInput {\n audioBuffer: Buffer;\n mimeType?: string;\n sttConfig: STTConfig;\n language?: string;\n}\n\nexport interface AudioPreflightResult {\n success: boolean;\n transcribedText?: string;\n provider?: string;\n duration?: number;\n error?: string;\n}\n\n/**\n * Transcribe audio before mention routing (e.g. group voice → detect spoken @bot).\n */\nexport async function audioPreflightTranscribe(\n input: AudioPreflightInput,\n): Promise<AudioPreflightResult> {\n const { audioBuffer, sttConfig, language } = input;\n\n if (!isSTTAvailable(sttConfig)) {\n log.debug('STT not available, skipping preflight');\n return { success: false, error: 'STT not available' };\n }\n\n if (!audioBuffer || audioBuffer.length === 0) {\n return { success: false, error: 'Empty audio buffer' };\n }\n\n const startTime = Date.now();\n\n try {\n const result: STTResult = await transcribe(audioBuffer, sttConfig, {\n language,\n });\n\n const duration = (Date.now() - startTime) / 1000;\n\n if (!result.text?.trim()) {\n log.debug({ duration }, 'Preflight transcription returned empty text');\n return {\n success: false,\n provider: result.provider,\n duration,\n error: 'Empty transcription result',\n };\n }\n\n log.info(\n {\n provider: result.provider,\n textLength: result.text.length,\n duration,\n },\n 'Audio preflight transcription completed',\n );\n\n return {\n success: true,\n transcribedText: result.text,\n provider: result.provider,\n duration,\n };\n } catch (error) {\n const duration = (Date.now() - startTime) / 1000;\n const errorMsg = error instanceof Error ? error.message : String(error);\n\n log.warn({ errorMessage: errorMsg, duration }, 'Audio preflight transcription failed');\n\n return {\n success: false,\n duration,\n error: errorMsg,\n };\n }\n}\n\n"],"mappings":";;;;;;aAIqD;AAErD,MAAM,MAAM,aAAa,gBAAgB;;;;AAoBzC,eAAsB,yBACpB,OAC+B;CAC/B,MAAM,EAAE,aAAa,WAAW,aAAa;AAE7C,KAAI,CAAC,eAAe,UAAU,EAAE;AAC9B,MAAI,MAAM,wCAAwC;AAClD,SAAO;GAAE,SAAS;GAAO,OAAO;GAAqB;;AAGvD,KAAI,CAAC,eAAe,YAAY,WAAW,EACzC,QAAO;EAAE,SAAS;EAAO,OAAO;EAAsB;CAGxD,MAAM,YAAY,KAAK,KAAK;AAE5B,KAAI;EACF,MAAM,SAAoB,MAAM,WAAW,aAAa,WAAW,EACjE,UACD,CAAC;EAEF,MAAM,YAAY,KAAK,KAAK,GAAG,aAAa;AAE5C,MAAI,CAAC,OAAO,MAAM,MAAM,EAAE;AACxB,OAAI,MAAM,EAAE,UAAU,EAAE,8CAA8C;AACtE,UAAO;IACL,SAAS;IACT,UAAU,OAAO;IACjB;IACA,OAAO;IACR;;AAGH,MAAI,KACF;GACE,UAAU,OAAO;GACjB,YAAY,OAAO,KAAK;GACxB;GACD,EACD,0CACD;AAED,SAAO;GACL,SAAS;GACT,iBAAiB,OAAO;GACxB,UAAU,OAAO;GACjB;GACD;UACM,OAAO;EACd,MAAM,YAAY,KAAK,KAAK,GAAG,aAAa;EAC5C,MAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAEvE,MAAI,KAAK;GAAE,cAAc;GAAU;GAAU,EAAE,uCAAuC;AAEtF,SAAO;GACL,SAAS;GACT;GACA,OAAO;GACR"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xopcai/xopc",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.106",
|
|
4
4
|
"description": "Goal Loop OS for long-term AI work: a local-first multi-surface agent system with workflow automation, multi-agent routing, and extensibility via extensions/skills.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
"semver": "^7.8.1",
|
|
101
101
|
"silk-wasm": "^3.7.1",
|
|
102
102
|
"thread-stream": "^4.2.0",
|
|
103
|
-
"undici": "^8.
|
|
103
|
+
"undici": "^8.5.0",
|
|
104
104
|
"uuid": "^14.0.0",
|
|
105
105
|
"ws": "^8.21.0",
|
|
106
106
|
"zod": "^4.4.3"
|