Skip to content
English

AgentFamily ​

KIT · interface · 类型合同

Compiled family API. Every mutation returns the record after the write.

导入 ​

ts
import type { AgentFamily } from '@jangts/agent-core/kits/family';
js
/** @typedef {import('@jangts/agent-core/kits/family').AgentFamily} AgentFamily */

其他公开入口:@jangts/agent-core/types、@jangts/agent-core/structs、@jangts/agent-core/kits、@jangts/agent-core/kits/family。

定义 ​

ts
interface AgentFamily<State, App>

泛型参数 ​

类型参数约束默认类型
State——
App——

字段结构 ​

字段类型必需说明
read(id: string, context: OperationContext<App>) => Promise<FamilyRecord<State>>必需Reads the record; throws when the family does not exist or has expired.
create(request: { id: string; branch: AgentBranch; state: State; }, context: OperationContext<App>) => Promise<FamilyRecord<State>>必需Creates the first version and makes it active.
fork(request: { id: string; revision: number; parentId: string; branch: AgentBranch; state: State; }, context: OperationContext<App>) => Promise<FamilyRecord<State>>必需Appends a version forked from parentId; the active pointer does not change.
merge(request: { id: string; revision: number; baseId: string; targetId: string; sourceId: string; }, context: OperationContext<App>) => Promise<{ saved: boolean; record: FamilyRecord<State>; conflicts: readonly string[]; }>必需Merges source into target; saved is false when the merge reported conflicts.
promote(request: { id: string; revision: number; candidateId: string; expectedActiveId: string; }, context: OperationContext<App>) => Promise<FamilyRecord<State>>必需Makes candidateId active; fails when the active version changed since expectedActiveId.

成员目录 ​

成员用途
readReads the record; throws when the family does not exist or has expired.
createCreates the first version and makes it active.
forkAppends a version forked from parentId; the active pointer does not change.
mergeMerges source into target; saved is false when the merge reported conflicts.
promoteMakes candidateId active; fails when the active version changed since expectedActiveId.

成员详情 ​

read ​

Reads the record; throws when the family does not exist or has expired.

ts
AgentFamily.read(id: string, context: OperationContext<App>): Promise<FamilyRecord<State>>

Reads the record; throws when the family does not exist or has expired.

参数类型传递说明
idstring必需—
contextOperationContext<App>必需—
context 的字段
字段类型必需说明
appunknown extends App ? App : Readonly<App>必需只读。见类型定义及调用场景。
loggerSubFlowLog | undefined可省略只读。Explicit optional recorder for this operation; never inferred from diagnostics.
signalAbortSignal必需只读。Non-optional cancellation signal; never undefined once execution has started.
diagnosticsDiagnosticContext | undefined可省略只读。Diagnostic scope of the enclosing call, when recording is enabled.

返回: Promise<FamilyRecord<State>>。

等待后的值: FamilyRecord<State>。

返回值结构
字段类型必需说明
idstring必需只读。Family id; also the store key.
revisionnumber必需只读。Optimistic concurrency token; every accepted mutation increments it by one.
activeIdstring必需只读。Id of the active version; promotion moves this pointer.
expiresAtMsnumber必需只读。Instant after which the record is no longer retained, in epoch milliseconds.
versionsreadonly FamilyVersion<State>[]必需只读。Versions in creation order; bounded by maxVersions when configured.

create ​

Creates the first version and makes it active.

ts
AgentFamily.create(request: { id: string; branch: AgentBranch; state: State; }, context: OperationContext<App>): Promise<FamilyRecord<State>>

Creates the first version and makes it active.

参数类型传递说明
request{ id: string; branch: AgentBranch; state: State; }必需—
contextOperationContext<App>必需—
request 的字段
字段类型必需说明
idstring必需见类型定义及调用场景。
branchAgentBranch必需见类型定义及调用场景。
stateState必需见类型定义及调用场景。
context 的字段
字段类型必需说明
appunknown extends App ? App : Readonly<App>必需只读。见类型定义及调用场景。
loggerSubFlowLog | undefined可省略只读。Explicit optional recorder for this operation; never inferred from diagnostics.
signalAbortSignal必需只读。Non-optional cancellation signal; never undefined once execution has started.
diagnosticsDiagnosticContext | undefined可省略只读。Diagnostic scope of the enclosing call, when recording is enabled.

