fix(changes): accept opencode evidence contract version
This commit is contained in:
parent
33a8a5fabc
commit
7b5924c8bd
2 changed files with 44 additions and 1 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
import { createHash } from 'crypto';
|
import { createHash } from 'crypto';
|
||||||
|
|
||||||
export const OPEN_CODE_BRIDGE_SCHEMA_VERSION = 1 as const;
|
export const OPEN_CODE_BRIDGE_SCHEMA_VERSION = 1 as const;
|
||||||
|
export const OPEN_CODE_TASK_LEDGER_EVIDENCE_CONTRACT_VERSION = 1 as const;
|
||||||
|
|
||||||
export type OpenCodeBridgeCommandName =
|
export type OpenCodeBridgeCommandName =
|
||||||
| 'opencode.handshake'
|
| 'opencode.handshake'
|
||||||
|
|
@ -259,6 +260,7 @@ export type OpenCodeBackfillTaskLedgerOutcome =
|
||||||
export interface OpenCodeBackfillTaskLedgerCommandData {
|
export interface OpenCodeBackfillTaskLedgerCommandData {
|
||||||
schemaVersion: 1;
|
schemaVersion: 1;
|
||||||
providerId: 'opencode';
|
providerId: 'opencode';
|
||||||
|
opencodeTaskLedgerEvidenceContractVersion?: number;
|
||||||
teamName: string;
|
teamName: string;
|
||||||
taskId?: string;
|
taskId?: string;
|
||||||
projectDir?: string;
|
projectDir?: string;
|
||||||
|
|
@ -362,6 +364,7 @@ export interface OpenCodeBridgePeerIdentity {
|
||||||
minVersion: number;
|
minVersion: number;
|
||||||
currentVersion: number;
|
currentVersion: number;
|
||||||
supportedCommands: OpenCodeBridgeCommandName[];
|
supportedCommands: OpenCodeBridgeCommandName[];
|
||||||
|
opencodeTaskLedgerEvidenceContractVersion?: number;
|
||||||
};
|
};
|
||||||
runtime: {
|
runtime: {
|
||||||
providerId: 'opencode';
|
providerId: 'opencode';
|
||||||
|
|
@ -846,7 +849,10 @@ function isPeerIdentity(value: unknown): value is OpenCodeBridgePeerIdentity {
|
||||||
(bridgeProtocol.minVersion as number) < 1 ||
|
(bridgeProtocol.minVersion as number) < 1 ||
|
||||||
(bridgeProtocol.currentVersion as number) < (bridgeProtocol.minVersion as number) ||
|
(bridgeProtocol.currentVersion as number) < (bridgeProtocol.minVersion as number) ||
|
||||||
!Array.isArray(bridgeProtocol.supportedCommands) ||
|
!Array.isArray(bridgeProtocol.supportedCommands) ||
|
||||||
!bridgeProtocol.supportedCommands.every(isOpenCodeBridgeCommandName)
|
!bridgeProtocol.supportedCommands.every(isOpenCodeBridgeCommandName) ||
|
||||||
|
(bridgeProtocol.opencodeTaskLedgerEvidenceContractVersion !== undefined &&
|
||||||
|
(!Number.isInteger(bridgeProtocol.opencodeTaskLedgerEvidenceContractVersion) ||
|
||||||
|
(bridgeProtocol.opencodeTaskLedgerEvidenceContractVersion as number) < 1))
|
||||||
) {
|
) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import {
|
||||||
createOpenCodeBridgeHandshakeIdentityHash,
|
createOpenCodeBridgeHandshakeIdentityHash,
|
||||||
createOpenCodeBridgeIdempotencyKey,
|
createOpenCodeBridgeIdempotencyKey,
|
||||||
isOpenCodeBridgeCommandName,
|
isOpenCodeBridgeCommandName,
|
||||||
|
OPEN_CODE_TASK_LEDGER_EVIDENCE_CONTRACT_VERSION,
|
||||||
parseSingleBridgeJsonResult,
|
parseSingleBridgeJsonResult,
|
||||||
stableHash,
|
stableHash,
|
||||||
validateBridgeResultEnvelope,
|
validateBridgeResultEnvelope,
|
||||||
|
|
@ -202,6 +203,42 @@ describe('OpenCodeBridgeCommandContract', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('accepts handshake evidence contract version and rejects invalid values', () => {
|
||||||
|
const client = peerIdentity('claude_team');
|
||||||
|
const server = peerIdentity('agent_teams_orchestrator');
|
||||||
|
server.bridgeProtocol.opencodeTaskLedgerEvidenceContractVersion =
|
||||||
|
OPEN_CODE_TASK_LEDGER_EVIDENCE_CONTRACT_VERSION;
|
||||||
|
const validHandshake = buildHandshake({ client, server });
|
||||||
|
|
||||||
|
expect(
|
||||||
|
validateOpenCodeBridgeHandshake({
|
||||||
|
handshake: validHandshake,
|
||||||
|
expectedClient: client,
|
||||||
|
requiredCommand: 'opencode.launchTeam',
|
||||||
|
expectedCapabilitySnapshotId: 'cap-1',
|
||||||
|
expectedManifestHighWatermark: 10,
|
||||||
|
expectedRunId: 'run-1',
|
||||||
|
})
|
||||||
|
).toEqual({ ok: true });
|
||||||
|
|
||||||
|
server.bridgeProtocol.opencodeTaskLedgerEvidenceContractVersion = 0;
|
||||||
|
const invalidHandshake = buildHandshake({ client, server });
|
||||||
|
|
||||||
|
expect(
|
||||||
|
validateOpenCodeBridgeHandshake({
|
||||||
|
handshake: invalidHandshake,
|
||||||
|
expectedClient: client,
|
||||||
|
requiredCommand: 'opencode.launchTeam',
|
||||||
|
expectedCapabilitySnapshotId: 'cap-1',
|
||||||
|
expectedManifestHighWatermark: 10,
|
||||||
|
expectedRunId: 'run-1',
|
||||||
|
})
|
||||||
|
).toEqual({
|
||||||
|
ok: false,
|
||||||
|
reason: 'Bridge handshake peer identity is invalid',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('creates deterministic idempotency keys for equivalent JSON bodies', () => {
|
it('creates deterministic idempotency keys for equivalent JSON bodies', () => {
|
||||||
const first = createOpenCodeBridgeIdempotencyKey({
|
const first = createOpenCodeBridgeIdempotencyKey({
|
||||||
command: 'opencode.launchTeam',
|
command: 'opencode.launchTeam',
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue