Skip to content

chore(desktop): bump oasf lock to 0.2.0 from crates.io - #1

Merged
ip2a merged 72 commits into
mainfrom
chore/oasf-lock-bump
Sep 10, 2026
Merged

ip2a merged 72 commits into
mainfrom
chore/oasf-lock-bump

Conversation

@ip2a

@ip2a ip2a commented Sep 10, 2026

Copy link
Copy Markdown
Owner

Cargo.lock-only update: oasf 0.1.3 → 0.2.0 (registry source). No code changes.

ip2a and others added 30 commits August 6, 2026 20:10
Rework the heavier pages onto the shared layout primitives: the sync
page drops its form/dialog stack for the lean two-pane flow, home and
compression pages are simplified, manager/settings get layout
touch-ups, the standalone skill-prune-panel is removed, and skills
queries are reworked.
Drop the old whitelisted docs workflow and stale architecture drafts so the repo ignore rules stay maintainable.

Co-authored-by: Cursor <cursoragent@cursor.com>
Register the new providers and share ConversationState parsing so Amazon Q CLI and Kiro CLI SQLite sessions import consistently.

Co-authored-by: Cursor <cursoragent@cursor.com>
Load VS Code chatSessions for Copilot, expand OpenCode and Antigravity coverage, and align smaller provider loaders with the shared scanning patterns.

Co-authored-by: Cursor <cursoragent@cursor.com>
Apply rustfmt across the CLI and core backend while keeping session mutation, scan state, and config removal behavior unchanged.

Co-authored-by: Cursor <cursoragent@cursor.com>
Move the skills-only range picker into a shared time-range section so stats, skills, and manager views reuse one stored custom range.

Co-authored-by: Cursor <cursoragent@cursor.com>
Replace the progress-bar breakdowns with richer composition charts and ranking controls so the stats page surfaces trends more clearly.

Co-authored-by: Cursor <cursoragent@cursor.com>
Consolidate manager navigation by folding overview stats plus compression and sync lists into tabbed result panels instead of separate routes.

Co-authored-by: Cursor <cursoragent@cursor.com>
Update readiness queries, minor UI polish, and the web invariant script to match the consolidated manager navigation.

Co-authored-by: Cursor <cursoragent@cursor.com>
New table caches per-phase readiness state keyed by (phase, workspace_key),
with signature + timestamps to support snapshot reads and incremental
reconcile decisions. Fixes the cost-amplification root cause where every
GET /readiness recomputed all phases.
Add ReadinessCache (snapshot/record), per-phase signature functions, and
decide_reconcile which returns Noop/Incremental/Full based on trigger + drift.
Startup/WorkspaceChange never return Full; Manual/Retry may when cold, heavily
drifted, or past the 7-day periodic window. Readiness struct gains
reconcile_required/reconcile_reason/last_full_at/last_incremental_at fields.
5 new tests cover cold-start, record-then-stable, startup-never-full,
manual-cold-full, and signature non-emptiness.
get_readiness now reads from ReadinessCache::snapshot (O(1)) instead of full
uncached assess. reconcile_readiness uses decide_reconcile and only accepts
{workspace, trigger} — focus/priority are gone. run_worker adds per-phase
timeout (30s via channel) and total budget watchdog (120s) that force-fails
the operation, clearing active_operation_id so polling stops. Manual/Retry
preempts running Steady operations by marking them Superseded. Adds 5 API
tests covering phase ordering, close-on-empty, manual preemption, force_fail,
and trigger default.
… guesswork

Reads reconcile_required/reconcile_reason from backend snapshot instead of
guessing via localStorage. Manual refresh sends {trigger:'manual'} and the
backend decides full vs incremental based on signature drift. Removes the
first-run banner module (no longer needed). Polling interval 1500ms -> 2000ms.

Pre-existing failure: skills-page.test.tsx (13 tests) broken at HEAD c36889b,
unrelated to readiness.
…ification

- skills/server.rs:1723 SkillsState test initializer missing analysis_operations
  field (added 8/5 2928d8b, test not updated)
- api/tests.rs readiness reconcile tests: old {focus,priority} contract ->
  new {trigger:'manual'} per tiered reconcile design
- skills-page.test.tsx queries mock: add useCurrentSkillAnalysis,
  useSkillAnalysisOperation + complete mutation shapes (reset/variables)