返回: Promise<FamilyRecord<State>>。

等待后的值: FamilyRecord<State>。

返回值结构
字段类型必需说明
idstring必需只读。Family id; also the store key.
revisionnumber必需只读。Optimistic concurrency token; every accepted mutation increments it by one.
activeIdstring必需只读。Id of the active version; promotion moves this pointer.
expiresAtMsnumber必需只读。Instant after which the record is no longer retained, in epoch milliseconds.
versionsreadonly FamilyVersion<State>[]必需只读。Versions in creation order; bounded by maxVersions when configured.

fork ​

Appends a version forked from parentId; the active pointer does not change.

ts
AgentFamily.fork(request: { id: string; revision: number; parentId: string; branch: AgentBranch; state: State; }, context: OperationContext<App>): Promise<FamilyRecord<State>>

Appends a version forked from parentId; the active pointer does not change.

参数类型传递说明
request{ id: string; revision: number; parentId: string; branch: AgentBranch; state: State; }必需—
contextOperationContext<App>必需—
request 的字段
字段类型必需说明
idstring必需见类型定义及调用场景。
revisionnumber必需见类型定义及调用场景。
parentIdstring必需见类型定义及调用场景。
branchAgentBranch必需见类型定义及调用场景。
stateState必需见类型定义及调用场景。
context 的字段
字段类型必需说明
appunknown extends App ? App : Readonly<App>必需只读。见类型定义及调用场景。
loggerSubFlowLog | undefined可省略只读。Explicit optional recorder for this operation; never inferred from diagnostics.
signalAbortSignal必需只读。Non-optional cancellation signal; never undefined once execution has started.
diagnosticsDiagnosticContext | undefined可省略只读。Diagnostic scope of the enclosing call, when recording is enabled.

返回: Promise<FamilyRecord<State>>。

等待后的值: FamilyRecord<State>。

返回值结构
字段类型必需说明
idstring必需只读。Family id; also the store key.
revisionnumber必需只读。Optimistic concurrency token; every accepted mutation increments it by one.
activeIdstring必需只读。Id of the active version; promotion moves this pointer.
expiresAtMsnumber必需只读。Instant after which the record is no longer retained, in epoch milliseconds.
versionsreadonly FamilyVersion<State>[]必需只读。Versions in creation order; bounded by maxVersions when configured.

merge ​

Merges source into target; saved is false when the merge reported conflicts.

ts
AgentFamily.merge(request: { id: string; revision: number; baseId: string; targetId: string; sourceId: string; }, context: OperationContext<App>): Promise<{ saved: boolean; record: FamilyRecord<State>; conflicts: readonly string[]; }>

Merges source into target; saved is false when the merge reported conflicts.

参数类型传递说明
request{ id: string; revision: number; baseId: string; targetId: string; sourceId: string; }必需—
contextOperationContext<App>必需—
request 的字段
字段类型必需说明
idstring必需见类型定义及调用场景。
revisionnumber必需见类型定义及调用场景。
baseIdstring必需见类型定义及调用场景。
targetIdstring必需见类型定义及调用场景。
sourceIdstring必需见类型定义及调用场景。
context 的字段
字段类型必需说明
appunknown extends App ? App : Readonly<App>必需只读。见类型定义及调用场景。
loggerSubFlowLog | undefined可省略只读。Explicit optional recorder for this operation; never inferred from diagnostics.
signalAbortSignal必需只读。Non-optional cancellation signal; never undefined once execution has started.
diagnosticsDiagnosticContext | undefined可省略只读。Diagnostic scope of the enclosing call, when recording is enabled.

返回: Promise<{ saved: boolean; record: FamilyRecord<State>; conflicts: readonly string[]; }>。

等待后的值: { saved: boolean; record: FamilyRecord<State>; conflicts: readonly string[]; }。

返回值结构
字段类型必需说明
savedboolean必需见类型定义及调用场景。
recordFamilyRecord<State>必需见类型定义及调用场景。
conflictsreadonly string[]必需见类型定义及调用场景。

promote ​

Makes candidateId active; fails when the active version changed since expectedActiveId.

