@openclaw/facetime 2026.9.6 → 2026.9.7
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/assets/icon.png +0 -0
- package/dist/.setup/{setup-DUgC9yE7.mjs → setup-CoxvlB5L.mjs} +91 -128
- package/dist/doctor-contract-api.js +189 -7
- package/dist/index.js +1 -1
- package/dist/runtime-api.js +197 -238
- package/node_modules/typebox/build/compile/code.mjs +1 -2
- package/node_modules/typebox/build/compile/validator.mjs +5 -1
- package/node_modules/typebox/build/format/iri.mjs +16 -9
- package/node_modules/typebox/build/guard/emit.mjs +2 -2
- package/node_modules/typebox/build/guard/guard.d.mts +7 -5
- package/node_modules/typebox/build/guard/guard.mjs +14 -9
- package/node_modules/typebox/build/guard/index.mjs +6 -0
- package/node_modules/typebox/build/guard/unicode/unicode.d.mts +6 -0
- package/node_modules/typebox/build/guard/unicode/unicode.mjs +35 -0
- package/node_modules/typebox/build/guard/{string.mjs → unicode/unicode_segment.mjs} +16 -19
- package/node_modules/typebox/build/schema/build.mjs +2 -3
- package/node_modules/typebox/build/schema/engine/_pathing.d.mts +1 -0
- package/node_modules/typebox/build/schema/engine/_pathing.mjs +11 -0
- package/node_modules/typebox/build/schema/engine/_refine.mjs +13 -5
- package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/dependencies.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/dependentSchemas.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/dynamicRef.d.mts +1 -1
- package/node_modules/typebox/build/schema/engine/dynamicRef.mjs +2 -2
- package/node_modules/typebox/build/schema/engine/format.mjs +9 -2
- package/node_modules/typebox/build/schema/engine/patternProperties.mjs +3 -2
- package/node_modules/typebox/build/schema/engine/properties.mjs +3 -2
- package/node_modules/typebox/build/schema/engine/propertyNames.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/recursiveRef.d.mts +1 -1
- package/node_modules/typebox/build/schema/engine/recursiveRef.mjs +2 -2
- package/node_modules/typebox/build/schema/engine/ref.d.mts +1 -1
- package/node_modules/typebox/build/schema/engine/ref.mjs +2 -2
- package/node_modules/typebox/build/schema/engine/schema.mjs +24 -24
- package/node_modules/typebox/build/schema/parse.mjs +3 -0
- package/node_modules/typebox/build/schema/pointer/pointer.d.mts +1 -6
- package/node_modules/typebox/build/schema/pointer/pointer.mjs +47 -64
- package/node_modules/typebox/build/system/settings/internal.d.mts +2 -0
- package/node_modules/typebox/build/system/settings/internal.mjs +20 -0
- package/node_modules/typebox/build/system/settings/settings.d.mts +11 -0
- package/node_modules/typebox/build/system/settings/settings.mjs +14 -0
- package/node_modules/typebox/build/type/extends/inference.d.mts +1 -1
- package/node_modules/typebox/build/type/extends/inference.mjs +15 -2
- package/node_modules/typebox/build/type/extends/tuple.d.mts +2 -1
- package/node_modules/typebox/build/type/extends/tuple.mjs +21 -1
- package/node_modules/typebox/build/value/parse/parse.mjs +10 -4
- package/node_modules/typebox/package.json +1 -1
- package/node_modules/typebox/readme.md +3 -1
- package/package.json +5 -5
- package/src/audio-pump.ts +9 -16
- package/src/call-events.ts +12 -26
- package/src/call-lifecycle.ts +3 -19
- package/src/runtime-call-control.ts +3 -12
- package/src/runtime-call-events.ts +4 -9
- package/src/runtime-state.ts +0 -10
- package/src/setup.ts +96 -173
- package/src/talk-driver.ts +217 -242
- /package/node_modules/typebox/build/guard/{string.d.mts → unicode/unicode_segment.d.mts} +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
2
|
// deno-lint-ignore-file
|
|
3
|
+
import { EnableParseErrors, DisableParseErrors } from '../system/settings/internal.mjs';
|
|
3
4
|
import { Arguments } from '../system/arguments/index.mjs';
|
|
4
5
|
import { Check } from './check.mjs';
|
|
5
6
|
import { Errors } from './errors.mjs';
|
|
@@ -17,7 +18,9 @@ export class ParseError {
|
|
|
17
18
|
// ThrowParseError
|
|
18
19
|
// ------------------------------------------------------------------
|
|
19
20
|
export function ThrowParseError(context, schema, value) {
|
|
21
|
+
EnableParseErrors();
|
|
20
22
|
const result = Errors(context, schema, value);
|
|
23
|
+
DisableParseErrors();
|
|
21
24
|
throw new ParseError(schema, value, result[1]);
|
|
22
25
|
}
|
|
23
26
|
/** Parses a value against the provided schema */
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
/** Returns an array of path indices for the given pointer */
|
|
2
1
|
export declare function Indices(pointer: string): string[];
|
|
3
|
-
|
|
4
|
-
export declare function Has(value: unknown, pointer: string): unknown;
|
|
5
|
-
/** Gets a value at the pointer, or undefined if not exists */
|
|
2
|
+
export declare function Has(value: unknown, pointer: string): boolean;
|
|
6
3
|
export declare function Get(value: unknown, pointer: string): unknown;
|
|
7
|
-
/** Sets a value at the given pointer. May throw if the target value is not indexable */
|
|
8
4
|
export declare function Set(value: unknown, pointer: string, next: unknown): unknown;
|
|
9
|
-
/** Deletes the value at the given pointer. May throw if the target value is not indexable */
|
|
10
5
|
export declare function Delete(value: unknown, pointer: string): unknown;
|
|
@@ -1,106 +1,89 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
2
|
import { Guard } from '../../guard/index.mjs';
|
|
3
3
|
// ------------------------------------------------------------------
|
|
4
|
-
//
|
|
4
|
+
// Throw
|
|
5
5
|
// ------------------------------------------------------------------
|
|
6
|
-
function
|
|
7
|
-
|
|
8
|
-
throw Error('Cannot set root');
|
|
6
|
+
function Throw(message) {
|
|
7
|
+
throw Error(message);
|
|
9
8
|
}
|
|
10
|
-
function
|
|
11
|
-
|
|
12
|
-
throw Error('Cannot set value');
|
|
9
|
+
function ThrowUnsafePropertyKey() {
|
|
10
|
+
Throw('Pointer contains unsafe property key');
|
|
13
11
|
}
|
|
14
|
-
function
|
|
15
|
-
|
|
16
|
-
throw Error('Pointer contains unsafe property key');
|
|
17
|
-
}
|
|
18
|
-
function AssertIndices(indices) {
|
|
19
|
-
for (const index of indices)
|
|
20
|
-
AssertIndex(index);
|
|
21
|
-
}
|
|
22
|
-
// ------------------------------------------------------------------
|
|
23
|
-
// Indices
|
|
24
|
-
// ------------------------------------------------------------------
|
|
25
|
-
function IsNumericIndex(index) {
|
|
26
|
-
return /^(0|[1-9]\d*)$/.test(index);
|
|
27
|
-
}
|
|
28
|
-
function TakeIndexRight(indices) {
|
|
29
|
-
return [
|
|
30
|
-
indices.slice(0, indices.length - 1),
|
|
31
|
-
indices.slice(indices.length - 1)[0]
|
|
32
|
-
];
|
|
33
|
-
}
|
|
34
|
-
function HasIndex(index, value) {
|
|
35
|
-
return Guard.IsObject(value) && Guard.HasPropertyKey(value, index);
|
|
36
|
-
}
|
|
37
|
-
function GetIndex(index, value) {
|
|
38
|
-
return Guard.IsObject(value) && !Guard.IsUnsafePropertyKey(index) ? value[index] : undefined;
|
|
39
|
-
}
|
|
40
|
-
function GetIndices(indices, value) {
|
|
41
|
-
return indices.reduce((value, index) => GetIndex(index, value), value);
|
|
12
|
+
function ThrowCannotSetRoot() {
|
|
13
|
+
Throw('Cannot set value');
|
|
42
14
|
}
|
|
43
15
|
// ------------------------------------------------------------------
|
|
44
16
|
// Indices
|
|
45
17
|
// ------------------------------------------------------------------
|
|
46
|
-
/** Returns an array of path indices for the given pointer */
|
|
47
18
|
export function Indices(pointer) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const indices = pointer.split("/").map(index => index.replace(/~1/g, "/").replace(/~0/g, "~"));
|
|
51
|
-
return (indices.length > 0 && indices[0] === '') ? indices.slice(1) : indices;
|
|
19
|
+
const indices = pointer.split('/').map(index => index.replace(/~1/g, '/').replace(/~0/g, '~'));
|
|
20
|
+
return indices[0] === '' ? indices.slice(1) : indices;
|
|
52
21
|
}
|
|
53
22
|
// ------------------------------------------------------------------
|
|
54
23
|
// Has
|
|
55
24
|
// ------------------------------------------------------------------
|
|
56
|
-
/** Returns true if a value exists at the current pointer */
|
|
57
25
|
export function Has(value, pointer) {
|
|
58
26
|
let current = value;
|
|
59
|
-
|
|
60
|
-
if (!
|
|
27
|
+
for (const index of Indices(pointer)) {
|
|
28
|
+
if (!Guard.IsObject(current) || !Guard.HasPropertyKey(current, index))
|
|
61
29
|
return false;
|
|
62
30
|
current = current[index];
|
|
63
|
-
|
|
64
|
-
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
65
33
|
}
|
|
66
34
|
// ------------------------------------------------------------------
|
|
67
35
|
// Get
|
|
68
36
|
// ------------------------------------------------------------------
|
|
69
|
-
/** Gets a value at the pointer, or undefined if not exists */
|
|
70
37
|
export function Get(value, pointer) {
|
|
71
|
-
|
|
72
|
-
|
|
38
|
+
let current = value;
|
|
39
|
+
for (const index of Indices(pointer)) {
|
|
40
|
+
if (!Guard.IsObject(current) || Guard.IsUnsafePropertyKey(index))
|
|
41
|
+
return undefined;
|
|
42
|
+
current = current[index];
|
|
43
|
+
}
|
|
44
|
+
return current;
|
|
45
|
+
}
|
|
46
|
+
// ------------------------------------------------------------------
|
|
47
|
+
// Get
|
|
48
|
+
// ------------------------------------------------------------------
|
|
49
|
+
function Parent(value, indices, last) {
|
|
50
|
+
let current = value;
|
|
51
|
+
for (const index of indices) {
|
|
52
|
+
if (Guard.IsUnsafePropertyKey(index))
|
|
53
|
+
ThrowUnsafePropertyKey();
|
|
54
|
+
current = Guard.IsObject(current) ? current[index] : undefined;
|
|
55
|
+
}
|
|
56
|
+
if (Guard.IsUnsafePropertyKey(last))
|
|
57
|
+
ThrowUnsafePropertyKey();
|
|
58
|
+
if (!Guard.IsObject(current))
|
|
59
|
+
ThrowCannotSetRoot();
|
|
60
|
+
return current;
|
|
73
61
|
}
|
|
74
62
|
// ------------------------------------------------------------------
|
|
75
63
|
// Set
|
|
76
64
|
// ------------------------------------------------------------------
|
|
77
|
-
/** Sets a value at the given pointer. May throw if the target value is not indexable */
|
|
78
65
|
export function Set(value, pointer, next) {
|
|
79
66
|
const indices = Indices(pointer);
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
AssertCanSet(parent);
|
|
85
|
-
parent[index] = next;
|
|
67
|
+
const last = indices.pop();
|
|
68
|
+
if (Guard.IsUndefined(last))
|
|
69
|
+
ThrowCannotSetRoot();
|
|
70
|
+
Parent(value, indices, last)[last] = next;
|
|
86
71
|
return value;
|
|
87
72
|
}
|
|
88
73
|
// ------------------------------------------------------------------
|
|
89
74
|
// Delete
|
|
90
75
|
// ------------------------------------------------------------------
|
|
91
|
-
/** Deletes the value at the given pointer. May throw if the target value is not indexable */
|
|
92
76
|
export function Delete(value, pointer) {
|
|
93
77
|
const indices = Indices(pointer);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const parent =
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
parent.splice(+index, 1);
|
|
78
|
+
const last = indices.pop();
|
|
79
|
+
if (Guard.IsUndefined(last))
|
|
80
|
+
ThrowCannotSetRoot();
|
|
81
|
+
const parent = Parent(value, indices, last);
|
|
82
|
+
if (Guard.IsArray(parent) && /^(0|[1-9]\d*)$/.test(last)) {
|
|
83
|
+
parent.splice(Number(last), 1);
|
|
101
84
|
}
|
|
102
85
|
else {
|
|
103
|
-
delete parent[
|
|
86
|
+
delete parent[last];
|
|
104
87
|
}
|
|
105
88
|
return value;
|
|
106
89
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Get } from './settings.mjs';
|
|
2
|
+
// ------------------------------------------------------------------
|
|
3
|
+
// TempMaxErrors
|
|
4
|
+
// ------------------------------------------------------------------
|
|
5
|
+
let TempMaxErrors = 0;
|
|
6
|
+
// ------------------------------------------------------------------
|
|
7
|
+
// [Internal] EnableParseErrors
|
|
8
|
+
// ------------------------------------------------------------------
|
|
9
|
+
export function EnableParseErrors() {
|
|
10
|
+
const settings = Get();
|
|
11
|
+
TempMaxErrors = settings.maxErrors;
|
|
12
|
+
settings.maxErrors = settings.maxParseErrors;
|
|
13
|
+
}
|
|
14
|
+
// ------------------------------------------------------------------
|
|
15
|
+
// [Internal] DisableParseErrors
|
|
16
|
+
// ------------------------------------------------------------------
|
|
17
|
+
export function DisableParseErrors() {
|
|
18
|
+
const settings = Get();
|
|
19
|
+
settings.maxErrors = TempMaxErrors;
|
|
20
|
+
}
|
|
@@ -16,6 +16,17 @@ export interface TSettings {
|
|
|
16
16
|
* @default 8
|
|
17
17
|
*/
|
|
18
18
|
maxErrors: number;
|
|
19
|
+
/**
|
|
20
|
+
* Specifies the maximum number of errors to gather for failed Parse operations. TypeBox will
|
|
21
|
+
* automatically run an error-gathering pass on failed Parses to attach diagnostics to the
|
|
22
|
+
* thrown exception. This setting controls the number of errors gathered in that pass. Higher
|
|
23
|
+
* values will reduce throughput on failure cases, so a maximum of 4 is recommended if more
|
|
24
|
+
* errors are needed. The default setting of 1 will terminate on the first error, while a
|
|
25
|
+
* setting of 0 will skip error gathering entirely.
|
|
26
|
+
*
|
|
27
|
+
* @default 1
|
|
28
|
+
*/
|
|
29
|
+
maxParseErrors: number;
|
|
19
30
|
/**
|
|
20
31
|
* Specifies the maximum number of instantiations allowed within a top-level generic instantiation
|
|
21
32
|
* context. This setting can be used to bound generic calls to a fixed count, which can be useful if
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { Guard } from '../../guard/index.mjs';
|
|
2
|
+
// -------------------------------------------------------------------
|
|
3
|
+
// State
|
|
4
|
+
// -------------------------------------------------------------------
|
|
2
5
|
// Internal mutable state
|
|
3
6
|
const settings = {
|
|
4
7
|
immutableTypes: false,
|
|
5
8
|
maxErrors: 8,
|
|
9
|
+
maxParseErrors: 1,
|
|
6
10
|
maxInstantiationCount: 128,
|
|
7
11
|
useAcceleration: true,
|
|
8
12
|
exactOptionalPropertyTypes: false,
|
|
@@ -10,10 +14,14 @@ const settings = {
|
|
|
10
14
|
correctiveParse: false,
|
|
11
15
|
unionPrioritySort: true
|
|
12
16
|
};
|
|
17
|
+
// -------------------------------------------------------------------
|
|
18
|
+
// Reset
|
|
19
|
+
// -------------------------------------------------------------------
|
|
13
20
|
/** Resets system settings to defaults */
|
|
14
21
|
export function Reset() {
|
|
15
22
|
settings.immutableTypes = false;
|
|
16
23
|
settings.maxErrors = 8;
|
|
24
|
+
settings.maxParseErrors = 1;
|
|
17
25
|
settings.maxInstantiationCount = 128;
|
|
18
26
|
settings.useAcceleration = true;
|
|
19
27
|
settings.exactOptionalPropertyTypes = false;
|
|
@@ -21,6 +29,9 @@ export function Reset() {
|
|
|
21
29
|
settings.correctiveParse = false;
|
|
22
30
|
settings.unionPrioritySort = true;
|
|
23
31
|
}
|
|
32
|
+
// -------------------------------------------------------------------
|
|
33
|
+
// Set
|
|
34
|
+
// -------------------------------------------------------------------
|
|
24
35
|
/** Sets system settings */
|
|
25
36
|
export function Set(options) {
|
|
26
37
|
for (const key of Guard.Keys(options)) {
|
|
@@ -30,6 +41,9 @@ export function Set(options) {
|
|
|
30
41
|
}
|
|
31
42
|
}
|
|
32
43
|
}
|
|
44
|
+
// -------------------------------------------------------------------
|
|
45
|
+
// Get
|
|
46
|
+
// -------------------------------------------------------------------
|
|
33
47
|
/** Gets current system settings */
|
|
34
48
|
export function Get() {
|
|
35
49
|
return settings;
|
|
@@ -22,7 +22,7 @@ export declare function TryRestInferable<Type extends TSchema>(type: Type): TTry
|
|
|
22
22
|
export type TTryInferable<Type extends TSchema, Result extends TInferable | undefined = (Type extends TInfer<infer Name extends string, infer Type extends TSchema> ? TInferable<Name, Type> : undefined)> = Result;
|
|
23
23
|
export declare function TryInferable<Type extends TSchema>(type: Type): TTryInferable<Type>;
|
|
24
24
|
type TryInferResults<Rest extends TSchema[], Right extends TSchema, Result extends TSchema[] = []> = (Rest extends [infer Head extends TSchema, ...infer Tail extends TSchema[]] ? TExtendsLeft<{}, Head, Right> extends Result.TExtendsTrueLike ? TryInferResults<Tail, Right, [...Result, Head]> : undefined : Result);
|
|
25
|
-
declare function TryInferResults<Rest extends TSchema[], Right extends TSchema>(rest: [...Rest], right: Right
|
|
25
|
+
declare function TryInferResults<Rest extends TSchema[], Right extends TSchema>(rest: [...Rest], right: Right): TryInferResults<Rest, Right>;
|
|
26
26
|
export type TInferTupleResult<Inferred extends TProperties, Name extends string, Left extends TSchema[], Right extends TSchema, Results extends TSchema[] | undefined = TryInferResults<Left, Right>> = (Results extends [...infer Results extends TSchema[]] ? Result.TExtendsTrue<Memory.TAssign<Inferred, {
|
|
27
27
|
[_ in Name]: TTuple<Results>;
|
|
28
28
|
}>> : Result.TExtendsFalse);
|
|
@@ -45,8 +45,21 @@ export function TryInferable(type) {
|
|
|
45
45
|
return (IsInfer(type) ? Inferrable(type.name, type.extends) :
|
|
46
46
|
undefined);
|
|
47
47
|
}
|
|
48
|
-
function TryInferResults(rest, right, result = []) {
|
|
49
|
-
|
|
48
|
+
// function TryInferResults<Rest extends TSchema[], Right extends TSchema>(rest: [...Rest], right: Right, result: TSchema[] = []): TryInferResults<Rest, Right> {
|
|
49
|
+
// return Guard.ShiftLeft(rest, (head, tail) =>
|
|
50
|
+
// Result.Match(ExtendsLeft({}, head, right),
|
|
51
|
+
// () => TryInferResults(tail, right, [...result, head]), // Stack Overflow Here (Large Rest)
|
|
52
|
+
// () => undefined),
|
|
53
|
+
// () => result) as never
|
|
54
|
+
// }
|
|
55
|
+
function TryInferResults(rest, right) {
|
|
56
|
+
const result = [];
|
|
57
|
+
for (const head of rest) {
|
|
58
|
+
if (!Result.IsExtendsTrueLike(ExtendsLeft({}, head, right)))
|
|
59
|
+
return undefined;
|
|
60
|
+
result.push(head);
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
50
63
|
}
|
|
51
64
|
export function InferTupleResult(inferred, name, left, right) {
|
|
52
65
|
const results = TryInferResults(left, right);
|
|
@@ -16,7 +16,8 @@ type TElementsLeft<Inferred extends TProperties, Reversed extends boolean, LeftR
|
|
|
16
16
|
type TElementsRight<Inferred extends TProperties, Reversed extends boolean, LeftRest extends TSchema[], RightRest extends TSchema[]> = (RightRest extends [infer Head extends TSchema, ...infer Tail extends TSchema[]] ? TElementsLeft<Inferred, Reversed, LeftRest, Head, Tail> : LeftRest['length'] extends 0 ? Result.TExtendsTrue<Inferred> : Result.TExtendsFalse);
|
|
17
17
|
type TElements<Inferred extends TProperties, Reversed extends boolean, LeftRest extends TSchema[], RightRest extends TSchema[]> = TElementsRight<Inferred, Reversed, LeftRest, RightRest>;
|
|
18
18
|
type TExtendsTupleToTuple<Inferred extends TProperties, Left extends TSchema[], Right extends TSchema[], InstantiatedRight extends TSchema[] = TInstantiateElements<Inferred, TState<[], []>, Right>, Reversed extends boolean = TReversed<InstantiatedRight>> = TElements<Inferred, Reversed, TApplyReverse<Left, Reversed>, TApplyReverse<InstantiatedRight, Reversed>>;
|
|
19
|
-
type
|
|
19
|
+
type TExtendsTupleToArrayReduce<Inferred extends TProperties, Left extends TSchema[], Right extends TSchema> = (Left extends [infer Head extends TSchema, ...infer Tail extends TSchema[]] ? TExtendsLeft<Inferred, Head, Right> extends Result.TExtendsTrueLike<infer Inferred extends TProperties> ? TExtendsTupleToArrayReduce<Inferred, Tail, Right> : Result.TExtendsFalse : Result.TExtendsTrue<Inferred>);
|
|
20
|
+
type TExtendsTupleToArray<Inferred extends TProperties, Left extends TSchema[], Right extends TSchema, Inferrable extends TInferable | undefined = TTryInferable<Right>> = (Inferrable extends TInferable ? TInferUnionResult<Inferred, Inferrable['name'], Left, Inferrable['type']> : TExtendsTupleToArrayReduce<Inferred, Left, Right>);
|
|
20
21
|
export type TExtendsTuple<Inferred extends TProperties, Left extends TSchema[], Right extends TSchema, InstantiatedLeft extends TSchema[] = TInstantiateElements<Inferred, TState<[], []>, Left>> = (Right extends TTuple<infer Types extends TSchema[]> ? TExtendsTupleToTuple<Inferred, InstantiatedLeft, Types> : Right extends TArray<infer Type extends TSchema> ? TExtendsTupleToArray<Inferred, InstantiatedLeft, Type> : TExtendsRight<Inferred, TTuple<InstantiatedLeft>, Right>);
|
|
21
22
|
export declare function ExtendsTuple<Inferred extends TProperties, Left extends TSchema[], Right extends TSchema>(inferred: Inferred, left: Left, right: Right): TExtendsTuple<Inferred, Left, Right>;
|
|
22
23
|
export {};
|
|
@@ -47,11 +47,31 @@ function ExtendsTupleToTuple(inferred, left, right) {
|
|
|
47
47
|
const reversed = Reversed(instantiatedRight);
|
|
48
48
|
return Elements(inferred, reversed, ApplyReverse(left, reversed), ApplyReverse(instantiatedRight, reversed));
|
|
49
49
|
}
|
|
50
|
+
// function ExtendsTupleToArrayReduce<Inferred extends TProperties, Left extends TSchema[], Right extends TSchema>
|
|
51
|
+
// (inferred: Inferred, left: [...Left], right: Right):
|
|
52
|
+
// TExtendsTupleToArrayReduce<Inferred, Left, Right> {
|
|
53
|
+
// return (
|
|
54
|
+
// Guard.ShiftLeft(left, (head, tail) =>
|
|
55
|
+
// Result.Match(ExtendsLeft(inferred, head, right), inferred =>
|
|
56
|
+
// ExtendsTupleToArrayReduce(inferred, tail, right), // Stack Overflow Here (Large Left)
|
|
57
|
+
// () => Result.ExtendsFalse()),
|
|
58
|
+
// () => Result.ExtendsTrue(inferred))
|
|
59
|
+
// ) as never
|
|
60
|
+
// }
|
|
61
|
+
function ExtendsTupleToArrayReduce(inferred, left, right) {
|
|
62
|
+
for (const head of left) {
|
|
63
|
+
const result = ExtendsLeft(inferred, head, right);
|
|
64
|
+
if (!Result.IsExtendsTrueLike(result))
|
|
65
|
+
return result;
|
|
66
|
+
inferred = result.inferred; // (review-assign-to-argument)
|
|
67
|
+
}
|
|
68
|
+
return Result.ExtendsTrue(inferred);
|
|
69
|
+
}
|
|
50
70
|
function ExtendsTupleToArray(inferred, left, right) {
|
|
51
71
|
const inferrable = TryInferable(right);
|
|
52
72
|
return (IsInferable(inferrable)
|
|
53
73
|
? InferUnionResult(inferred, inferrable['name'], left, inferrable['type'])
|
|
54
|
-
:
|
|
74
|
+
: ExtendsTupleToArrayReduce(inferred, left, right));
|
|
55
75
|
}
|
|
56
76
|
export function ExtendsTuple(inferred, left, right) {
|
|
57
77
|
const instantiatedLeft = InstantiateElements(inferred, State([], []), left);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
|
-
import {
|
|
3
|
-
import { Arguments } from '../../system/
|
|
2
|
+
import { EnableParseErrors, DisableParseErrors } from '../../system/settings/internal.mjs';
|
|
3
|
+
import { Arguments, Settings } from '../../system/index.mjs';
|
|
4
4
|
import { AssertError } from '../assert/index.mjs';
|
|
5
5
|
import { Check } from '../check/index.mjs';
|
|
6
6
|
import { Errors } from '../errors/index.mjs';
|
|
@@ -18,8 +18,11 @@ export class ParseError extends AssertError {
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
function Assert(context, type, value) {
|
|
21
|
+
EnableParseErrors();
|
|
22
|
+
const errors = Errors(context, type, value);
|
|
23
|
+
DisableParseErrors();
|
|
21
24
|
if (!Check(context, type, value))
|
|
22
|
-
throw new ParseError(value,
|
|
25
|
+
throw new ParseError(value, errors);
|
|
23
26
|
return value;
|
|
24
27
|
}
|
|
25
28
|
// ------------------------------------------------------------------
|
|
@@ -43,5 +46,8 @@ export function Parse(...args) {
|
|
|
43
46
|
return value;
|
|
44
47
|
if (Settings.Get().correctiveParse)
|
|
45
48
|
return Parser(context, type, value);
|
|
46
|
-
|
|
49
|
+
EnableParseErrors();
|
|
50
|
+
const errors = Errors(context, type, value);
|
|
51
|
+
DisableParseErrors();
|
|
52
|
+
throw new ParseError(value, errors);
|
|
47
53
|
}
|
|
@@ -166,9 +166,11 @@ import Schema from 'typebox/schema'
|
|
|
166
166
|
|
|
167
167
|
### Compile
|
|
168
168
|
|
|
169
|
-
The compiler accepts
|
|
169
|
+
The compiler accepts TypeBox types as well as plain JSON Schema objects, and returns a Validator instance which can be used to check values. The following compiles a Vector type.
|
|
170
170
|
|
|
171
171
|
```typescript
|
|
172
|
+
import Schema from 'typebox/schema'
|
|
173
|
+
|
|
172
174
|
// Compile
|
|
173
175
|
|
|
174
176
|
const Vector = Schema.Compile(Type.Script(`{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/facetime",
|
|
3
|
-
"version": "2026.9.
|
|
3
|
+
"version": "2026.9.7",
|
|
4
4
|
"description": "Experimental FaceTime realtime voice carrier for OpenClaw agents",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "OpenClaw contributors",
|
|
@@ -63,10 +63,10 @@
|
|
|
63
63
|
"inject:helper:terminal": "bash scripts/inject-helper-terminal.sh"
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
|
-
"typebox": "1.3.
|
|
66
|
+
"typebox": "1.3.34"
|
|
67
67
|
},
|
|
68
68
|
"peerDependencies": {
|
|
69
|
-
"openclaw": ">=2026.9.
|
|
69
|
+
"openclaw": ">=2026.9.7"
|
|
70
70
|
},
|
|
71
71
|
"peerDependenciesMeta": {
|
|
72
72
|
"openclaw": {
|
|
@@ -85,11 +85,11 @@
|
|
|
85
85
|
"allowInvalidConfigRecovery": true
|
|
86
86
|
},
|
|
87
87
|
"compat": {
|
|
88
|
-
"pluginApi": ">=2026.9.
|
|
88
|
+
"pluginApi": ">=2026.9.7"
|
|
89
89
|
},
|
|
90
90
|
"build": {
|
|
91
91
|
"bundledDist": false,
|
|
92
|
-
"openclawVersion": "2026.9.
|
|
92
|
+
"openclawVersion": "2026.9.7"
|
|
93
93
|
},
|
|
94
94
|
"release": {
|
|
95
95
|
"publishToClawHub": true,
|
package/src/audio-pump.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import type { Writable } from "node:stream";
|
|
4
4
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
5
|
+
import { createDeferred } from "openclaw/plugin-sdk/extension-shared";
|
|
5
6
|
import type { RuntimeLogger } from "openclaw/plugin-sdk/plugin-runtime";
|
|
6
7
|
import type {
|
|
7
8
|
RealtimeVoiceAudioChunkMetadata,
|
|
@@ -231,18 +232,10 @@ export function startFaceTimeAudioPump(params: {
|
|
|
231
232
|
let routeReadySettled = false;
|
|
232
233
|
let routeReadyTimer: NodeJS.Timeout | undefined;
|
|
233
234
|
let captureStderr = "";
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
const captureReadyPromise =
|
|
237
|
-
|
|
238
|
-
rejectCaptureReady = reject;
|
|
239
|
-
});
|
|
240
|
-
let resolveRouteReady = () => {};
|
|
241
|
-
let rejectRouteReady = (_error: Error) => {};
|
|
242
|
-
const routeReadyPromise = new Promise<void>((resolve, reject) => {
|
|
243
|
-
resolveRouteReady = resolve;
|
|
244
|
-
rejectRouteReady = reject;
|
|
245
|
-
});
|
|
235
|
+
const captureReady = createDeferred<void>();
|
|
236
|
+
const routeReady = createDeferred<void>();
|
|
237
|
+
const captureReadyPromise = captureReady.promise;
|
|
238
|
+
const routeReadyPromise = routeReady.promise;
|
|
246
239
|
void captureReadyPromise.catch(() => {});
|
|
247
240
|
void routeReadyPromise.catch(() => {});
|
|
248
241
|
|
|
@@ -253,9 +246,9 @@ export function startFaceTimeAudioPump(params: {
|
|
|
253
246
|
captureReadySettled = true;
|
|
254
247
|
clearTimeout(captureReadyTimer);
|
|
255
248
|
if (error) {
|
|
256
|
-
|
|
249
|
+
captureReady.reject(error);
|
|
257
250
|
} else {
|
|
258
|
-
|
|
251
|
+
captureReady.resolve();
|
|
259
252
|
}
|
|
260
253
|
};
|
|
261
254
|
const settleRouteReady = (error?: Error) => {
|
|
@@ -268,9 +261,9 @@ export function startFaceTimeAudioPump(params: {
|
|
|
268
261
|
routeReadyTimer = undefined;
|
|
269
262
|
}
|
|
270
263
|
if (error) {
|
|
271
|
-
|
|
264
|
+
routeReady.reject(error);
|
|
272
265
|
} else {
|
|
273
|
-
|
|
266
|
+
routeReady.resolve();
|
|
274
267
|
}
|
|
275
268
|
};
|
|
276
269
|
const reportFailure = (error: Error, suppressionLost: boolean) => {
|
package/src/call-events.ts
CHANGED
|
@@ -85,6 +85,11 @@ function readFiniteNumber(value: unknown): number | undefined {
|
|
|
85
85
|
return Number.isFinite(number) ? number : undefined;
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
function readInteger(value: unknown): number | undefined {
|
|
89
|
+
const number = readFiniteNumber(value);
|
|
90
|
+
return Number.isInteger(number) ? number : undefined;
|
|
91
|
+
}
|
|
92
|
+
|
|
88
93
|
function normalizeCallTransport(value: unknown): FaceTimeCallTransport {
|
|
89
94
|
const transport = asRecord(value);
|
|
90
95
|
const base = {
|
|
@@ -182,9 +187,7 @@ function collectHandleCandidates(
|
|
|
182
187
|
seen.add(value);
|
|
183
188
|
const record = asRecord(value);
|
|
184
189
|
for (const [key, nested] of Object.entries(record)) {
|
|
185
|
-
if (handleValueKeys.has(key)) {
|
|
186
|
-
collectHandleCandidates(nested, candidates, seen);
|
|
187
|
-
} else if (nested && typeof nested === "object") {
|
|
190
|
+
if (handleValueKeys.has(key) || (nested && typeof nested === "object")) {
|
|
188
191
|
collectHandleCandidates(nested, candidates, seen);
|
|
189
192
|
}
|
|
190
193
|
}
|
|
@@ -220,25 +223,8 @@ export function normalizeFaceTimeCallEvent(value: unknown): FaceTimeCallStatusEv
|
|
|
220
223
|
const proxyIdentifier = normalizeOptionalString(data.proxy_identifier);
|
|
221
224
|
const conversationUUID = normalizeOptionalString(data.conversation_uuid);
|
|
222
225
|
const conversationGroupUUID = normalizeOptionalString(data.conversation_group_uuid);
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
? data.conversation_av_mode
|
|
226
|
-
: typeof data.conversation_av_mode === "string"
|
|
227
|
-
? Number(data.conversation_av_mode)
|
|
228
|
-
: undefined;
|
|
229
|
-
const conversationResolvedAVMode =
|
|
230
|
-
typeof data.conversation_resolved_audio_video_mode === "number"
|
|
231
|
-
? data.conversation_resolved_audio_video_mode
|
|
232
|
-
: typeof data.conversation_resolved_audio_video_mode === "string"
|
|
233
|
-
? Number(data.conversation_resolved_audio_video_mode)
|
|
234
|
-
: undefined;
|
|
235
|
-
const status =
|
|
236
|
-
typeof data.call_status === "number"
|
|
237
|
-
? data.call_status
|
|
238
|
-
: typeof data.call_status === "string"
|
|
239
|
-
? Number(data.call_status)
|
|
240
|
-
: undefined;
|
|
241
|
-
if (!callUUID || !Number.isInteger(status)) {
|
|
226
|
+
const status = readInteger(data.call_status);
|
|
227
|
+
if (!callUUID || status === undefined) {
|
|
242
228
|
return undefined;
|
|
243
229
|
}
|
|
244
230
|
return {
|
|
@@ -252,10 +238,10 @@ export function normalizeFaceTimeCallEvent(value: unknown): FaceTimeCallStatusEv
|
|
|
252
238
|
conversation_group_uuid: conversationGroupUUID,
|
|
253
239
|
conversation_audio_enabled: data.conversation_audio_enabled === true,
|
|
254
240
|
conversation_video_enabled: data.conversation_video_enabled === true,
|
|
255
|
-
conversation_av_mode:
|
|
256
|
-
conversation_resolved_audio_video_mode:
|
|
257
|
-
|
|
258
|
-
|
|
241
|
+
conversation_av_mode: readInteger(data.conversation_av_mode),
|
|
242
|
+
conversation_resolved_audio_video_mode: readInteger(
|
|
243
|
+
data.conversation_resolved_audio_video_mode,
|
|
244
|
+
),
|
|
259
245
|
is_outgoing: data.is_outgoing === true,
|
|
260
246
|
has_ended: data.has_ended === true,
|
|
261
247
|
is_sending_audio: data.is_sending_audio === true,
|
package/src/call-lifecycle.ts
CHANGED
|
@@ -6,11 +6,6 @@ type FaceTimeModelMediaMode = "starting" | "ready" | "active" | "suspended" | "c
|
|
|
6
6
|
|
|
7
7
|
type FaceTimeCallPhase = "ringing" | "answering" | "active" | "closing" | "closed";
|
|
8
8
|
|
|
9
|
-
type FaceTimeCallIdentity = {
|
|
10
|
-
canonical: string;
|
|
11
|
-
aliases: ReadonlySet<string>;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
9
|
function normalizeCallIdentity(value: string): string {
|
|
15
10
|
return value.trim().toLowerCase();
|
|
16
11
|
}
|
|
@@ -26,19 +21,12 @@ export class FaceTimeCallInstance {
|
|
|
26
21
|
readonly carrierClosure = this.#carrierClosure.promise;
|
|
27
22
|
#commandTail: Promise<void> = Promise.resolve();
|
|
28
23
|
|
|
29
|
-
constructor(
|
|
30
|
-
readonly canonicalId: string,
|
|
31
|
-
phase: "ringing" | "active",
|
|
32
|
-
) {
|
|
24
|
+
constructor(canonicalId: string, phase: "ringing" | "active") {
|
|
33
25
|
this.phase = phase;
|
|
34
26
|
this.carrierMode = phase === "ringing" ? "ringing" : "muted";
|
|
35
27
|
this.aliases.add(normalizeCallIdentity(canonicalId));
|
|
36
28
|
}
|
|
37
29
|
|
|
38
|
-
get identity(): FaceTimeCallIdentity {
|
|
39
|
-
return { canonical: this.canonicalId, aliases: this.aliases };
|
|
40
|
-
}
|
|
41
|
-
|
|
42
30
|
captureGeneration(): number {
|
|
43
31
|
return this.generation;
|
|
44
32
|
}
|
|
@@ -155,11 +143,11 @@ export class FaceTimeCallRegistry<T extends FaceTimeCallInstance> {
|
|
|
155
143
|
}
|
|
156
144
|
|
|
157
145
|
get(identity: string): T | undefined {
|
|
158
|
-
return this.
|
|
146
|
+
return this.#aliases.get(normalizeCallIdentity(identity));
|
|
159
147
|
}
|
|
160
148
|
|
|
161
149
|
has(identity: string): boolean {
|
|
162
|
-
return this.
|
|
150
|
+
return this.get(identity) !== undefined;
|
|
163
151
|
}
|
|
164
152
|
|
|
165
153
|
create(call: T): void {
|
|
@@ -172,10 +160,6 @@ export class FaceTimeCallRegistry<T extends FaceTimeCallInstance> {
|
|
|
172
160
|
}
|
|
173
161
|
}
|
|
174
162
|
|
|
175
|
-
resolve(identity: string): T | undefined {
|
|
176
|
-
return this.#aliases.get(normalizeCallIdentity(identity));
|
|
177
|
-
}
|
|
178
|
-
|
|
179
163
|
retainAlias(call: T, identity: string): void {
|
|
180
164
|
if (this.#active !== call || call.phase === "closed") {
|
|
181
165
|
throw new Error("cannot retain an alias for an inactive FaceTime call");
|
|
@@ -379,18 +379,9 @@ export function createFaceTimeCallControl(params: {
|
|
|
379
379
|
},
|
|
380
380
|
async onFailure(error) {
|
|
381
381
|
const failureReason = `talk-failed: ${formatErrorMessage(error)}`;
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
queueMicrotask(() => {
|
|
386
|
-
void closeCall(call, failureReason);
|
|
387
|
-
});
|
|
388
|
-
}
|
|
389
|
-
return carrierClosed;
|
|
390
|
-
}
|
|
391
|
-
const carrierClosed = await attemptCarrierHangup(call, failureReason, {
|
|
392
|
-
closeLocal: false,
|
|
393
|
-
});
|
|
382
|
+
const carrierClosed = call.talk
|
|
383
|
+
? await attemptCarrierHangup(call, failureReason, { closeLocal: false })
|
|
384
|
+
: await waitForStartupCarrierHangup(call, failureReason);
|
|
394
385
|
if (carrierClosed) {
|
|
395
386
|
queueMicrotask(() => {
|
|
396
387
|
void closeCall(call, failureReason);
|