glm-5.3-flash
713f1eba46
docs(tasks): review-001 forward-url-safety remediation complete
2026-08-29 10:09:33 +00:00
glm-5.3-flash
cc34c08e4e
fix(adapters): incremental byte-level SSE parser (FWD-06)
...
Replace per-chunk parse_sse_frames with SseParser holding raw bytes
across chunks: reassembles frames split at TCP boundaries (the review's
silently-losing case), decodes UTF-8 per complete line so multi-byte
chars split across chunks survive, caps the buffer at 1 MiB
(SSE_EVENT_BUFFER_CAP) and dispatches a pending event at EOF.
forward_stream threads the parser through its unfold state and emits a
terminal error envelope on cap overflow. Existing single-chunk SSE test
assertions preserved; added multi-chunk, split-UTF-8, EOF-dispatch, and
cap tests.
Verified: cargo test (219 pass), clippy -D warnings, fmt --check.
2026-08-29 08:35:33 +00:00
glm-5.3-flash
0a8d4d731f
fix(adapters): bounded, cycle-safe $ref resolution (OAI-01, OAI-08)
...
resolve_refs_recursive recursed with no cycle detection and no depth
budget; a self-referential OpenAPI component stack-overflowed and
aborted the process (uncatchable, kills import()).
- add branch-scoped visited set on the JSON-pointer ref path: a ref
re-entering its own expansion chain errors cleanly with
AdapterError::SchemaParse naming the offending ref (OAI-01)
- add depth budget (MAX_REF_RESOLUTION_DEPTH = 64) bounding $ref hop
chains and schema nesting height; over-deep specs error cleanly
instead of exhausting the stack (OAI-01)
- clean loud error over depth-limited expansion: recursive schemas
(trees, linked lists, cursor pagination) fail import rather than
expand unboundedly
- shared refs to a common schema (diamond/repeated) still resolve —
visited set is branch-scoped, not global
- OAI-08: replace the two guarded expects in from_value
("paths is object", "schemas is object") with if-let paths
Verification: cargo test 188 passed / 0 failed; clippy
--all-targets -D warnings clean; fmt --check clean
2026-08-29 07:53:01 +00:00
glm-5.3-flash
12b35e2c5f
docs(tasks): decompose review 001 remediation Units 1-5 into taskgraph tasks
...
21 review-001 tasks across server/adapters/client/gateway/websocket/infra,
chunked from the 7-unit remediation plan in
docs/reviews/001-initial-implementation-review.md.
- Scope split by mechanism, not one-per-finding: 15 tasks in generation 1
(parallelizable), 6 sequenced after their file-sharing precursors
- Deliberately deferred until dependent fixes land: projection/doc
fidelity partial (Unit 6 beyond dependency hygiene), coverage backfills
(COV-01..07 via in-task acceptance for forward.rs), and per-finding
minors (OAI-06/07, HY-02/04/06/10/11, CON-08)
- Cross-crate WS-12 (alkcall demux 4 GiB discard alloc) noted for filing
in alkcall, not here
taskgraph: validate clean, no cycles, 6 generations
2026-08-29 07:10:15 +00:00
glm-5.3-flash
3a906cbd6a
feat(adapters): from_wss consumer adapter behind the wss feature (ADR-070)
...
- FromWss: dial wss:// -> split_tungstenite_to_bytes (client-side twin
of the axum WS byte-adapter; one seam, both directions, OQ-01) ->
Connection::from_bidi(b"alk/channels") -> alkcall ChannelClient
(channel 0 install + dispatch loop) -> alkcall from_call importer.
No protocol fork: specs mirror the remote, provenance FromCall.
- Drop semantics (OQ-03 v1): session drop -> monitor fails all
in-flight pendings retryable CONNECTION_CLOSED (WsPumps::read_eof
Notify); no 30s-deadline hang.
- Bearer token via constructor/assembly layer (ADR-014 no-env-vars).
Production fix in the WS server half (upgrade.rs): the upgrade
identity now propagates to channel 0's CallConnection (was
AuthContext::anonymous -> dispatcher saw no identity, ACL checks ran
unauthenticated; services/list filtered scoped ops for all callers).
9 in-module tests incl. full round-trip consumer<->server (both halves
of the adapter together), ACL end-to-end, drop-no-hang.
Verified: cargo test (227 lib default), --all-features (227 lib + 5
MCP + 10 WS integration), clippy -D warnings (both), fmt.
2026-08-28 14:54:09 +00:00
glm-5.3-flash
4ac337c3a5
feat(adapters): from_mcp + to_mcp behind the mcp feature (rmcp 1.8)
...
from_mcp (src/adapters/from_mcp/):
- tools/list discovery over streamable HTTP; per-tool
HandlerRegistration (Mutation, Once, FromMCP leaf, Internal;
ADR-015/022)
- structuredContent-preferred output, ContentBlock-union fallback,
isError -> MCP_TOOL_ERROR with content blocks as details (ADR-023)
- bearer token flows via capabilities key 'mcp' (ADR-014 no-env-vars)
- 19 unit tests + tests/from_mcp_integration.rs (5 tests vs a real
rmcp streamable-HTTP MCP server)
to_mcp (src/adapters/to_mcp.rs):
- 4 fixed gateway tools (search/schema/call/batch, ADR-041); Sub ops
excluded from search and uncallable (MCP is request/response)
- identity survives rmcp framing: bearer_auth_middleware stashes
Option<Identity> in http::request::Parts extensions, call_tool reads
it back from RequestContext extensions
- StreamableHttpService nested at /mcp in HttpAdapter's router,
bearer middleware around it (feature-gated)
Streamable HTTP only (ADR-037): rmcp default-features off, no stdio.
Default build compiles without rmcp (cargo tree: 0 hits).
Verified: cargo test (182 lib default / 218 all-features) + 5 MCP
integration + 10 WS, clippy -D warnings (both), fmt.
2026-08-28 14:14:09 +00:00
glm-5.3-flash
7be91987ca
feat(adapters): from_openapi adapter (parse + forwarding handlers)
...
Ported FromOpenAPI on the pre-staged foundations:
- openapi_spec.rs (from_json/from_yaml/from_str JSON-first per ADR-051,
$ref resolution) — already shared with to_openapi
- forward.rs shared forwarding core (build_request/forward/
forward_stream/parse_sse_frames) — already shared with from_jsonschema
New in this port:
- FromOpenAPI adapter: op-id normalization (declared or
{method}_{path}), op-type detection (GET->Query, else Mutation;
200/201 text/event-stream -> Sub), input schema from parameters +
requestBody 'body', error schemas as HTTP_<status> (ADR-023),
Internal visibility + FromOpenAPI provenance (ADR-015/022),
Query/Mutation -> Once, Sub -> Stream (Pub never produced, v1)
- 47 in-module tests: wire-level integration over real TCP
(echo + capturing servers), bearer/api-key/basic credential
injection from Capabilities (ADR-014 no-env-vars), SSE streaming,
YAML + from_str + ADR-051 yes-string guards
- removed dead_code allows from openapi_spec.rs (now consumed)
Verified: cargo test (182 lib), test --all-features (182+10 WS),
clippy -D warnings (both), fmt.
2026-08-28 14:04:48 +00:00
glm-5.3-flash
42239a0af5
feat(gateway,adapters): /publish endpoint (ADR-068) + to_openapi 6-endpoint projection
...
gateway-publish:
- GatewayDispatch::invoke_sink (internal:false, forwarded_for:None)
- POST /publish: NDJSON body, first line {operation, chunk} (OQ-02
resolved: first-line convention; terminal errors = plain HTTP status
+ JSON body, not NDJSON lines); 404 internal/unknown, 401/403 ACL,
400 INVALID_OPERATION_TYPE for non-Pub
- ADR-068 + open-questions.md updated with the OQ-02 resolution
adapter-to-openapi:
- src/adapters/openapi_spec.rs: OpenAPISpec model (JSON/YAML/from_str
JSON-first per ADR-051, $ref resolution) shared by from/to_openapi
- src/adapters/to_openapi.rs: 6-endpoint projection, info.version
1.0.0 -> 1.1.0 (minor: /publish addition per ADR-045), /publish
NDJSON doc with 400 oneOf (INVALID_INPUT + INVALID_OPERATION_TYPE),
ADR-023 error fidelity (protocol statuses, HTTP_<status> passthrough,
internal-op exclusion)
- GET /openapi.json wired into HttpAdapter's router (bearer-auth layer)
Verified: cargo test (136 lib), test --all-features (136+10 WS),
clippy -D warnings (both), fmt. Doc validates against openapiv3.
2026-08-28 13:54:49 +00:00
glm-5.3-flash
ad975408e7
feat(adapters): from_jsonschema single-endpoint adapter + shared forwarding core
...
- src/adapters/forward.rs: shared HTTP forwarding core (extracted from
old from_openapi) — HttpServiceConfig/HttpAuthScheme, build_request
with capabilities-based credential injection (no env vars), forward
+ forward_stream (SSE projection), parse_sse_frames
- src/adapters/from_jsonschema.rs: FromJsonSchema OperationAdapter
(ADR-066) — one registration per call, FromJsonSchema provenance
(leaf, Internal default), Sub -> HandlerKind::Stream (text/event-stream)
- adapted to alkcall 0.1.1: OperationType::Sub, alkcall::client
adapter traits
Verified: cargo test (106 lib tests), clippy -D warnings, fmt.
2026-08-28 13:43:35 +00:00
glm-5.3-flash
63dc4b6d06
docs: implementation plan (TTY precedents folded in); task decomposition (17 tasks)
...
Plan updated with the alknet-tty findings: the drainer pattern
(single ordered writer) makes outbound chunk-boundary parsing sound;
TestStdinSink's try_send→Full→Pending is the inbound backpressure
precedent; OQ-01(a) now cites the reference.
Task graph (taskgraph-validated, 17 tasks, 6 generations, no cycles):
- tasks/server/: core-types, auth, healthz-decoy, adapter
- tasks/gateway/: dispatch, routes, publish
- tasks/websocket/: byte-adapter (research POC), upgrade-session, overlay-ops
- tasks/adapters/: from-openapi, from-jsonschema, to-openapi, from-wss, mcp
- tasks/client/: http-host
- tasks/infra/: integration-suite (phase 4)
Critical path runs through server core → adapter → WS session →
overlay tests → integration suite. High-risk tasks are the three WS
tasks, de-risked by the ws-byte-adapter POC blocking upgrade-session.
2026-08-28 06:05:45 +00:00