ts
AgentFamily.promote(request: { id: string; revision: number; candidateId: string; expectedActiveId: string; }, context: OperationContext<App>): Promise<FamilyRecord<State>>

Makes candidateId active; fails when the active version changed since expectedActiveId.

参数类型传递说明
request{ id: string; revision: number; candidateId: string; expectedActiveId: string; }必需—
contextOperationContext<App>必需—
request 的字段
字段类型必需说明
idstring必需见类型定义及调用场景。
revisionnumber必需见类型定义及调用场景。
candidateIdstring必需见类型定义及调用场景。
expectedActiveIdstring必需见类型定义及调用场景。
context 的字段
字段类型必需说明
appunknown extends App ? App : Readonly<App>必需只读。见类型定义及调用场景。
loggerSubFlowLog | undefined可省略只读。Explicit optional recorder for this operation; never inferred from diagnostics.
signalAbortSignal必需只读。Non-optional cancellation signal; never undefined once execution has started.
diagnosticsDiagnosticContext | undefined可省略只读。Diagnostic scope of the enclosing call, when recording is enabled.

返回: Promise<FamilyRecord<State>>。

等待后的值: FamilyRecord<State>。

返回值结构
字段类型必需说明
idstring必需只读。Family id; also the store key.
revisionnumber必需只读。Optimistic concurrency token; every accepted mutation increments it by one.
activeIdstring必需只读。Id of the active version; promotion moves this pointer.
expiresAtMsnumber必需只读。Instant after which the record is no longer retained, in epoch milliseconds.
versionsreadonly FamilyVersion<State>[]必需只读。Versions in creation order; bounded by maxVersions when configured.

使用示例 ​

配置状态检查、来源验证和三方合并 ​

配置 · Node.js

ts
import { defineAgentFamily } from '@jangts/agent-core/kits/family';
import type { FamilyStore } from '@jangts/agent-core/kits/family';
import type { OperationContext } from '@jangts/agent-core';

type State = { goal: string; sourceRevision: string };
export function family<App>(store: FamilyStore<State>,
  authorize: (context: OperationContext<App>) => Promise<void>,
  verify: (state: State) => Promise<void>) {
  return defineAgentFamily<State, App>({
    store, maxVersions: 16, retentionMs: 7 * 86400000,
    isState: (value): value is State => !!value && typeof (value as State).goal === 'string'
      && typeof (value as State).sourceRevision === 'string',
    authorize: (_operation, _record, context) => authorize(context),
    validate: candidate => verify(candidate.state),
    async merge({ base, target, source }) {
      if (target.goal !== base.goal && source.goal !== base.goal && target.goal !== source.goal)
        return { conflicts: ['goal'] };
      return { value: target.goal === base.goal ? source : target, conflicts: [] };
    },
  });
}
js
import { defineAgentFamily } from '@jangts/agent-core/kits/family';
export function family(store, authorize, verify) {
    return defineAgentFamily({
        store, maxVersions: 16, retentionMs: 7 * 86400000,
        isState: (value) => !!value && typeof value.goal === 'string'
            && typeof value.sourceRevision === 'string',
        authorize: (_operation, _record, context) => authorize(context),
        validate: candidate => verify(candidate.state),
        async merge({ base, target, source }) {
            if (target.goal !== base.goal && source.goal !== base.goal && target.goal !== source.goal)
                return { conflicts: ['goal'] };
            return { value: target.goal === base.goal ? source : target, conflicts: [] };
        },
    });
}

显式启用已批准的候选版本 ​

扩展 · Node.js

App 在真实审批后调用;promote 仍重新执行来源、授权、版本和 CAS 检查。

ts
import type { AgentFamily } from '@jangts/agent-core/kits/family';
import type { OperationContext } from '@jangts/agent-core';

export async function activate<State, App>(family: AgentFamily<State, App>, id: string,
  candidateId: string, context: OperationContext<App>) {
  const record = await family.read(id, context);
  return family.promote({ id, revision: record.revision, candidateId,
    expectedActiveId: record.activeId }, context);
}
js
export async function activate(family, id, candidateId, context) {
    const record = await family.read(id, context);
    return family.promote({ id, revision: record.revision, candidateId,
        expectedActiveId: record.activeId }, context);
}

相关策略源码 ​

相关定义 ​

接口参考、使用示例与开发指南。