@teamlearners/clawops 0.25.0 → 0.25.1
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/agent/index.cjs +171 -83
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.d.cts +29 -0
- package/dist/agent/index.d.ts +29 -0
- package/dist/agent/index.js +108 -20
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/livekit/index.cjs +8 -8
- package/dist/agent/livekit/index.js +1 -1
- package/dist/{chunk-THZNZBP2.js → chunk-2QE6GHWC.js} +3 -3
- package/dist/{chunk-THZNZBP2.js.map → chunk-2QE6GHWC.js.map} +1 -1
- package/dist/{chunk-IVJXHNUN.cjs → chunk-M4QUDFGP.cjs} +3 -3
- package/dist/{chunk-IVJXHNUN.cjs.map → chunk-M4QUDFGP.cjs.map} +1 -1
- package/dist/{chunk-2BAYUQ7O.js → chunk-WKGTY7QT.js} +4 -3
- package/dist/chunk-WKGTY7QT.js.map +1 -0
- package/dist/{chunk-U4UFTVLX.cjs → chunk-XAOA3XFQ.cjs} +4 -2
- package/dist/chunk-XAOA3XFQ.cjs.map +1 -0
- package/dist/index.cjs +35 -35
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-2BAYUQ7O.js.map +0 -1
- package/dist/chunk-U4UFTVLX.cjs.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var chunkM4QUDFGP_cjs = require('./chunk-M4QUDFGP.cjs');
|
|
6
6
|
var zod = require('zod');
|
|
7
7
|
var crypto = require('crypto');
|
|
8
8
|
|
|
@@ -13,11 +13,11 @@ function validateBaseUrl(url) {
|
|
|
13
13
|
try {
|
|
14
14
|
parsed = new URL(url);
|
|
15
15
|
} catch {
|
|
16
|
-
throw new
|
|
16
|
+
throw new chunkM4QUDFGP_cjs.ClawOpsError(`Invalid base_url: ${url}`);
|
|
17
17
|
}
|
|
18
18
|
if (parsed.protocol === "https:") return url;
|
|
19
19
|
if (parsed.protocol === "http:" && LOCALHOST_HOSTS.has(parsed.hostname)) return url;
|
|
20
|
-
throw new
|
|
20
|
+
throw new chunkM4QUDFGP_cjs.ClawOpsError(
|
|
21
21
|
`base_url\uC740 HTTPS\uB97C \uC0AC\uC6A9\uD574\uC57C \uD569\uB2C8\uB2E4 (\uBC1B\uC740 \uAC12: '${url}'). \uB85C\uCEEC \uAC1C\uBC1C \uC2DC\uC5D0\uB294 http://localhost\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.`
|
|
22
22
|
);
|
|
23
23
|
}
|
|
@@ -30,9 +30,9 @@ var APIClient = class {
|
|
|
30
30
|
_defaultHeaders;
|
|
31
31
|
constructor(options) {
|
|
32
32
|
this._apiKey = options.apiKey;
|
|
33
|
-
this._baseURL = validateBaseUrl((options.baseURL ??
|
|
34
|
-
this._maxRetries = options.maxRetries ??
|
|
35
|
-
this._timeout = options.timeout ??
|
|
33
|
+
this._baseURL = validateBaseUrl((options.baseURL ?? chunkM4QUDFGP_cjs.DEFAULT_BASE_URL).replace(/\/+$/, ""));
|
|
34
|
+
this._maxRetries = options.maxRetries ?? chunkM4QUDFGP_cjs.DEFAULT_MAX_RETRIES;
|
|
35
|
+
this._timeout = options.timeout ?? chunkM4QUDFGP_cjs.DEFAULT_TIMEOUT;
|
|
36
36
|
this._fetch = options.fetch ?? globalThis.fetch;
|
|
37
37
|
this._defaultHeaders = options.defaultHeaders ?? {};
|
|
38
38
|
}
|
|
@@ -41,7 +41,7 @@ var APIClient = class {
|
|
|
41
41
|
Authorization: `Bearer ${this._apiKey}`,
|
|
42
42
|
"Content-Type": "application/json",
|
|
43
43
|
Accept: "application/json",
|
|
44
|
-
"User-Agent": `claw-ops-node/${
|
|
44
|
+
"User-Agent": `claw-ops-node/${chunkM4QUDFGP_cjs.VERSION}`,
|
|
45
45
|
...this._defaultHeaders
|
|
46
46
|
};
|
|
47
47
|
if (extra) Object.assign(headers, extra);
|
|
@@ -77,14 +77,14 @@ var APIClient = class {
|
|
|
77
77
|
await this._sleep(this._retryDelay(this._maxRetries - retriesLeft));
|
|
78
78
|
continue;
|
|
79
79
|
}
|
|
80
|
-
throw new
|
|
80
|
+
throw new chunkM4QUDFGP_cjs.APITimeoutError({ method: method2, url });
|
|
81
81
|
}
|
|
82
82
|
if (retriesLeft > 0) {
|
|
83
83
|
retriesLeft--;
|
|
84
84
|
await this._sleep(this._retryDelay(this._maxRetries - retriesLeft));
|
|
85
85
|
continue;
|
|
86
86
|
}
|
|
87
|
-
throw new
|
|
87
|
+
throw new chunkM4QUDFGP_cjs.APIConnectionError({ method: method2, url });
|
|
88
88
|
} finally {
|
|
89
89
|
clearTimeout(timeoutId);
|
|
90
90
|
}
|
|
@@ -100,7 +100,7 @@ var APIClient = class {
|
|
|
100
100
|
} catch {
|
|
101
101
|
body = null;
|
|
102
102
|
}
|
|
103
|
-
throw
|
|
103
|
+
throw chunkM4QUDFGP_cjs.makeStatusError(response.status, body, response.headers, { method: method2, url });
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
106
|
async _request(method2, path, options = {}) {
|
|
@@ -111,11 +111,11 @@ var APIClient = class {
|
|
|
111
111
|
try {
|
|
112
112
|
json = await response.json();
|
|
113
113
|
} catch {
|
|
114
|
-
throw new
|
|
114
|
+
throw new chunkM4QUDFGP_cjs.APIResponseValidationError({ status: response.status }, { method: method2, url });
|
|
115
115
|
}
|
|
116
116
|
const parsed = options.castTo.safeParse(json);
|
|
117
117
|
if (!parsed.success) {
|
|
118
|
-
throw new
|
|
118
|
+
throw new chunkM4QUDFGP_cjs.APIResponseValidationError({ status: response.status }, { method: method2, url });
|
|
119
119
|
}
|
|
120
120
|
return parsed.data;
|
|
121
121
|
}
|
|
@@ -123,7 +123,7 @@ var APIClient = class {
|
|
|
123
123
|
return status === 408 || status === 409 || status === 429 || status >= 500;
|
|
124
124
|
}
|
|
125
125
|
_retryDelay(retriesTaken) {
|
|
126
|
-
const delay = Math.min(
|
|
126
|
+
const delay = Math.min(chunkM4QUDFGP_cjs.INITIAL_RETRY_DELAY * 2 ** retriesTaken, chunkM4QUDFGP_cjs.MAX_RETRY_DELAY);
|
|
127
127
|
return delay * (1 + Math.random());
|
|
128
128
|
}
|
|
129
129
|
_sleep(ms) {
|
|
@@ -762,7 +762,7 @@ var AccountContext = class {
|
|
|
762
762
|
return new AssignmentLinks(this._client, this._accountId);
|
|
763
763
|
}
|
|
764
764
|
};
|
|
765
|
-
var WebhookVerificationError = class extends
|
|
765
|
+
var WebhookVerificationError = class extends chunkM4QUDFGP_cjs.ClawOpsError {
|
|
766
766
|
constructor(message = "Webhook \uC11C\uBA85\uC774 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.") {
|
|
767
767
|
super(message);
|
|
768
768
|
this.name = "WebhookVerificationError";
|
|
@@ -792,13 +792,13 @@ var ClawOps = class extends APIClient {
|
|
|
792
792
|
constructor(options = {}) {
|
|
793
793
|
let apiKey = options.apiKey ?? process.env.CLAWOPS_API_KEY;
|
|
794
794
|
if (!apiKey) {
|
|
795
|
-
throw new
|
|
795
|
+
throw new chunkM4QUDFGP_cjs.ClawOpsError("apiKey\uB97C \uC9C0\uC815\uD558\uAC70\uB098 CLAWOPS_API_KEY \uD658\uACBD\uBCC0\uC218\uB97C \uC124\uC815\uD558\uC138\uC694.");
|
|
796
796
|
}
|
|
797
797
|
let accountId = options.accountId ?? process.env.CLAWOPS_ACCOUNT_ID;
|
|
798
798
|
if (!accountId) {
|
|
799
|
-
throw new
|
|
799
|
+
throw new chunkM4QUDFGP_cjs.ClawOpsError("accountId\uB97C \uC9C0\uC815\uD558\uAC70\uB098 CLAWOPS_ACCOUNT_ID \uD658\uACBD\uBCC0\uC218\uB97C \uC124\uC815\uD558\uC138\uC694.");
|
|
800
800
|
}
|
|
801
|
-
const baseURL = options.baseURL ?? process.env.CLAWOPS_BASE_URL ??
|
|
801
|
+
const baseURL = options.baseURL ?? process.env.CLAWOPS_BASE_URL ?? chunkM4QUDFGP_cjs.DEFAULT_BASE_URL;
|
|
802
802
|
super({
|
|
803
803
|
apiKey,
|
|
804
804
|
baseURL,
|
|
@@ -846,75 +846,75 @@ var client_default_default = ClawOps;
|
|
|
846
846
|
|
|
847
847
|
Object.defineProperty(exports, "APIConnectionError", {
|
|
848
848
|
enumerable: true,
|
|
849
|
-
get: function () { return
|
|
849
|
+
get: function () { return chunkM4QUDFGP_cjs.APIConnectionError; }
|
|
850
850
|
});
|
|
851
851
|
Object.defineProperty(exports, "APIError", {
|
|
852
852
|
enumerable: true,
|
|
853
|
-
get: function () { return
|
|
853
|
+
get: function () { return chunkM4QUDFGP_cjs.APIError; }
|
|
854
854
|
});
|
|
855
855
|
Object.defineProperty(exports, "APIResponseValidationError", {
|
|
856
856
|
enumerable: true,
|
|
857
|
-
get: function () { return
|
|
857
|
+
get: function () { return chunkM4QUDFGP_cjs.APIResponseValidationError; }
|
|
858
858
|
});
|
|
859
859
|
Object.defineProperty(exports, "APIStatusError", {
|
|
860
860
|
enumerable: true,
|
|
861
|
-
get: function () { return
|
|
861
|
+
get: function () { return chunkM4QUDFGP_cjs.APIStatusError; }
|
|
862
862
|
});
|
|
863
863
|
Object.defineProperty(exports, "APITimeoutError", {
|
|
864
864
|
enumerable: true,
|
|
865
|
-
get: function () { return
|
|
865
|
+
get: function () { return chunkM4QUDFGP_cjs.APITimeoutError; }
|
|
866
866
|
});
|
|
867
867
|
Object.defineProperty(exports, "AgentConnectionError", {
|
|
868
868
|
enumerable: true,
|
|
869
|
-
get: function () { return
|
|
869
|
+
get: function () { return chunkM4QUDFGP_cjs.AgentConnectionError; }
|
|
870
870
|
});
|
|
871
871
|
Object.defineProperty(exports, "AgentError", {
|
|
872
872
|
enumerable: true,
|
|
873
|
-
get: function () { return
|
|
873
|
+
get: function () { return chunkM4QUDFGP_cjs.AgentError; }
|
|
874
874
|
});
|
|
875
875
|
Object.defineProperty(exports, "AuthenticationError", {
|
|
876
876
|
enumerable: true,
|
|
877
|
-
get: function () { return
|
|
877
|
+
get: function () { return chunkM4QUDFGP_cjs.AuthenticationError; }
|
|
878
878
|
});
|
|
879
879
|
Object.defineProperty(exports, "BadRequestError", {
|
|
880
880
|
enumerable: true,
|
|
881
|
-
get: function () { return
|
|
881
|
+
get: function () { return chunkM4QUDFGP_cjs.BadRequestError; }
|
|
882
882
|
});
|
|
883
883
|
Object.defineProperty(exports, "ClawOpsError", {
|
|
884
884
|
enumerable: true,
|
|
885
|
-
get: function () { return
|
|
885
|
+
get: function () { return chunkM4QUDFGP_cjs.ClawOpsError; }
|
|
886
886
|
});
|
|
887
887
|
Object.defineProperty(exports, "ConflictError", {
|
|
888
888
|
enumerable: true,
|
|
889
|
-
get: function () { return
|
|
889
|
+
get: function () { return chunkM4QUDFGP_cjs.ConflictError; }
|
|
890
890
|
});
|
|
891
891
|
Object.defineProperty(exports, "InternalServerError", {
|
|
892
892
|
enumerable: true,
|
|
893
|
-
get: function () { return
|
|
893
|
+
get: function () { return chunkM4QUDFGP_cjs.InternalServerError; }
|
|
894
894
|
});
|
|
895
895
|
Object.defineProperty(exports, "NotFoundError", {
|
|
896
896
|
enumerable: true,
|
|
897
|
-
get: function () { return
|
|
897
|
+
get: function () { return chunkM4QUDFGP_cjs.NotFoundError; }
|
|
898
898
|
});
|
|
899
899
|
Object.defineProperty(exports, "PermissionDeniedError", {
|
|
900
900
|
enumerable: true,
|
|
901
|
-
get: function () { return
|
|
901
|
+
get: function () { return chunkM4QUDFGP_cjs.PermissionDeniedError; }
|
|
902
902
|
});
|
|
903
903
|
Object.defineProperty(exports, "RateLimitError", {
|
|
904
904
|
enumerable: true,
|
|
905
|
-
get: function () { return
|
|
905
|
+
get: function () { return chunkM4QUDFGP_cjs.RateLimitError; }
|
|
906
906
|
});
|
|
907
907
|
Object.defineProperty(exports, "ServiceUnavailableError", {
|
|
908
908
|
enumerable: true,
|
|
909
|
-
get: function () { return
|
|
909
|
+
get: function () { return chunkM4QUDFGP_cjs.ServiceUnavailableError; }
|
|
910
910
|
});
|
|
911
911
|
Object.defineProperty(exports, "UnprocessableEntityError", {
|
|
912
912
|
enumerable: true,
|
|
913
|
-
get: function () { return
|
|
913
|
+
get: function () { return chunkM4QUDFGP_cjs.UnprocessableEntityError; }
|
|
914
914
|
});
|
|
915
915
|
Object.defineProperty(exports, "VERSION", {
|
|
916
916
|
enumerable: true,
|
|
917
|
-
get: function () { return
|
|
917
|
+
get: function () { return chunkM4QUDFGP_cjs.VERSION; }
|
|
918
918
|
});
|
|
919
919
|
exports.APIClient = APIClient;
|
|
920
920
|
exports.AccountContext = AccountContext;
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { DEFAULT_BASE_URL, DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT, VERSION, APITimeoutError, APIConnectionError, makeStatusError, APIResponseValidationError, ClawOpsError, INITIAL_RETRY_DELAY, MAX_RETRY_DELAY } from './chunk-
|
|
2
|
-
export { APIConnectionError, APIError, APIResponseValidationError, APIStatusError, APITimeoutError, AgentConnectionError, AgentError, AuthenticationError, BadRequestError, ClawOpsError, ConflictError, InternalServerError, NotFoundError, PermissionDeniedError, RateLimitError, ServiceUnavailableError, UnprocessableEntityError, VERSION } from './chunk-
|
|
1
|
+
import { DEFAULT_BASE_URL, DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT, VERSION, APITimeoutError, APIConnectionError, makeStatusError, APIResponseValidationError, ClawOpsError, INITIAL_RETRY_DELAY, MAX_RETRY_DELAY } from './chunk-2QE6GHWC.js';
|
|
2
|
+
export { APIConnectionError, APIError, APIResponseValidationError, APIStatusError, APITimeoutError, AgentConnectionError, AgentError, AuthenticationError, BadRequestError, ClawOpsError, ConflictError, InternalServerError, NotFoundError, PermissionDeniedError, RateLimitError, ServiceUnavailableError, UnprocessableEntityError, VERSION } from './chunk-2QE6GHWC.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { timingSafeEqual, createHmac } from 'crypto';
|
|
5
5
|
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent/audio.ts","../src/agent/logger.ts","../src/agent/builtin-tool.ts","../src/agent/pipeline/builtin-tool-schemas.ts","../src/agent/pipeline/buffering-call.ts"],"names":["BuiltinTool"],"mappings":";;;AAIA,IAAM,KAAA,GAAQ,GAAA;AACd,IAAM,KAAA,GAAQ,KAAA;AAGd,IAAM,YAAA,GAAkC;AAAA,EACtC,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxD,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxD,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxD,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAS,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAS,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAS,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAS,EAAA;AAAA,EAAS,CAAA;AAAA,EAC5D,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAS,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAS,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;A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","file":"chunk-2BAYUQ7O.js","sourcesContent":["/**\n * Audio codec utilities: PCM16 <-> ulaw conversion and resampling.\n */\n\nconst _BIAS = 0x84;\nconst _CLIP = 32635;\n\n// prettier-ignore\nconst DECODE_TABLE: readonly number[] = [\n -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,\n -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,\n -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,\n -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316,\n -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,\n -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,\n -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,\n -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,\n -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,\n -1372, -1308, -1244, -1180, -1116, -1052, -988, -924,\n -876, -844, -812, -780, -748, -716, -684, -652,\n -620, -588, -556, -524, -492, -460, -428, -396,\n -372, -356, -340, -324, -308, -292, -276, -260,\n -244, -228, -212, -196, -180, -164, -148, -132,\n -120, -112, -104, -96, -88, -80, -72, -64,\n -56, -48, -40, -32, -24, -16, -8, 0,\n 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,\n 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,\n 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,\n 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,\n 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,\n 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,\n 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,\n 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,\n 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,\n 1372, 1308, 1244, 1180, 1116, 1052, 988, 924,\n 876, 844, 812, 780, 748, 716, 684, 652,\n 620, 588, 556, 524, 492, 460, 428, 396,\n 372, 356, 340, 324, 308, 292, 276, 260,\n 244, 228, 212, 196, 180, 164, 148, 132,\n 120, 112, 104, 96, 88, 80, 72, 64,\n 56, 48, 40, 32, 24, 16, 8, 0,\n];\n\nfunction encodeUlawSample(sample: number): number {\n let sign = 0;\n if (sample < 0) {\n sign = 0x80;\n sample = -sample;\n }\n if (sample > _CLIP) {\n sample = _CLIP;\n }\n sample += _BIAS;\n\n let exponent = 7;\n const expValues = [0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100];\n for (const expVal of expValues) {\n if (sample >= expVal) {\n break;\n }\n exponent -= 1;\n }\n\n const mantissa = (sample >> (exponent + 3)) & 0x0f;\n return ~(sign | (exponent << 4) | mantissa) & 0xff;\n}\n\n/**\n * Convert PCM16 little-endian audio to ulaw.\n */\nexport function pcm16ToUlaw(pcm: Buffer): Buffer {\n if (!pcm.length) return Buffer.alloc(0);\n const nSamples = pcm.length >> 1;\n const out = Buffer.alloc(nSamples);\n for (let i = 0; i < nSamples; i++) {\n const sample = pcm.readInt16LE(i * 2);\n out[i] = encodeUlawSample(sample);\n }\n return out;\n}\n\n/**\n * Convert ulaw audio to PCM16 little-endian.\n */\nexport function ulawToPcm16(ulaw: Buffer): Buffer {\n if (!ulaw.length) return Buffer.alloc(0);\n const out = Buffer.alloc(ulaw.length * 2);\n for (let i = 0; i < ulaw.length; i++) {\n out.writeInt16LE(DECODE_TABLE[ulaw[i]!]!, i * 2);\n }\n return out;\n}\n\n/**\n * Apply multiplicative gain to PCM16 little-endian audio.\n * gain=1.0 is pass-through, 0 is mute, 2.0 is 2x amplification (clipped to int16 range).\n */\nexport function applyPcm16Gain(pcm: Buffer, gain: number): Buffer {\n if (!pcm.length) return Buffer.alloc(0);\n if (gain === 1.0) return pcm;\n if (!Number.isFinite(gain) || gain < 0) {\n throw new Error('gain must be a finite number >= 0');\n }\n const nSamples = pcm.length >> 1;\n const out = Buffer.alloc(nSamples * 2);\n for (let i = 0; i < nSamples; i++) {\n let value = Math.round(pcm.readInt16LE(i * 2) * gain);\n if (value > 32767) value = 32767;\n else if (value < -32768) value = -32768;\n out.writeInt16LE(value, i * 2);\n }\n return out;\n}\n\n/**\n * Apply multiplicative gain to G.711 mu-law audio.\n */\nexport function applyUlawGain(ulaw: Buffer, gain: number): Buffer {\n if (!ulaw.length) return Buffer.alloc(0);\n if (gain === 1.0) return ulaw;\n return pcm16ToUlaw(applyPcm16Gain(ulawToPcm16(ulaw), gain));\n}\n\n/**\n * Resample PCM16 audio using linear interpolation.\n */\nexport function resamplePcm16(pcm: Buffer, fromRate: number, toRate: number): Buffer {\n if (fromRate === toRate || !pcm.length) return pcm;\n\n const nSamples = pcm.length >> 1;\n const ratio = fromRate / toRate;\n const outLen = Math.floor(nSamples / ratio);\n const out = Buffer.alloc(outLen * 2);\n\n for (let i = 0; i < outLen; i++) {\n const srcPos = i * ratio;\n const idx = Math.floor(srcPos);\n const frac = srcPos - idx;\n\n let val: number;\n if (idx + 1 < nSamples) {\n val = pcm.readInt16LE(idx * 2) * (1 - frac) + pcm.readInt16LE((idx + 1) * 2) * frac;\n } else {\n val = pcm.readInt16LE(idx * 2);\n }\n out.writeInt16LE(Math.round(val), i * 2);\n }\n\n return out;\n}\n\nexport { DECODE_TABLE };\n","/**\n * Logger factory for the ClawOps agent module.\n *\n * Provides a 2-level hierarchy matching the Python SDK:\n * - clawops.agent (core: agent, session, control-ws, media-ws, recorder, mcp, realtime)\n * - clawops.agent.pipeline (pipeline: pipeline-session, stt, tts)\n */\n\nimport pino from 'pino';\nimport type { Logger } from 'pino';\n\nconst DEFAULT_LOGGER = pino({ name: 'clawops.agent' });\n\n/** A silent logger that discards all output. */\nexport const NOOP_LOGGER = pino({ level: 'silent' });\n\n/**\n * Create or return an agent-level logger.\n * If no user logger is provided, returns the default pino instance.\n */\nexport function createAgentLogger(userLogger?: Logger): Logger {\n return userLogger ?? DEFAULT_LOGGER;\n}\n\n/**\n * Create a pipeline child logger from a parent agent logger.\n * Adds `{ module: 'pipeline' }` to all log entries.\n */\nexport function createPipelineLogger(parent: Logger): Logger {\n return parent.child({ module: 'pipeline' });\n}\n\nexport type { Logger };\n","/**\n * Built-in tool definitions and selection constants.\n */\n\nexport enum BuiltinTool {\n /** 전화 종료 도구. AI가 대화 완료 시 통화를 종료합니다. */\n HANG_UP = 'hang_up',\n /** DTMF 수집 도구. 사용자의 키패드 입력을 수집합니다. */\n COLLECT_DTMF = 'collect_dtmf',\n /** DTMF 전송 도구. ARS 탐색이나 내선번호 입력에 사용합니다. */\n SEND_DTMF = 'send_dtmf',\n /** 통화 전환 도구. 현재 통화를 다른 번호로 전환합니다. */\n TRANSFER_CALL = 'transfer_call',\n\n /** 모든 내장 도구를 활성화합니다. (기본값) */\n ALL = 'all',\n /** 모든 내장 도구를 비활성화합니다. */\n NONE = 'none',\n}\n\nconst INDIVIDUAL_TOOLS = new Set([\n BuiltinTool.HANG_UP,\n BuiltinTool.COLLECT_DTMF,\n BuiltinTool.SEND_DTMF,\n BuiltinTool.TRANSFER_CALL,\n]);\n\nexport function resolveBuiltinTools(\n value: BuiltinTool | BuiltinTool[],\n): Set<BuiltinTool> {\n if (typeof value === 'string') {\n if (value === BuiltinTool.ALL) {\n return new Set(INDIVIDUAL_TOOLS);\n }\n if (value === BuiltinTool.NONE) {\n return new Set();\n }\n return new Set([value]);\n }\n return new Set(value.filter((t) => INDIVIDUAL_TOOLS.has(t)));\n}\n","/**\n * Built-in tool 스키마 정의, 포맷 변환, 실행 헬퍼.\n *\n * 모든 세션(PipelineSession, OpenAIRealtime, GeminiRealtime)이 공통으로 사용하는\n * 내장 도구 스키마를 한 곳에서 관리한다.\n */\n\nimport { BuiltinTool } from '../builtin-tool.js';\nimport type { CallSession } from '../session.js';\n\n// ── 정규 스키마 (neutral 포맷) ──────────────────────────────────────\n\nconst HANG_UP = {\n name: 'hang_up',\n description:\n 'End the phone call. Use when the conversation is finished or the caller says goodbye.',\n parameters: { type: 'object' as const, properties: {} as Record<string, unknown> },\n} as const;\n\nconst COLLECT_DTMF = {\n name: 'collect_dtmf',\n description:\n '사용자로부터 DTMF(전화 키패드) 입력을 수집합니다. 반드시 사용자에게 무엇을 입력해야 하는지 안내한 후 호출하세요.',\n parameters: {\n type: 'object' as const,\n properties: {\n max_digits: { type: 'integer' as const, description: '수집할 최대 자릿수' },\n finish_on_key: { type: 'string' as const, description: '입력 종료 키 (기본: #)' },\n timeout: { type: 'integer' as const, description: '입력 대기 시간(초, 기본: 5)' },\n },\n required: ['max_digits'] as string[],\n },\n} as const;\n\nconst SEND_DTMF = {\n name: 'send_dtmf',\n description: 'DTMF 신호를 전송합니다. ARS 메뉴 탐색이나 내선번호 입력 시 사용합니다.',\n parameters: {\n type: 'object' as const,\n properties: {\n digits: {\n type: 'string' as const,\n description:\n \"전송할 번호 (0-9, *, #). 'w'는 500ms 대기, 'W'는 1000ms 대기. 예: '1', '1234#', '1w2'\",\n },\n },\n required: ['digits'] as string[],\n },\n} as const;\n\nconst TRANSFER_CALL = {\n name: 'transfer_call',\n description:\n 'Transfer the current call to another phone number or SIP endpoint. Use for blind transfer (direct handoff) or warm transfer (with whisper message to the target).',\n parameters: {\n type: 'object' as const,\n properties: {\n to: { type: 'string' as const, description: \"Transfer destination. A phone number when destination_type is 'pstn', or a SIP URI (e.g. 'sip:user@host') when destination_type is 'sip'.\" },\n destination_type: { type: 'string' as const, enum: ['pstn', 'sip'], description: 'pstn: dial a phone number via carrier (default). sip: connect directly to a SIP endpoint (no carrier/PSTN).' },\n mode: { type: 'string' as const, enum: ['blind', 'warm'], description: 'blind: direct transfer (default), warm: play whisper to target first' },\n after_transfer: { type: 'string' as const, enum: ['terminate', 'return'], description: 'terminate: end AI session (default), return: AI resumes after transfer ends' },\n whisper: { type: 'string' as const, description: 'Message to speak to transfer target before connecting customer (warm mode only)' },\n caller_id: { type: 'string' as const, description: 'Override caller ID for the transfer leg' },\n timeout: { type: 'integer' as const, description: 'Seconds to wait for transfer target to answer (default 30)' },\n },\n required: ['to'] as string[],\n },\n} as const;\n\ntype NeutralSchema = typeof HANG_UP | typeof COLLECT_DTMF | typeof SEND_DTMF | typeof TRANSFER_CALL;\n\nconst TOOL_MAP = new Map<BuiltinTool, NeutralSchema>([\n [BuiltinTool.HANG_UP, HANG_UP],\n [BuiltinTool.COLLECT_DTMF, COLLECT_DTMF],\n [BuiltinTool.SEND_DTMF, SEND_DTMF],\n [BuiltinTool.TRANSFER_CALL, TRANSFER_CALL],\n]);\n\nexport const BUILTIN_TOOL_NAMES: Set<string> = new Set(\n Array.from(TOOL_MAP.values()).map((s) => s.name),\n);\n\n// ── 포맷 변환 ───────────────────────────────────────────────────────\n\nfunction toChatCompletions(schema: NeutralSchema): Record<string, unknown> {\n return {\n type: 'function',\n function: {\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n },\n };\n}\n\nfunction toRealtime(schema: NeutralSchema): Record<string, unknown> {\n return {\n type: 'function',\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n };\n}\n\nfunction toGemini(schema: NeutralSchema): Record<string, unknown> {\n return {\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n };\n}\n\nconst CONVERTERS = {\n chat: toChatCompletions,\n realtime: toRealtime,\n gemini: toGemini,\n} as const;\n\n/**\n * 활성화된 builtin tool 스키마를 요청한 포맷으로 반환.\n */\nexport function getBuiltinToolSchemas(\n builtinTools: Set<BuiltinTool> | null,\n fmt: 'chat' | 'realtime' | 'gemini',\n): Array<Record<string, unknown>> {\n const converter = CONVERTERS[fmt];\n const result: Array<Record<string, unknown>> = [];\n for (const [toolEnum, schema] of TOOL_MAP) {\n if (builtinTools === null || builtinTools.has(toolEnum)) {\n result.push(converter(schema));\n }\n }\n return result;\n}\n\n// ── 공통 실행 헬퍼 ──────────────────────────────────────────────────\n\n/**\n * Builtin tool을 실행하고 결과 문자열을 반환한다.\n *\n * `funcName`이 builtin tool이 아니면 `null`을 반환한다.\n * `hang_up`의 경우 빈 문자열 `\"\"`을 반환한다 (호출자가 종료 처리).\n */\nexport function isBuiltinTool(name: string): boolean {\n return BUILTIN_TOOL_NAMES.has(name);\n}\n\nexport async function executeBuiltinTool(\n funcName: string,\n args: Record<string, unknown>,\n call: CallSession,\n): Promise<string | null> {\n if (funcName === 'hang_up') {\n await call.hangup();\n return '';\n }\n if (funcName === 'collect_dtmf') {\n try {\n const result = await call.collectDtmf({\n maxDigits: (args['max_digits'] as number) ?? 4,\n finishOnKey: (args['finish_on_key'] as string) ?? '#',\n timeout: (args['timeout'] as number) ?? 5,\n });\n return result || '(타임아웃 - 입력 없음)';\n } catch (e) {\n return `Error: ${e}`;\n }\n }\n if (funcName === 'send_dtmf') {\n try {\n await call.sendDtmfSequence((args['digits'] as string) ?? '');\n return 'sent';\n } catch (e) {\n return `Error: ${e}`;\n }\n }\n if (funcName === 'transfer_call') {\n try {\n // Fire-and-forget: transfer 요청만 보내고 즉시 반환.\n // call-engine이 transfer 시작 시 media WS를 닫으므로,\n // 결과를 await하면 LLM 세션이 먼저 종료된다.\n call.transfer(args['to'] as string, {\n destinationType: (args['destination_type'] as 'pstn' | 'sip') ?? undefined,\n mode: (args['mode'] as 'blind' | 'warm') ?? undefined,\n afterTransfer: (args['after_transfer'] as 'terminate' | 'return') ?? undefined,\n whisper: args['whisper'] as string ?? undefined,\n callerId: args['caller_id'] as string ?? undefined,\n timeout: args['timeout'] as number ?? undefined,\n }).catch(() => {});\n return JSON.stringify({ status: 'transfer_initiated' });\n } catch (e) {\n return `Error: ${e}`;\n }\n }\n return null;\n}\n","/**\n * prewarm 단계에서 사용되는 CallSession stub.\n *\n * Session 구현체가 sendAudio() 를 호출하면 메모리 버퍼에 누적한다.\n * attach() 시점에 drainBuffer() 로 꺼내 실제 CallSession 에 flush.\n *\n * Python SDK 의 `_BufferingCall` mirror.\n */\n\nimport type { CallSession } from '../session.js';\n\nclass MetricsStub {\n recordToolCall(): void {}\n recordInterrupt(): void {}\n recordToolError(): void {}\n}\n\nexport class BufferingCall {\n private _buffer: Buffer[] = [];\n private _droppedEvents: Record<string, number> = {};\n readonly metrics = new MetricsStub();\n\n async sendAudio(chunk: Buffer): Promise<void> {\n this._buffer.push(chunk);\n }\n\n /** clearAudio 도 prewarm 동안엔 no-op (드물긴 하지만 안전하게). */\n clearAudio(): void {\n this._buffer = [];\n }\n\n /**\n * transcript 등 lifecycle 이벤트는 prewarm 동안 무시한다. silent drop 은 디버깅이\n * 어려우므로 event name 별 카운터로 누적하고 attachBuffered() 시 한 번에 로깅한다.\n */\n _emit(...args: unknown[]): void {\n this._recordDropped(args);\n }\n\n async emit(...args: unknown[]): Promise<void> {\n this._recordDropped(args);\n }\n\n private _recordDropped(args: unknown[]): void {\n let eventName = '?';\n if (args.length > 0 && typeof args[0] === 'string') {\n eventName = args[0];\n }\n this._droppedEvents[eventName] = (this._droppedEvents[eventName] ?? 0) + 1;\n }\n\n recordToolCall(): void {}\n recordToolError(): void {}\n recordFirstResponse(): void {}\n recordBargeIn(): void {}\n\n drainBuffer(): Buffer[] {\n const out = this._buffer;\n this._buffer = [];\n return out;\n }\n\n drainDroppedEvents(): Record<string, number> {\n const out = this._droppedEvents;\n this._droppedEvents = {};\n return out;\n }\n}\n\n/**\n * prewarm → attach 전환 시 BufferingCall 에 쌓인 audio chunk 를 실제\n * CallSession 으로 flush 하는 공통 헬퍼. OpenAI / Gemini / PipelineSession\n * attach() 가 동일 패턴이므로 한 곳에서 관리한다.\n *\n * 반환값: 한 개 이상의 chunk 를 drain 했으면 true. drain 시 PREWARM-T first-audio\n * 마커를 한 번 emit 한다. drained 가 비어 있으면 false 를 반환하여 호출자(Session)\n * 가 첫 실시간 audio.delta 송출 시 logFirstRealtimeAudio() 로 한 번만 마커를 찍을\n * 수 있게 한다.\n */\nexport function attachBuffered(\n prev: BufferingCall | CallSession | null,\n next: CallSession,\n): boolean {\n if (!(prev instanceof BufferingCall)) {\n return false;\n }\n\n const drained = prev.drainBuffer();\n const flushed = drained.length > 0;\n const callId = (next as { callId?: string }).callId ?? '?';\n\n if (flushed) {\n // eslint-disable-next-line no-console\n console.info(\n `[PREWARM-T] first-audio call_id=${callId} ` +\n `t=${(process.hrtime.bigint() / 1_000_000n).toString()} ` +\n `buffered_chunks=${drained.length} source=prebuffer`,\n );\n }\n for (const chunk of drained) {\n next.sendAudio(chunk);\n }\n\n const dropped = prev.drainDroppedEvents();\n if (Object.keys(dropped).length > 0) {\n // eslint-disable-next-line no-console\n console.info(\n `[PREWARM] dropped events during prewarm call_id=${callId} events=${JSON.stringify(dropped)}`,\n );\n }\n return flushed;\n}\n\n/**\n * prewarm prebuffer 가 비어 있던 케이스에서 첫 실시간 audio chunk 송출 시 호출.\n * 호출자(Session)는 attachBuffered() 반환값과 자체 플래그로 한 번만 호출하도록\n * 가드해야 한다.\n */\nexport function logFirstRealtimeAudio(call: { callId?: string } | null): void {\n const callId = call?.callId ?? '?';\n // eslint-disable-next-line no-console\n console.info(\n `[PREWARM-T] first-audio call_id=${callId} ` +\n `t=${(process.hrtime.bigint() / 1_000_000n).toString()} ` +\n `buffered_chunks=0 source=realtime`,\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent/audio.ts","../src/agent/logger.ts","../src/agent/builtin-tool.ts","../src/agent/pipeline/builtin-tool-schemas.ts","../src/agent/pipeline/buffering-call.ts"],"names":["pino","BuiltinTool"],"mappings":"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EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAS,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAS,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,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","file":"chunk-U4UFTVLX.cjs","sourcesContent":["/**\n * Audio codec utilities: PCM16 <-> ulaw conversion and resampling.\n */\n\nconst _BIAS = 0x84;\nconst _CLIP = 32635;\n\n// prettier-ignore\nconst DECODE_TABLE: readonly number[] = [\n -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,\n -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,\n -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,\n -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316,\n -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,\n -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,\n -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,\n -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,\n -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,\n -1372, -1308, -1244, -1180, -1116, -1052, -988, -924,\n -876, -844, -812, -780, -748, -716, -684, -652,\n -620, -588, -556, -524, -492, -460, -428, -396,\n -372, -356, -340, -324, -308, -292, -276, -260,\n -244, -228, -212, -196, -180, -164, -148, -132,\n -120, -112, -104, -96, -88, -80, -72, -64,\n -56, -48, -40, -32, -24, -16, -8, 0,\n 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,\n 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,\n 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,\n 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,\n 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,\n 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,\n 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,\n 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,\n 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,\n 1372, 1308, 1244, 1180, 1116, 1052, 988, 924,\n 876, 844, 812, 780, 748, 716, 684, 652,\n 620, 588, 556, 524, 492, 460, 428, 396,\n 372, 356, 340, 324, 308, 292, 276, 260,\n 244, 228, 212, 196, 180, 164, 148, 132,\n 120, 112, 104, 96, 88, 80, 72, 64,\n 56, 48, 40, 32, 24, 16, 8, 0,\n];\n\nfunction encodeUlawSample(sample: number): number {\n let sign = 0;\n if (sample < 0) {\n sign = 0x80;\n sample = -sample;\n }\n if (sample > _CLIP) {\n sample = _CLIP;\n }\n sample += _BIAS;\n\n let exponent = 7;\n const expValues = [0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100];\n for (const expVal of expValues) {\n if (sample >= expVal) {\n break;\n }\n exponent -= 1;\n }\n\n const mantissa = (sample >> (exponent + 3)) & 0x0f;\n return ~(sign | (exponent << 4) | mantissa) & 0xff;\n}\n\n/**\n * Convert PCM16 little-endian audio to ulaw.\n */\nexport function pcm16ToUlaw(pcm: Buffer): Buffer {\n if (!pcm.length) return Buffer.alloc(0);\n const nSamples = pcm.length >> 1;\n const out = Buffer.alloc(nSamples);\n for (let i = 0; i < nSamples; i++) {\n const sample = pcm.readInt16LE(i * 2);\n out[i] = encodeUlawSample(sample);\n }\n return out;\n}\n\n/**\n * Convert ulaw audio to PCM16 little-endian.\n */\nexport function ulawToPcm16(ulaw: Buffer): Buffer {\n if (!ulaw.length) return Buffer.alloc(0);\n const out = Buffer.alloc(ulaw.length * 2);\n for (let i = 0; i < ulaw.length; i++) {\n out.writeInt16LE(DECODE_TABLE[ulaw[i]!]!, i * 2);\n }\n return out;\n}\n\n/**\n * Apply multiplicative gain to PCM16 little-endian audio.\n * gain=1.0 is pass-through, 0 is mute, 2.0 is 2x amplification (clipped to int16 range).\n */\nexport function applyPcm16Gain(pcm: Buffer, gain: number): Buffer {\n if (!pcm.length) return Buffer.alloc(0);\n if (gain === 1.0) return pcm;\n if (!Number.isFinite(gain) || gain < 0) {\n throw new Error('gain must be a finite number >= 0');\n }\n const nSamples = pcm.length >> 1;\n const out = Buffer.alloc(nSamples * 2);\n for (let i = 0; i < nSamples; i++) {\n let value = Math.round(pcm.readInt16LE(i * 2) * gain);\n if (value > 32767) value = 32767;\n else if (value < -32768) value = -32768;\n out.writeInt16LE(value, i * 2);\n }\n return out;\n}\n\n/**\n * Apply multiplicative gain to G.711 mu-law audio.\n */\nexport function applyUlawGain(ulaw: Buffer, gain: number): Buffer {\n if (!ulaw.length) return Buffer.alloc(0);\n if (gain === 1.0) return ulaw;\n return pcm16ToUlaw(applyPcm16Gain(ulawToPcm16(ulaw), gain));\n}\n\n/**\n * Resample PCM16 audio using linear interpolation.\n */\nexport function resamplePcm16(pcm: Buffer, fromRate: number, toRate: number): Buffer {\n if (fromRate === toRate || !pcm.length) return pcm;\n\n const nSamples = pcm.length >> 1;\n const ratio = fromRate / toRate;\n const outLen = Math.floor(nSamples / ratio);\n const out = Buffer.alloc(outLen * 2);\n\n for (let i = 0; i < outLen; i++) {\n const srcPos = i * ratio;\n const idx = Math.floor(srcPos);\n const frac = srcPos - idx;\n\n let val: number;\n if (idx + 1 < nSamples) {\n val = pcm.readInt16LE(idx * 2) * (1 - frac) + pcm.readInt16LE((idx + 1) * 2) * frac;\n } else {\n val = pcm.readInt16LE(idx * 2);\n }\n out.writeInt16LE(Math.round(val), i * 2);\n }\n\n return out;\n}\n\nexport { DECODE_TABLE };\n","/**\n * Logger factory for the ClawOps agent module.\n *\n * Provides a 2-level hierarchy matching the Python SDK:\n * - clawops.agent (core: agent, session, control-ws, media-ws, recorder, mcp, realtime)\n * - clawops.agent.pipeline (pipeline: pipeline-session, stt, tts)\n */\n\nimport pino from 'pino';\nimport type { Logger } from 'pino';\n\nconst DEFAULT_LOGGER = pino({ name: 'clawops.agent' });\n\n/** A silent logger that discards all output. */\nexport const NOOP_LOGGER = pino({ level: 'silent' });\n\n/**\n * Create or return an agent-level logger.\n * If no user logger is provided, returns the default pino instance.\n */\nexport function createAgentLogger(userLogger?: Logger): Logger {\n return userLogger ?? DEFAULT_LOGGER;\n}\n\n/**\n * Create a pipeline child logger from a parent agent logger.\n * Adds `{ module: 'pipeline' }` to all log entries.\n */\nexport function createPipelineLogger(parent: Logger): Logger {\n return parent.child({ module: 'pipeline' });\n}\n\nexport type { Logger };\n","/**\n * Built-in tool definitions and selection constants.\n */\n\nexport enum BuiltinTool {\n /** 전화 종료 도구. AI가 대화 완료 시 통화를 종료합니다. */\n HANG_UP = 'hang_up',\n /** DTMF 수집 도구. 사용자의 키패드 입력을 수집합니다. */\n COLLECT_DTMF = 'collect_dtmf',\n /** DTMF 전송 도구. ARS 탐색이나 내선번호 입력에 사용합니다. */\n SEND_DTMF = 'send_dtmf',\n /** 통화 전환 도구. 현재 통화를 다른 번호로 전환합니다. */\n TRANSFER_CALL = 'transfer_call',\n\n /** 모든 내장 도구를 활성화합니다. (기본값) */\n ALL = 'all',\n /** 모든 내장 도구를 비활성화합니다. */\n NONE = 'none',\n}\n\nconst INDIVIDUAL_TOOLS = new Set([\n BuiltinTool.HANG_UP,\n BuiltinTool.COLLECT_DTMF,\n BuiltinTool.SEND_DTMF,\n BuiltinTool.TRANSFER_CALL,\n]);\n\nexport function resolveBuiltinTools(\n value: BuiltinTool | BuiltinTool[],\n): Set<BuiltinTool> {\n if (typeof value === 'string') {\n if (value === BuiltinTool.ALL) {\n return new Set(INDIVIDUAL_TOOLS);\n }\n if (value === BuiltinTool.NONE) {\n return new Set();\n }\n return new Set([value]);\n }\n return new Set(value.filter((t) => INDIVIDUAL_TOOLS.has(t)));\n}\n","/**\n * Built-in tool 스키마 정의, 포맷 변환, 실행 헬퍼.\n *\n * 모든 세션(PipelineSession, OpenAIRealtime, GeminiRealtime)이 공통으로 사용하는\n * 내장 도구 스키마를 한 곳에서 관리한다.\n */\n\nimport { BuiltinTool } from '../builtin-tool.js';\nimport type { CallSession } from '../session.js';\n\n// ── 정규 스키마 (neutral 포맷) ──────────────────────────────────────\n\nconst HANG_UP = {\n name: 'hang_up',\n description:\n 'End the phone call. Use when the conversation is finished or the caller says goodbye.',\n parameters: { type: 'object' as const, properties: {} as Record<string, unknown> },\n} as const;\n\nconst COLLECT_DTMF = {\n name: 'collect_dtmf',\n description:\n '사용자로부터 DTMF(전화 키패드) 입력을 수집합니다. 반드시 사용자에게 무엇을 입력해야 하는지 안내한 후 호출하세요.',\n parameters: {\n type: 'object' as const,\n properties: {\n max_digits: { type: 'integer' as const, description: '수집할 최대 자릿수' },\n finish_on_key: { type: 'string' as const, description: '입력 종료 키 (기본: #)' },\n timeout: { type: 'integer' as const, description: '입력 대기 시간(초, 기본: 5)' },\n },\n required: ['max_digits'] as string[],\n },\n} as const;\n\nconst SEND_DTMF = {\n name: 'send_dtmf',\n description: 'DTMF 신호를 전송합니다. ARS 메뉴 탐색이나 내선번호 입력 시 사용합니다.',\n parameters: {\n type: 'object' as const,\n properties: {\n digits: {\n type: 'string' as const,\n description:\n \"전송할 번호 (0-9, *, #). 'w'는 500ms 대기, 'W'는 1000ms 대기. 예: '1', '1234#', '1w2'\",\n },\n },\n required: ['digits'] as string[],\n },\n} as const;\n\nconst TRANSFER_CALL = {\n name: 'transfer_call',\n description:\n 'Transfer the current call to another phone number or SIP endpoint. Use for blind transfer (direct handoff) or warm transfer (with whisper message to the target).',\n parameters: {\n type: 'object' as const,\n properties: {\n to: { type: 'string' as const, description: \"Transfer destination. A phone number when destination_type is 'pstn', or a SIP URI (e.g. 'sip:user@host') when destination_type is 'sip'.\" },\n destination_type: { type: 'string' as const, enum: ['pstn', 'sip'], description: 'pstn: dial a phone number via carrier (default). sip: connect directly to a SIP endpoint (no carrier/PSTN).' },\n mode: { type: 'string' as const, enum: ['blind', 'warm'], description: 'blind: direct transfer (default), warm: play whisper to target first' },\n after_transfer: { type: 'string' as const, enum: ['terminate', 'return'], description: 'terminate: end AI session (default), return: AI resumes after transfer ends' },\n whisper: { type: 'string' as const, description: 'Message to speak to transfer target before connecting customer (warm mode only)' },\n caller_id: { type: 'string' as const, description: 'Override caller ID for the transfer leg' },\n timeout: { type: 'integer' as const, description: 'Seconds to wait for transfer target to answer (default 30)' },\n },\n required: ['to'] as string[],\n },\n} as const;\n\ntype NeutralSchema = typeof HANG_UP | typeof COLLECT_DTMF | typeof SEND_DTMF | typeof TRANSFER_CALL;\n\nconst TOOL_MAP = new Map<BuiltinTool, NeutralSchema>([\n [BuiltinTool.HANG_UP, HANG_UP],\n [BuiltinTool.COLLECT_DTMF, COLLECT_DTMF],\n [BuiltinTool.SEND_DTMF, SEND_DTMF],\n [BuiltinTool.TRANSFER_CALL, TRANSFER_CALL],\n]);\n\nexport const BUILTIN_TOOL_NAMES: Set<string> = new Set(\n Array.from(TOOL_MAP.values()).map((s) => s.name),\n);\n\n// ── 포맷 변환 ───────────────────────────────────────────────────────\n\nfunction toChatCompletions(schema: NeutralSchema): Record<string, unknown> {\n return {\n type: 'function',\n function: {\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n },\n };\n}\n\nfunction toRealtime(schema: NeutralSchema): Record<string, unknown> {\n return {\n type: 'function',\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n };\n}\n\nfunction toGemini(schema: NeutralSchema): Record<string, unknown> {\n return {\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n };\n}\n\nconst CONVERTERS = {\n chat: toChatCompletions,\n realtime: toRealtime,\n gemini: toGemini,\n} as const;\n\n/**\n * 활성화된 builtin tool 스키마를 요청한 포맷으로 반환.\n */\nexport function getBuiltinToolSchemas(\n builtinTools: Set<BuiltinTool> | null,\n fmt: 'chat' | 'realtime' | 'gemini',\n): Array<Record<string, unknown>> {\n const converter = CONVERTERS[fmt];\n const result: Array<Record<string, unknown>> = [];\n for (const [toolEnum, schema] of TOOL_MAP) {\n if (builtinTools === null || builtinTools.has(toolEnum)) {\n result.push(converter(schema));\n }\n }\n return result;\n}\n\n// ── 공통 실행 헬퍼 ──────────────────────────────────────────────────\n\n/**\n * Builtin tool을 실행하고 결과 문자열을 반환한다.\n *\n * `funcName`이 builtin tool이 아니면 `null`을 반환한다.\n * `hang_up`의 경우 빈 문자열 `\"\"`을 반환한다 (호출자가 종료 처리).\n */\nexport function isBuiltinTool(name: string): boolean {\n return BUILTIN_TOOL_NAMES.has(name);\n}\n\nexport async function executeBuiltinTool(\n funcName: string,\n args: Record<string, unknown>,\n call: CallSession,\n): Promise<string | null> {\n if (funcName === 'hang_up') {\n await call.hangup();\n return '';\n }\n if (funcName === 'collect_dtmf') {\n try {\n const result = await call.collectDtmf({\n maxDigits: (args['max_digits'] as number) ?? 4,\n finishOnKey: (args['finish_on_key'] as string) ?? '#',\n timeout: (args['timeout'] as number) ?? 5,\n });\n return result || '(타임아웃 - 입력 없음)';\n } catch (e) {\n return `Error: ${e}`;\n }\n }\n if (funcName === 'send_dtmf') {\n try {\n await call.sendDtmfSequence((args['digits'] as string) ?? '');\n return 'sent';\n } catch (e) {\n return `Error: ${e}`;\n }\n }\n if (funcName === 'transfer_call') {\n try {\n // Fire-and-forget: transfer 요청만 보내고 즉시 반환.\n // call-engine이 transfer 시작 시 media WS를 닫으므로,\n // 결과를 await하면 LLM 세션이 먼저 종료된다.\n call.transfer(args['to'] as string, {\n destinationType: (args['destination_type'] as 'pstn' | 'sip') ?? undefined,\n mode: (args['mode'] as 'blind' | 'warm') ?? undefined,\n afterTransfer: (args['after_transfer'] as 'terminate' | 'return') ?? undefined,\n whisper: args['whisper'] as string ?? undefined,\n callerId: args['caller_id'] as string ?? undefined,\n timeout: args['timeout'] as number ?? undefined,\n }).catch(() => {});\n return JSON.stringify({ status: 'transfer_initiated' });\n } catch (e) {\n return `Error: ${e}`;\n }\n }\n return null;\n}\n","/**\n * prewarm 단계에서 사용되는 CallSession stub.\n *\n * Session 구현체가 sendAudio() 를 호출하면 메모리 버퍼에 누적한다.\n * attach() 시점에 drainBuffer() 로 꺼내 실제 CallSession 에 flush.\n *\n * Python SDK 의 `_BufferingCall` mirror.\n */\n\nimport type { CallSession } from '../session.js';\n\nclass MetricsStub {\n recordToolCall(): void {}\n recordInterrupt(): void {}\n recordToolError(): void {}\n}\n\nexport class BufferingCall {\n private _buffer: Buffer[] = [];\n private _droppedEvents: Record<string, number> = {};\n readonly metrics = new MetricsStub();\n\n async sendAudio(chunk: Buffer): Promise<void> {\n this._buffer.push(chunk);\n }\n\n /** clearAudio 도 prewarm 동안엔 no-op (드물긴 하지만 안전하게). */\n clearAudio(): void {\n this._buffer = [];\n }\n\n /**\n * transcript 등 lifecycle 이벤트는 prewarm 동안 무시한다. silent drop 은 디버깅이\n * 어려우므로 event name 별 카운터로 누적하고 attachBuffered() 시 한 번에 로깅한다.\n */\n _emit(...args: unknown[]): void {\n this._recordDropped(args);\n }\n\n async emit(...args: unknown[]): Promise<void> {\n this._recordDropped(args);\n }\n\n private _recordDropped(args: unknown[]): void {\n let eventName = '?';\n if (args.length > 0 && typeof args[0] === 'string') {\n eventName = args[0];\n }\n this._droppedEvents[eventName] = (this._droppedEvents[eventName] ?? 0) + 1;\n }\n\n recordToolCall(): void {}\n recordToolError(): void {}\n recordFirstResponse(): void {}\n recordBargeIn(): void {}\n\n drainBuffer(): Buffer[] {\n const out = this._buffer;\n this._buffer = [];\n return out;\n }\n\n drainDroppedEvents(): Record<string, number> {\n const out = this._droppedEvents;\n this._droppedEvents = {};\n return out;\n }\n}\n\n/**\n * prewarm → attach 전환 시 BufferingCall 에 쌓인 audio chunk 를 실제\n * CallSession 으로 flush 하는 공통 헬퍼. OpenAI / Gemini / PipelineSession\n * attach() 가 동일 패턴이므로 한 곳에서 관리한다.\n *\n * 반환값: 한 개 이상의 chunk 를 drain 했으면 true. drain 시 PREWARM-T first-audio\n * 마커를 한 번 emit 한다. drained 가 비어 있으면 false 를 반환하여 호출자(Session)\n * 가 첫 실시간 audio.delta 송출 시 logFirstRealtimeAudio() 로 한 번만 마커를 찍을\n * 수 있게 한다.\n */\nexport function attachBuffered(\n prev: BufferingCall | CallSession | null,\n next: CallSession,\n): boolean {\n if (!(prev instanceof BufferingCall)) {\n return false;\n }\n\n const drained = prev.drainBuffer();\n const flushed = drained.length > 0;\n const callId = (next as { callId?: string }).callId ?? '?';\n\n if (flushed) {\n // eslint-disable-next-line no-console\n console.info(\n `[PREWARM-T] first-audio call_id=${callId} ` +\n `t=${(process.hrtime.bigint() / 1_000_000n).toString()} ` +\n `buffered_chunks=${drained.length} source=prebuffer`,\n );\n }\n for (const chunk of drained) {\n next.sendAudio(chunk);\n }\n\n const dropped = prev.drainDroppedEvents();\n if (Object.keys(dropped).length > 0) {\n // eslint-disable-next-line no-console\n console.info(\n `[PREWARM] dropped events during prewarm call_id=${callId} events=${JSON.stringify(dropped)}`,\n );\n }\n return flushed;\n}\n\n/**\n * prewarm prebuffer 가 비어 있던 케이스에서 첫 실시간 audio chunk 송출 시 호출.\n * 호출자(Session)는 attachBuffered() 반환값과 자체 플래그로 한 번만 호출하도록\n * 가드해야 한다.\n */\nexport function logFirstRealtimeAudio(call: { callId?: string } | null): void {\n const callId = call?.callId ?? '?';\n // eslint-disable-next-line no-console\n console.info(\n `[PREWARM-T] first-audio call_id=${callId} ` +\n `t=${(process.hrtime.bigint() / 1_000_000n).toString()} ` +\n `buffered_chunks=0 source=realtime`,\n );\n}\n"]}
|