Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Sentrux Review Report

- Actor: `codex`
- Scope: `agentos-tsc-cleanup`
- Timestamp: `2026-04-04T02:26:09+07:00`
- Worktree: `/home/wunitb/unitb_labs/wunb-agentos-beeos/.worktrees/agentos-beeos-main-runtime`
- Base commit: `4b4de07e2603d71f87bee17a91a8185dcb82e6a7`

## Commands Used

```text
npx tsc -p tsconfig.json --noEmit --pretty false
npm test -- src/__tests__/mcp-client.test.ts src/__tests__/security-headers.test.ts src/__tests__/skillkit-bridge.test.ts src/__tests__/streaming.test.ts src/__tests__/llm-router.test.ts src/__tests__/session-lifecycle.test.ts src/__tests__/cron.test.ts src/__tests__/api.test.ts
git diff --check
Sentrux scan: /home/wunitb/unitb_labs/wunb-agentos-beeos/.worktrees/agentos-beeos-main-runtime
Sentrux check_rules
```

## Findings

- Severity: medium
- Area: TypeScript compile hygiene and iii-sdk contract drift
- Evidence: `tsc` initially failed on test mock signatures, `request_format`/`response_format` shape in `src/api.ts`, `unknown` state-list returns in `src/context-cache.ts`, `src/cron.ts`, and `src/session-lifecycle.ts`, plus drift around `agentTier`, `function_id`, and `globalThis.vitest`.
- Recommended change: align local typings with current iii-sdk schema contract, keep request/response schemas wrapped in a top-level object format node, and prefer explicit narrowing/casts at `state::*` boundaries instead of relying on `any`.

## Handoff For Dev Session

- Files likely affected:
`src/api.ts`, `src/llm-router.ts`, `src/types.ts`, `src/context-cache.ts`, `src/cron.ts`, `src/session-lifecycle.ts`, `src/shared/metrics.ts`, `src/evolve.ts`, targeted test files.
- First fix to attempt:
Re-run `tsc` first whenever `iii-sdk` is upgraded, because compile errors clearly expose contract drift before runtime.
- Verification expected after fix:
`npx tsc -p tsconfig.json --noEmit --pretty false` exits 0 and the targeted vitest slice above stays green.

## MegaMemory Update

- Created concept: `agentos-runtime-typescript-contract-cleanup`
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Sentrux Review Report

- Actor: `codex`
- Scope: `agentos-runtime-latest-main-sync`
- Timestamp: `2026-04-04T20:47:00+07:00`
- Worktree: `/home/wunitb/unitb_labs/wunb-agentos-beeos/.worktrees/agentos-beeos-main-runtime`

## Commands Used

```text
git fetch --all --prune
git switch --detach origin/main
git cherry-pick -n 9179d7f9410d4ed8b44e25c90400e2db9479502e
npx tsc -p tsconfig.json --noEmit --pretty false
npm test -- src/__tests__/mcp-client.test.ts src/__tests__/security-headers.test.ts src/__tests__/skillkit-bridge.test.ts src/__tests__/streaming.test.ts src/__tests__/llm-router.test.ts src/__tests__/session-lifecycle.test.ts src/__tests__/cron.test.ts src/__tests__/api.test.ts
git diff --check
sentrux scan /home/wunitb/unitb_labs/wunb-agentos-beeos/.worktrees/agentos-beeos-main-runtime
```

## Findings

- Upstream `origin/main` advanced to `c664876` but was not runtime-clean for this BeeOS baseline.
- Reapplying the previous runtime TypeScript cleanup onto latest main resolved the drift with two extra surgical fixes in `src/llm-router.ts` and `src/memory.ts`.
- Fresh verification passed: targeted tests `152/152`, `tsc` clean, and `git diff --check` clean.
- Sentrux scan reported `quality_signal 6112`.
- No local `.sentrux/rules.toml` exists in this repo/worktree, so rule-gate verification is not available here.

## Handoff

- Runtime worktree branch: `beeos-main-runtime-latest`
- Baseline commit after local sync should be used by `beeos-agentos.service`
- `node_modules` remains an intentional untracked symlink runtime asset
8 changes: 6 additions & 2 deletions src/__tests__/mcp-client.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { describe, it, expect, vi, beforeEach, beforeAll } from "vitest";

