Files
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

136 lines
4.0 KiB
TypeScript

import assert from "node:assert/strict";
import test from "node:test";
import type { AgentProviderComposerOptionsResponse } from "@tutti-os/client-tuttid-ts";
import { agentActivityComposerOptionsFromTuttidResult } from "./composerOptions.ts";
test("maps daemon composer options into the canonical activity contract", () => {
const options = agentActivityComposerOptionsFromTuttidResult("codex", {
codexSaverModeSupported: true,
rtkSaverModeSupported: true,
behavior: {
collapseModelOptionsToLatest: false,
modelOptionsAuthoritative: true,
planModeExclusiveWithPermissionMode: false,
prewarmDraftSession: false,
refreshModelOptionsAfterSettings: true
},
effectiveSettings: {
codexSaverMode: true,
rtkSaverMode: true,
model: "gpt-5"
},
modelConfig: {
configurable: true,
effectiveValue: "claude-haiku-4-5-20251001",
options: [
{
id: "gpt-5",
label: "GPT-5",
value: "gpt-5",
consumptionMultiplier: "0.71"
}
]
},
permissionConfig: { configurable: false, modes: [] },
reasoningConfig: { configurable: false, options: [] },
reasoningOptionsByModel: {},
runtimeContext: {},
commands: [],
skills: [],
capabilityCatalog: [],
provider: "codex"
} satisfies AgentProviderComposerOptionsResponse);
assert.equal(options.provider, "codex");
assert.equal(options.codexSaverModeSupported, true);
assert.equal(options.rtkSaverModeSupported, true);
assert.equal(options.effectiveSettings?.codexSaverMode, true);
assert.equal(options.effectiveSettings?.rtkSaverMode, true);
assert.equal(options.modelConfigurable, true);
assert.equal(options.effectiveModel, "claude-haiku-4-5-20251001");
assert.deepEqual(options.models, [
{
label: "GPT-5",
value: "gpt-5",
consumptionMultiplier: "0.71"
}
]);
assert.equal(options.effectiveSettings?.model, "gpt-5");
});
test("keeps fallback slash commands when effects are absent", () => {
const response = {
behavior: {
collapseModelOptionsToLatest: false,
modelOptionsAuthoritative: false,
planModeExclusiveWithPermissionMode: false,
prewarmDraftSession: false,
refreshModelOptionsAfterSettings: false
},
capabilityCatalog: [],
commands: [],
effectiveSettings: {},
modelConfig: { configurable: false, options: [] },
permissionConfig: { configurable: false, modes: [] },
provider: "acp:hermes",
reasoningConfig: { configurable: false, options: [] },
reasoningOptionsByModel: {},
runtimeContext: {},
skills: [],
slashCommandPolicy: {
fallbackCommands: ["compact", "help"]
}
} as unknown as AgentProviderComposerOptionsResponse;
const options = agentActivityComposerOptionsFromTuttidResult(
"acp:hermes",
response
);
assert.deepEqual(options.slashCommandPolicy, {
fallbackCommands: ["compact", "help"],
commandEffects: []
});
});
test("projects connector presentation icons from the daemon catalog", () => {
const response = {
behavior: {},
capabilityCatalog: [
{
id: "connector:github",
kind: "connector",
name: "github",
label: "GitHub",
status: "available",
invocation: "textTrigger",
iconUrl: "data:image/png;base64,Z2l0aHVi",
installedAtUnixMs: 1_786_089_600_000,
trigger: "/github"
}
],
commands: [],
effectiveSettings: {},
modelConfig: { configurable: false, options: [] },
permissionConfig: { configurable: false, modes: [] },
provider: "codex",
reasoningConfig: { configurable: false, options: [] },
reasoningOptionsByModel: {},
runtimeContext: {},
skills: []
} as unknown as AgentProviderComposerOptionsResponse;
const options = agentActivityComposerOptionsFromTuttidResult(
"codex",
response
);
assert.equal(
options.capabilityCatalog?.[0]?.iconUrl,
"data:image/png;base64,Z2l0aHVi"
);
assert.equal(
options.capabilityCatalog?.[0]?.installedAtUnixMs,
1_786_089_600_000
);
});