CLI lib: 108 passed. skills-page failures 13 -> 5 (remaining are jsdom
layout gaps: recharts getBoundingClientRect + scrollIntoView, pre-existing
and unrelated to readiness).
Codex export was silently dropping Block::ToolCall and Block::ToolResult
(function_call/function_call_output are separate response_items, not
message content). OpenCode export mapped ToolCall to plain text via the
catch-all. Both now emit the provider-native tool structure so tool
history survives cross-provider migration.

- codex/write.rs: add codex_tool_response_items, emit it in the rollout loop
- opencode/write.rs: add Block::ToolCall case to block_to_opencode_part
- codex/tests.rs: cover both function_call and function_call_output shapes
…ool-call export

Milestone 1 (e646d40) added native function_call/function_call_output
export for codex and native tool-part export for opencode, but the
export_fidelity declarations still reported tool_call and tool_result
as Downgraded. export_report reads these declarations to issue MappingIssue
warnings, so the report was lying: it warned 'tool_call exported as
downgraded' when the export is actually native and preserved.

codex: tool_call/tool_result Downgraded -> Preserved
opencode: tool_call/tool_result Downgraded -> Preserved
…Call

When a single event contains both Block::ToolCall and Block::ToolResult
(e.g. cline/droid messages with paired tool_use+tool_result blocks),
the event should be classified as Observation (result is present), not
Action. claude/kimi/opencode/gemini/openclaw already checked ToolResult
first; cline and droid checked ToolCall first, producing inconsistent
EventKind assignment for the same semantic content across providers.

Swapped the check order in cline and droid to match the majority.
opencode import produces Block::Patch from native "patch" parts, but
the export path fell through to the _ wildcard and rendered the diff as
plain text — breaking the round-trip. Added an explicit Block::Patch
case in block_to_opencode_part that reconstructs the native patch part
shape (type, files[], text, summary, hash). Also corrected the export
fidelity declaration from Downgraded to Preserved.
Replace redundant _ in Role match arm with explicit Role::Other.
…ravity/windsurf

Same bug as cline/droid (fixed in 4de6860): when a single event contains
both Block::ToolCall and Block::ToolResult, the kind should be Observation
(result present), not Action. These 5 providers checked ToolCall first.

windsurf was especially broken — it hardcoded Action whenever any tool
existed, ignoring whether the result was present.

Updated pi test assertion: Action → Observation (the test fixture has
both toolCall and toolResult in one event, so Observation is correct).
… copilot, cursor

- tre: downgrade tool_call/tool_result from Preserved to Unsupported
  (mapper only produces Text + Other, never tool blocks)
- copilot: declare tool_call=Preserved and thinking=Preserved in
  import_fidelity (VS Code path produces these blocks); derive
  EventKind::Action when ToolCall present (consistent with unified
  priority scheme)
- cursor: add missing import_fidelity (Text/Thinking/ToolCall/ToolResult
  all preserved) and export_fidelity (text-only bubble export downgrades
  all structured block types)

Co-Authored-By: claude-opus
Augment uses generic_json mapper which produces Text/Thinking/ToolCall/
ToolResult blocks, but capabilities() left import_fidelity at default
(unknown). Declare preserved fidelity for the four produced block types.

Co-Authored-By: claude-opus
…mpressed

export_block_fidelity was reading fidelity.text instead of
fidelity.compressed for Block::Compressed, silently suppressing the
correct downgraded/normalized fidelity warning that providers (codex,
kimi, opencode, etc.) declare for compressed segments. Now correctly
emits the fidelity disposition for compressed content.

Co-Authored-By: claude-opus
… import

read_session_export_file now calls validate_session_schema before returning,
rejecting sessions whose schema.name or schema.version differ from the OASF
revision memorph was built against. Prevents silent field-level incompatibility
if a future oasf bump changes Schema::default().

+2 tests: rejects mismatch, accepts correct schema. 727 pass.
Two new parameterized tests covering all 23 providers:

1. all_providers_declare_consistent_fidelity: verifies export=false
   providers don't claim meaningful export fidelity, and export=true
   providers declare all 9 export_fidelity fields.