const mockTrigger = vi.fn(async () => null);
const mockTriggerVoid = vi.fn();
const mockTrigger = vi.fn(
async (_fnId?: string, _payload?: unknown): Promise<null> => null,
);
const mockTriggerVoid = vi.fn(
(_fnId?: string, _payload?: unknown): void => undefined,
);

const handlers: Record<string, Function> = {};
const triggerRefs: any[] = [];
Expand Down
8 changes: 6 additions & 2 deletions src/__tests__/security-headers.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
import { describe, it, expect, vi, beforeAll } from "vitest";

const handlers: Record<string, Function> = {};
const mockTrigger = vi.fn(async () => null);
const mockTriggerVoid = vi.fn();
const mockTrigger = vi.fn(
async (_fnId?: string, _payload?: unknown): Promise<null> => null,
);
const mockTriggerVoid = vi.fn(
(_fnId?: string, _payload?: unknown): void => undefined,
);
vi.mock("iii-sdk", () => ({
registerWorker: () => ({
registerFunction: (config: any, handler: Function) => { handlers[config.id] = handler; },
Expand Down
8 changes: 6 additions & 2 deletions src/__tests__/skillkit-bridge.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
import { describe, it, expect, vi, beforeEach, beforeAll } from "vitest";

const handlers: Record<string, Function> = {};
const mockTrigger = vi.fn(async () => null);
const mockTriggerVoid = vi.fn();
const mockTrigger = vi.fn(
async (_fnId?: string, _payload?: unknown): Promise<null> => null,
);
const mockTriggerVoid = vi.fn(
(_fnId?: string, _payload?: unknown): void => undefined,
);
vi.mock("iii-sdk", () => ({
registerWorker: () => ({
registerFunction: (config: any, handler: Function) => {
Expand Down
3 changes: 3 additions & 0 deletions src/__tests__/streaming.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ const mockTrigger = vi.fn(async (fnId: string, data?: any): Promise<any> => {
};
return null;
});
const mockTriggerVoid = vi.fn(
(_fnId?: string, _payload?: unknown): void => undefined,
);

const handlers: Record<string, Function> = {};
vi.mock("iii-sdk", () => ({
Expand Down
194 changes: 111 additions & 83 deletions src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,60 +73,68 @@ registerFunction(
id: "api::chat_completions",
description: "OpenAI-compatible chat completions",
metadata: { category: "api" },
request_format: [
{ name: "model", type: "string", required: true, description: "Model identifier" },
{
name: "messages",
type: "array",
required: true,
description: "Array of chat messages",
items: {
name: "message",
type: "object",
body: [
{ name: "role", type: "string", required: true },
{ name: "content", type: "string", required: true },
],
request_format: {
name: "chat_completions_request",
type: "object",
body: [
{ name: "model", type: "string", required: true, description: "Model identifier" },
{
name: "messages",
type: "array",
required: true,
description: "Array of chat messages",
items: {
name: "message",
type: "object",
body: [
{ name: "role", type: "string", required: true },
{ name: "content", type: "string", required: true },
],
},
},
},
],
response_format: [
{ name: "id", type: "string", description: "Completion ID" },
{ name: "object", type: "string", description: "Object type" },
{ name: "created", type: "number", description: "Unix timestamp" },
{ name: "model", type: "string", description: "Model used" },
{
name: "choices",
type: "array",
description: "Completion choices",
items: {
name: "choice",
],
},
response_format: {
name: "chat_completions_response",
type: "object",
body: [
{ name: "id", type: "string", description: "Completion ID" },
{ name: "object", type: "string", description: "Object type" },
{ name: "created", type: "number", description: "Unix timestamp" },
{ name: "model", type: "string", description: "Model used" },
{
name: "choices",
type: "array",
description: "Completion choices",
items: {
name: "choice",
type: "object",
body: [
{ name: "index", type: "number" },
{
name: "message",
type: "object",
body: [
{ name: "role", type: "string" },
{ name: "content", type: "string" },
],
},
{ name: "finish_reason", type: "string" },
],
},
},
{
name: "usage",
type: "object",
description: "Token usage",
body: [
{ name: "index", type: "number" },
{
name: "message",
type: "object",
body: [
{ name: "role", type: "string" },
{ name: "content", type: "string" },
],
},
{ name: "finish_reason", type: "string" },
{ name: "prompt_tokens", type: "number" },
{ name: "completion_tokens", type: "number" },
{ name: "total_tokens", type: "number" },
],
},
},
{
name: "usage",
type: "object",
description: "Token usage",
body: [
{ name: "prompt_tokens", type: "number" },
{ name: "completion_tokens", type: "number" },
{ name: "total_tokens", type: "number" },
],
},
],
],
},
},
async (req) => {
const authErr = authGuard(req);
Expand Down Expand Up @@ -175,24 +183,32 @@ registerFunction(
id: "api::agent_message",
description: "Send message to a specific agent",
metadata: { category: "api" },
request_format: [
{ name: "message", type: "string", required: true, description: "Message to send" },
{ name: "sessionId", type: "string", required: false, description: "Optional session ID" },
],
response_format: [
{ name: "content", type: "string", description: "Agent response content" },
{ name: "model", type: "string", description: "Model used" },
{
name: "usage",
type: "object",
description: "Token usage",
body: [
{ name: "input", type: "number" },
{ name: "output", type: "number" },
{ name: "total", type: "number" },
],
},
],
request_format: {
name: "agent_message_request",
type: "object",
body: [
{ name: "message", type: "string", required: true, description: "Message to send" },
{ name: "sessionId", type: "string", required: false, description: "Optional session ID" },
],
},
response_format: {
name: "agent_message_response",
type: "object",
body: [
{ name: "content", type: "string", description: "Agent response content" },
{ name: "model", type: "string", description: "Model used" },
{
name: "usage",
type: "object",
description: "Token usage",
body: [
{ name: "input", type: "number" },
{ name: "output", type: "number" },
{ name: "total", type: "number" },
],
},
],
},
},
async (req) => {
const authErr = authGuard(req);
Expand Down Expand Up @@ -234,16 +250,24 @@ registerFunction(
id: "api::create_agent",
description: "Create a new agent",
metadata: { category: "api" },
request_format: [
{ name: "name", type: "string", required: true, description: "Agent name" },
{ name: "systemPrompt", type: "string", required: true, description: "System prompt for the agent" },
{ name: "model", type: "string", required: true, description: "LLM model identifier" },
],
response_format: [
{ name: "id", type: "string", description: "Created agent ID" },
{ name: "name", type: "string", description: "Agent name" },
{ name: "createdAt", type: "number", description: "Creation timestamp" },
],
request_format: {
name: "create_agent_request",
type: "object",
body: [
{ name: "name", type: "string", required: true, description: "Agent name" },
{ name: "systemPrompt", type: "string", required: true, description: "System prompt for the agent" },
{ name: "model", type: "string", required: true, description: "LLM model identifier" },
],
},
response_format: {
name: "create_agent_response",
type: "object",
body: [
{ name: "id", type: "string", description: "Created agent ID" },
{ name: "name", type: "string", description: "Agent name" },
{ name: "createdAt", type: "number", description: "Creation timestamp" },
],
},
},
async (req) => {
const authErr = authGuard(req);
Expand Down Expand Up @@ -332,12 +356,16 @@ registerFunction(
id: "api::health",
description: "Health check endpoint",
metadata: { category: "api" },
response_format: [
{ name: "status", type: "string", description: "Health status" },
{ name: "version", type: "string", description: "Application version" },
{ name: "workers", type: "number", description: "Active worker count" },
{ name: "uptime", type: "number", description: "Process uptime in seconds" },
],
response_format: {
name: "health_response",
type: "object",
body: [
{ name: "status", type: "string", description: "Health status" },
{ name: "version", type: "string", description: "Application version" },
{ name: "workers", type: "number", description: "Active worker count" },
{ name: "uptime", type: "number", description: "Process uptime in seconds" },
],
},
},
async (req: any) => {
if (shutdownManager.isShuttingDown()) {
Expand Down
4 changes: 2 additions & 2 deletions src/context-cache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,10 @@ registerFunction(
return httpOk(req, { cleared: 1 });
}

const entries: any[] = await trigger({
const entries = (await trigger({
function_id: "state::list",
payload: { scope },
}).catch(() => []);
}).catch(() => [])) as any[];

let cleared = 0;
for (const entry of entries || []) {
Expand Down
Loading