2. export_report_matches_declared_fidelity_for_all_exporters: feeds a
   canonical Session containing every Block type through export_report
   for each export-capable provider, verifying the emitted issues exactly
   match the declared export_fidelity dispositions.

These guards prevent silent drift between declared fidelity and actual
export behavior. 729 pass.
- README.md, README_zh.md, README_en.md: add Provider Support Matrix
  showing all 23 providers × import/export/manage-resume capabilities.
- All three READMEs: add OASF Compatibility section explaining schema
  version, import/export coverage, and fidelity model.
- rust/crates/memorph/CHANGELOG.md: new file documenting 0.1.32 changes
  (schema validation, fidelity guards, prior fidelity corrections).
- .gitignore: whitelist rust/crates/**/CHANGELOG.md.
…re for round-trip

DeepSeek export previously wrote item_json with a generic {source, blocks}
shape that the import parser (blocks_from_message) could not match. This
caused ToolCall/ToolResult blocks to degrade to text on memorph→DeepSeek
→memorph round-trip.

deepseek_item_json now emits the keys the import parser expects:
- ToolCall: tool_name, call_id, arguments
- ToolResult: output, tool_use_id, is_error
- fallback: source/event_id/event_kind/event_role (no tool keys)

Added round-trip test proving both block types survive export→import.
…l_result

After the item_json round-trip fix, DeepSeek export now preserves
ToolCall/ToolResult structure. The export_fidelity declaration was
still Downgraded, understating the actual capability.
Claude: full export→JSONL→import round-trip proving ToolCall (tool_use)
and ToolResult (tool_result) block structure survives intact.

Codex: full export→rollout JSONL→import round-trip proving
function_call/function_call_output items preserve ToolCall/ToolResult.

Both tests verify text blocks survive alongside tool blocks.

Covers the 'native fixture-based end-to-end round-trip' gap identified
in the OASF compatibility audit for the two most important providers.
…ck events

When an event contains both Text and ToolCall/ToolResult blocks,
deepseek_message_content previously returned the full visible text blob
(including stringified tool representations like '[Tool use: shell...]').

On reimport, blocks_from_message would then push a Text block containing
the tool text, polluting the round-tripped session.

Now content only includes Text/Thinking block text when the event has
tool blocks, keeping the content column clean for structured item_json
to carry the tool data without duplication.
ip2a and others added 29 commits August 19, 2026 16:48
Refresh the catalog and reopen the consolidated skill so users keep context while its canonical path is being resolved.

Co-authored-by: Cursor <cursoragent@cursor.com>
Follow-up batch across three areas:

- web/sessions: collapse per-block chain-of-thought chips into a single
  "Chain of thought" header tag (getEventHeaderTags) with matching block
  tag styling, plus tests and session-detail wiring.
- agent_environment: fall back to the cursor CLI bundled inside
  Cursor.app (Contents/Resources/app/bin) when PATH lookup fails,
  covered by a unit test.
- skills: add installation_targets helper deriving scoped catalog
  installation targets (used_by/scope/workspace) from active
  installations.
- widen SessionBlockTag.type with the synthetic chain header chip
- narrow WorkspaceSwitchDialog pick-mode value via mode discrimination
- allow titleAs h3 in SectionHeading
- skills-page tests: polyfill scrollIntoView, add installation_targets
  fixtures, align heatmap drill with the renamed Analyze tab, and await
  async catalog page size before asserting pagination
Port the grey-canvas layering model: white top zone centered, muted
canvas spanning the viewport, cards floating on it with hairline
borders at 50% plus a subtle shadow.

- AppShell: two-segment flex layout, canvas on main, header rule
  dropped in favor of the color boundary
- PanelCard and Card: unified border-border/50 + shadow-xs language,
  dark mode keeps full white/10 borders
- Home: hero loses its decorative rules and negative offset, session
  card adopts the shared surface, hover lightens on canvas
- Session detail: event cards share the unified surface
- Sessions list: table-fixed with explicit column widths and
  truncated workspace paths so all columns fit the card
DialogContent gains a panel variant that drops default padding and
gap and offsets the close button; full-height dialogs switch to it
instead of repeating flex/padding overrides. Also drop a stale
installations destructure in AgentInstallationSection left over from
the installationTargets rename.
@ip2a
ip2a merged commit 5ae0ea7 into main Sep 10, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant