From 2f88c14e843605d5bd3431f805405d8a9a7fff1b Mon Sep 17 00:00:00 2001 From: deepagent-ai Date: Fri, 14 Aug 2026 15:00:01 +0800 Subject: [PATCH] Release Desktop 1.4.6 and Core 4.0.7-r2 (#115) ### Issue for this PR Closes # ### Type of change - [ ] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Please provide a description of the issue, the changes you made to fix it, and why they work. It is expected that you understand why your changes work and if you do not understand why at least say as much so a maintainer knows how much to value the PR. **If you paste a large clearly AI generated description here your PR may be IGNORED or CLOSED!** ### How did you verify your code works? ### Screenshots / recordings _If this is a UI change, please include a screenshot or recording._ ### Checklist - [ ] I have tested my changes locally - [ ] I have not included unrelated changes in this PR _If you do not follow this template your PR will be automatically rejected._ --- bun.lock | 6 +- packages/app/package.json | 2 +- .../review/dialog-review-contract.test.ts | 66 +- .../components/review/dialog-review.api.ts | 31 +- .../src/components/review/dialog-review.tsx | 25 +- .../app/src/context/directory-sync.test.ts | 457 +- packages/app/src/context/directory-sync.ts | 210 +- .../context/global-sync/event-reducer.test.ts | 145 +- .../src/context/global-sync/event-reducer.ts | 54 +- .../global-sync/session-prefetch.test.ts | 4 + .../context/global-sync/session-prefetch.ts | 3 + packages/app/src/context/server-sync.tsx | 20 +- packages/app/src/i18n/en.ts | 26 + packages/app/src/i18n/zh.ts | 20 + packages/app/src/pages/layout.tsx | 3 +- packages/app/src/pages/session.tsx | 29 +- .../composer/session-composer-region.tsx | 23 +- .../session-provider-recovery-dock.test.ts | 217 + .../session-provider-recovery-dock.tsx | 337 + .../composer/session-question-dock.tsx | 9 +- .../session/message-timeline.data.test.ts | 89 + .../pages/session/message-timeline.data.ts | 73 +- .../src/pages/session/message-timeline.tsx | 184 +- packages/app/src/utils/diffs.test.ts | 47 +- packages/app/src/utils/diffs.ts | 32 +- .../migration.sql | 960 + .../schema-checkpoint | 5 + .../snapshot.json | 16020 ++++++++++++++++ packages/core/package.json | 2 +- .../core/script/live-llm/v2-provider-loop.ts | 46 +- packages/core/script/migration.ts | 21 +- packages/core/src/agent-gateway.ts | 371 +- .../core/src/context-federation/adapters.ts | 87 +- .../core/src/context-federation/federation.ts | 1 + .../context-federation/provider-attempt.ts | 470 +- .../src/context-federation/provider-owner.ts | 180 + packages/core/src/context-federation/query.ts | 3 + .../core/src/context-federation/rollout.ts | 35 +- .../src/context-federation/session-context.ts | 71 +- .../src/context-federation/session-sql.ts | 44 +- .../core/src/control-plane/move-session.ts | 106 +- packages/core/src/database/database.ts | 14 + packages/core/src/database/migration.gen.ts | 59 + packages/core/src/database/migration.ts | 391 +- ...7_released_knowledge_snapshot_authority.ts | 316 + ...260811190000_context_activation_receipt.ts | 76 + ...1193000_released_knowledge_turn_binding.ts | 375 + ...activity_objective_permission_authority.ts | 621 + .../20260811203000_learning_job_authority.ts | 193 + .../20260811221351_w2_authority_schema.ts | 11 + ...11223000_prepared_provider_turn_receipt.ts | 227 + ...4500_activity_permission_terminal_fence.ts | 109 + ...1225000_activity_permission_owner_lease.ts | 33 + ...0260812005647_learning_admission_outbox.ts | 87 + ...4934_activity_permission_route_feedback.ts | 71 + ...812034116_learning_governance_authority.ts | 83 + ...812035000_learning_governance_lifecycle.ts | 323 + ..._provider_attempt_pre_dispatch_terminal.ts | 39 + ...20260812050000_provider_owner_authority.ts | 130 + ...053000_provider_turn_identity_authority.ts | 373 + ...activity_permission_authority_hardening.ts | 82 + ...812061000_provider_cross_state_recovery.ts | 193 + ...2_task_structured_output_receipt_schema.ts | 11 + ...ask_structured_output_receipt_authority.ts | 195 + ...20260812120000_legacy_provider_recovery.ts | 897 + ...130000_legacy_activity_lifecycle_expand.ts | 479 + .../20260812140000_session_diff_manifest.ts | 11 + .../20260812151010_confused_polaris.ts | 41 + ...2154657_task_structured_output_evidence.ts | 36 + ...8_task_structured_output_evidence_parts.ts | 25 + ...2_task_structured_output_evidence_fence.ts | 13 + .../20260812162033_new_titanium_man.ts | 14 + .../20260812184453_charming_anthem.ts | 29 + ...812210000_task_execution_spec_authority.ts | 212 + ...00_permission_effect_dispatch_authority.ts | 205 + ...sk_structured_output_evidence_authority.ts | 337 + ...3000_task_structured_finalizer_response.ts | 118 + ...2224000_learning_artifact_phase_receipt.ts | 68 + ...20260813040301_bug407_final_authorities.ts | 260 + ...000_learning_reviewer_attempt_authority.ts | 78 + ...00_learning_lifecycle_trigger_authority.ts | 40 + ...0813041200_v2_provider_shadow_authority.ts | 194 + ...rning_governance_compensation_authority.ts | 96 + ...0_context_activation_semantic_authority.ts | 92 + .../20260813074240_bug_407_010_maintenance.ts | 11 + ...20260813100000_event_snapshot_authority.ts | 213 + ...0000_provider_recovery_authority_bridge.ts | 186 + ...00_legacy_provider_receipt_supersession.ts | 39 + ...60813120346_v2_provider_parity_campaign.ts | 29 + ...v2_provider_parity_response_fingerprint.ts | 11 + ...0_v2_provider_parity_campaign_authority.ts | 251 + ...813125000_event_sync_backfill_authority.ts | 81 + .../20260813130000_file_part_artifact.ts | 105 + .../20260813131000_event_snapshot_chunks.ts | 151 + .../20260813132000_session_diff_artifact.ts | 86 + ...260813133000_session_transfer_authority.ts | 147 + .../20260813134000_database_capability.ts | 39 + .../20260813135000_event_immutable.ts | 122 + ...20260813140000_event_sidecar_compaction.ts | 512 + ...813141000_bug_407_010_sidecar_lifecycle.ts | 10 + ...60813142000_bug_407_010_sidecar_indexes.ts | 10 + ...813143000_bug_407_010_aggregate_indexes.ts | 10 + ...3150000_single_authority_snapshot_merge.ts | 15 + .../src/deepagent/activity-authority.sql.ts | 250 + .../core/src/deepagent/activity-authority.ts | 2438 +++ .../core/src/deepagent/background-learning.ts | 185 +- .../core/src/deepagent/deepagent-event-bus.ts | 15 +- packages/core/src/deepagent/document-store.ts | 189 +- .../src/deepagent/durable-knowledge-store.ts | Bin 18387 -> 29411 bytes .../core/src/deepagent/durable-learning.ts | 1904 ++ packages/core/src/deepagent/index.ts | 6 + .../core/src/deepagent/knowledge-retriever.ts | 269 +- .../core/src/deepagent/knowledge-source.ts | 294 +- .../learning-admission-outbox.sql.ts | 47 + .../deepagent/learning-admission-outbox.ts | 234 + .../src/deepagent/learning-governance.sql.ts | 172 + .../core/src/deepagent/learning-governance.ts | 1374 ++ .../core/src/deepagent/learning-job.sql.ts | 105 + packages/core/src/deepagent/learning-job.ts | 1006 + .../learning-lifecycle-trigger.sql.ts | 61 + .../deepagent/learning-lifecycle-trigger.ts | 417 + .../learning-reviewer-attempt.sql.ts | 61 + .../deepagent/learning-reviewer-attempt.ts | 615 + packages/core/src/deepagent/orchestrator.ts | 9 +- packages/core/src/deepagent/promotion.ts | 89 +- packages/core/src/deepagent/prompt-policy.ts | 26 +- .../src/deepagent/released-snapshot.sql.ts | 188 + .../core/src/deepagent/released-snapshot.ts | 890 + .../core/src/deepagent/retention-sweeper.ts | 197 +- packages/core/src/deepagent/run-graph.ts | 4 +- packages/core/src/deepagent/session-state.ts | 8 +- packages/core/src/event.ts | 2037 +- packages/core/src/event/sql.ts | 194 +- packages/core/src/file-part-artifact.sql.ts | 88 + packages/core/src/file-part-artifact.ts | 997 + packages/core/src/filesystem.ts | 19 +- packages/core/src/location-layer.ts | 3 + packages/core/src/npm.ts | 34 +- packages/core/src/permission.ts | 19 +- packages/core/src/permission/saved.ts | 215 +- packages/core/src/permission/sql.ts | 11 +- packages/core/src/plugin/agent.ts | 28 + packages/core/src/session.ts | 133 +- packages/core/src/session/error.ts | 6 + packages/core/src/session/input.ts | 1 + packages/core/src/session/projector.ts | 470 +- packages/core/src/session/runner/index.ts | 2 + packages/core/src/session/runner/llm.ts | 104 +- .../session/runner/prepared-provider-turn.ts | 164 + .../session/runner/v2-provider-turn.sql.ts | 105 + .../src/session/runner/v2-provider-turn.ts | 953 + packages/core/src/session/sql.ts | 158 +- packages/core/src/session/transfer.sql.ts | 49 + packages/core/src/snapshot.ts | 22 + packages/core/src/tool/grep.ts | 2 +- packages/core/src/tool/read-failure.ts | 9 + packages/core/src/tool/read.ts | 15 +- packages/core/src/v1/session.ts | 71 + packages/core/test/agent-gateway.test.ts | 425 +- packages/core/test/agent.test.ts | 10 + .../test/context-federation/contract.test.ts | 24 + .../context-federation/federation.test.ts | 43 +- .../test/context-federation/resolver.test.ts | 33 +- .../session-context.test.ts | 280 +- .../core/test/database-capability.test.ts | 55 + packages/core/test/database-migration.test.ts | 3826 +++- .../test/deepagent/activity-authority.test.ts | 1896 ++ .../test/deepagent/approval-status.test.ts | 44 +- .../deepagent/background-learning.test.ts | 203 +- .../deepagent/document-governance.test.ts | 181 + .../test/deepagent/document-store-writer.ts | 18 + .../test/deepagent/document-store.test.ts | 43 +- .../domain-pack-detector-competition.test.ts | 12 +- .../domain-pack-retrieval-isolation.test.ts | 88 +- .../core/test/deepagent/domain-pack.test.ts | 10 +- .../deepagent/durable-knowledge-store.test.ts | 138 +- .../test/deepagent/durable-learning.test.ts | 1198 ++ .../deepagent/knowledge-contract-v3-2.test.ts | 126 +- .../deepagent/knowledge-retriever-v3.test.ts | 83 +- .../learning-governance-recovery.test.ts | 594 + .../deepagent/learning-governance.test.ts | 456 + .../core/test/deepagent/learning-job.test.ts | 748 + .../learning-lifecycle-trigger.test.ts | 389 + .../core/test/deepagent/promotion.test.ts | 94 +- .../deepagent/released-selection-fixture.ts | 28 + .../test/deepagent/released-snapshot.test.ts | 830 + .../deepagent/ship-gate-enforcement.test.ts | 40 +- .../workspace-isolation-read-path.test.ts | 88 +- packages/core/test/event-snapshot.test.ts | 538 + .../event-sync-backfill-migration.test.ts | 117 + packages/core/test/event.test.ts | 527 +- packages/core/test/file-part-artifact.test.ts | 791 + .../test/fixture/v2-provider-owner-process.ts | 137 + ...egacy-activity-lifecycle-migration.test.ts | 388 + ...der-receipt-supersession-migration.test.ts | 92 + ...y-provider-recovery-delete-cascade.test.ts | 604 + .../core/test/location-filesystem.test.ts | 28 +- packages/core/test/location-layer.test.ts | 10 +- packages/core/test/move-session.test.ts | 357 +- packages/core/test/npm.test.ts | 69 +- ...d-knowledge-turn-binding-migration.test.ts | 881 + packages/core/test/retention-sweeper.test.ts | 234 +- packages/core/test/session-create.test.ts | 276 +- packages/core/test/session-projector.test.ts | 198 +- .../core/test/session-runner-recorded.test.ts | 3 + .../test/session-runner-tool-events.test.ts | 5 + packages/core/test/session-runner.test.ts | 172 +- .../test/session-transfer-authority.test.ts | 73 + .../test/session-v2-provider-turn.test.ts | 285 + ...tured-finalizer-response-migration.test.ts | 160 + packages/core/test/tool-read-failure.test.ts | 47 + packages/core/test/tool-read.test.ts | 7 +- .../test/v2-provider-cutover-release.test.ts | 110 + .../script/bug-407-010-release-gate.ts | 473 + .../live-llm/activity-progress-oracle.ts | 43 +- .../script/live-llm/dispatcher.ts | 4 + .../script/live-llm/packaged-v2-owner.ts | 237 + .../deepagent-code/script/live-llm/routes.ts | 37 +- .../deepagent-code/script/live-llm/runtime.ts | 53 +- .../script/live-llm/subagent-control-plane.ts | 29 +- packages/deepagent-code/src/config/config.ts | 2 +- .../context-federation/activation-receipt.ts | 200 + .../context-query-facade.ts | 77 + .../src/context-federation/diagnostics.ts | 232 +- .../federated-query-service.ts | 23 +- .../provider-owner-runtime.ts | 34 + .../src/context-federation/readiness.ts | 119 +- .../session-context-runtime.ts | 552 +- .../src/control-plane/workspace.ts | 726 +- .../deepagent-code/src/deepagent/config.ts | 1 + .../src/deepagent/learning-runtime.ts | 82 + .../deepagent-code/src/effect/app-runtime.ts | 4 + packages/deepagent-code/src/effect/runner.ts | 45 +- .../src/effect/runtime-flags.ts | 29 +- packages/deepagent-code/src/git/index.ts | 10 +- .../deepagent-code/src/permission/index.ts | 890 +- .../src/project/instance-store.ts | 15 + packages/deepagent-code/src/project/vcs.ts | 181 +- .../deepagent-code/src/provider/provider.ts | 44 +- .../instance/httpapi/groups/control-plane.ts | 5 +- .../instance/httpapi/groups/deepagent.ts | 145 +- .../instance/httpapi/groups/instance.ts | 15 + .../routes/instance/httpapi/groups/session.ts | 134 +- .../routes/instance/httpapi/groups/sync.ts | 284 +- .../instance/httpapi/groups/workspace.ts | 8 +- .../httpapi/handlers/control-plane.ts | 14 +- .../instance/httpapi/handlers/deepagent.ts | 432 +- .../routes/instance/httpapi/handlers/im.ts | 10 +- .../instance/httpapi/handlers/instance.ts | 18 +- .../httpapi/handlers/session-errors.ts | 22 + .../instance/httpapi/handlers/session.ts | 110 +- .../routes/instance/httpapi/handlers/sync.ts | 740 +- .../instance/httpapi/handlers/workspace.ts | 18 +- .../middleware/sync-replay-body-limit.ts | 74 + .../server/routes/instance/httpapi/server.ts | 8 + .../src/server/shared/workspace-routing.ts | 2 + .../src/session/activity-crash-test.ts | 10 +- .../src/session/activity-sql.ts | 84 +- .../deepagent-code/src/session/compaction.ts | 19 +- .../src/session/diff-artifact-schema.ts | 43 + .../src/session/diff-artifact.sql.ts | 61 + .../src/session/diff-artifact.ts | 962 + .../deepagent-code/src/session/goal-driver.ts | 15 +- .../src/session/goal-loop-wiring.ts | 202 +- .../src/session/legacy-provider-resolution.ts | 1038 + packages/deepagent-code/src/session/llm.ts | 498 +- .../src/session/llm/native-runtime.ts | 4 + .../src/session/llm/provider-wire-seal.ts | 14 + .../deepagent-code/src/session/llm/request.ts | 56 +- .../deepagent-code/src/session/message-v2.ts | 648 +- .../deepagent-code/src/session/processor.ts | 247 +- .../src/session/prompt-epoch.sql.ts | 2 + .../src/session/prompt-epoch.ts | 3 + .../src/session/prompt-intent.ts | 2350 ++- packages/deepagent-code/src/session/prompt.ts | 2069 +- .../src/session/recovery-transfer-guard.ts | 75 + packages/deepagent-code/src/session/revert.ts | 146 +- .../deepagent-code/src/session/run-state.ts | 69 +- .../src/session/session-projector.ts | 18 + .../deepagent-code/src/session/session.ts | 394 +- packages/deepagent-code/src/session/steer.ts | 69 + .../deepagent-code/src/session/summary.ts | 118 +- .../src/session/task-executor.ts | 387 +- .../src/session/tool-capability.ts | 20 +- .../src/session/tool-request-receipt.sql.ts | 26 + packages/deepagent-code/src/session/tools.ts | 570 +- .../src/session/v4-event-runtime.ts | 42 +- packages/deepagent-code/src/snapshot/index.ts | 701 +- .../src/sync/replay-protocol.ts | 72 + .../deepagent-code/src/tool/pr_finalize.ts | 76 +- packages/deepagent-code/src/tool/registry.ts | 39 +- .../src/tool/task-finalizer-failure.ts | 30 + packages/deepagent-code/src/tool/task-run.ts | 348 +- .../tool/task-structured-output-evidence.ts | 610 + .../src/tool/task-structured-output.ts | 33 + packages/deepagent-code/src/tool/task.ts | 792 +- packages/deepagent-code/src/tool/tool.ts | 2 + .../deepagent-code/test/config/config.test.ts | 35 +- .../activation-receipt.test.ts | 298 + .../context-query-facade.test.ts | 2 + .../context-federation/diagnostics.test.ts | 430 +- .../federated-query-service.test.ts | 88 +- .../learning-release-run-ab.test.ts | 588 + .../provider-owner-runtime.test.ts | 77 + .../test/context-federation/readiness.test.ts | 153 + .../session-context-runtime.test.ts | 746 +- .../test/control-plane/executor.test.ts | 958 +- .../structured-response-recovery.test.ts | 191 + .../control-plane/wave3-durability.test.ts | 275 +- .../test/control-plane/workspace.test.ts | 905 +- .../deepagent-code/test/deepagent/_gateway.ts | 2 +- .../test/deepagent/knowledge-mode.test.ts | 31 + .../deepagent/learning-reviewer-port.test.ts | 128 + .../test/deepagent/learning-runtime.test.ts | 85 + .../test/deepagent/mcp-provenance.test.ts | 9 +- .../test/deepagent/plan-status-cache.test.ts | 9 +- .../test/deepagent/request-prep.test.ts | 72 +- .../deepagent-code/test/effect/runner.test.ts | 95 +- .../test/effect/runtime-flags.test.ts | 36 +- .../test/permission/next.test.ts | 31 +- .../test/project/instance.test.ts | 21 + .../deepagent-code/test/project/vcs.test.ts | 108 +- .../test/provider/provider.test.ts | 19 +- .../test/provider/transform.test.ts | 9 +- .../live-llm-activity-progress-oracle.test.ts | 39 +- .../test/script/live-llm-routes.test.ts | 40 +- .../test/script/run-live-llm-all.test.ts | 18 +- .../test/server/global-session-list.test.ts | 10 +- .../test/server/httpapi-control-plane.test.ts | 33 +- .../server/httpapi-deepagent-release.test.ts | 695 + .../httpapi-exercise/scenarios/deepagent.ts | 32 +- .../test/server/httpapi-instance.test.ts | 23 + .../server/httpapi-provider-recovery.test.ts | 411 + .../test/server/httpapi-sdk.test.ts | 107 +- .../test/server/httpapi-session.test.ts | 4 +- .../test/server/httpapi-sync.test.ts | 1279 +- .../test/server/httpapi-workspace.test.ts | 189 +- .../server/session-diff-missing-patch.test.ts | 108 +- .../test/server/session-messages.test.ts | 49 +- .../test/server/workspace-routing.test.ts | 8 + .../test/session/compaction.test.ts | 6 +- .../test/session/diff-artifact.test.ts | 634 + .../test/session/goal-driver.test.ts | 34 +- .../test/session/goal-loop-wiring.test.ts | 94 +- .../learning-lifecycle-callers.test.ts | 81 + .../legacy-provider-resolution.test.ts | 966 + .../test/session/llm-f3-tool-safety.test.ts | 173 +- .../deepagent-code/test/session/llm.test.ts | 189 +- .../test/session/message-v2.test.ts | 42 + .../permission-effect-authority.test.ts | 375 + .../session/prepared-provider-turn.test.ts | 99 + .../test/session/processor-effect.test.ts | 1919 +- .../test/session/prompt-intent.test.ts | 1118 +- .../test/session/prompt.test.ts | 1297 +- .../session/provider-receipt-recovery.test.ts | 911 + .../test/session/revert-compact.test.ts | 11 +- .../test/session/session.test.ts | 125 + .../test/session/snapshot-tool-race.test.ts | 48 +- .../deepagent-code/test/session/steer.test.ts | 82 +- .../test/session/tool-capability.test.ts | 82 + .../test/snapshot/snapshot.test.ts | 132 + .../storage/workspace-time-migration.test.ts | 5 +- .../test/tool/pr-finalize.test.ts | 40 +- .../deepagent-code/test/tool/registry.test.ts | 177 +- .../test/tool/task-finalizer.test.ts | 309 +- .../deepagent-code/test/tool/task-run.test.ts | 170 +- .../deepagent-code/test/tool/task.test.ts | 339 +- .../test/wiki/wiki-service.test.ts | 28 +- packages/desktop/package.json | 4 +- .../live-llm/activity-progress-package.ts | 25 +- .../live-llm/activity-progress-restart.ts | 428 +- .../desktop/scripts/live-llm/long-session.ts | 213 +- packages/desktop/scripts/live-llm/runtime.ts | 26 +- packages/llm/src/route/executor.ts | 56 + packages/llm/test/executor.test.ts | 23 + packages/sdk/js/src/gen/sdk.gen.ts | 522 +- packages/sdk/js/src/gen/types.gen.ts | 2362 ++- packages/sdk/js/src/v2/gen/sdk.gen.ts | 522 +- packages/sdk/js/src/v2/gen/types.gen.ts | 2362 ++- packages/sdk/openapi.json | 25 + 380 files changed, 102201 insertions(+), 6335 deletions(-) create mode 100644 packages/app/src/pages/session/composer/session-provider-recovery-dock.test.ts create mode 100644 packages/app/src/pages/session/composer/session-provider-recovery-dock.tsx create mode 100644 packages/core/migration/20260814062654_single_authority_schema_checkpoint/migration.sql create mode 100644 packages/core/migration/20260814062654_single_authority_schema_checkpoint/schema-checkpoint create mode 100644 packages/core/migration/20260814062654_single_authority_schema_checkpoint/snapshot.json create mode 100644 packages/core/src/context-federation/provider-owner.ts create mode 100644 packages/core/src/database/migration/20260811185417_released_knowledge_snapshot_authority.ts create mode 100644 packages/core/src/database/migration/20260811190000_context_activation_receipt.ts create mode 100644 packages/core/src/database/migration/20260811193000_released_knowledge_turn_binding.ts create mode 100644 packages/core/src/database/migration/20260811200000_activity_objective_permission_authority.ts create mode 100644 packages/core/src/database/migration/20260811203000_learning_job_authority.ts create mode 100644 packages/core/src/database/migration/20260811221351_w2_authority_schema.ts create mode 100644 packages/core/src/database/migration/20260811223000_prepared_provider_turn_receipt.ts create mode 100644 packages/core/src/database/migration/20260811224500_activity_permission_terminal_fence.ts create mode 100644 packages/core/src/database/migration/20260811225000_activity_permission_owner_lease.ts create mode 100644 packages/core/src/database/migration/20260812005647_learning_admission_outbox.ts create mode 100644 packages/core/src/database/migration/20260812014934_activity_permission_route_feedback.ts create mode 100644 packages/core/src/database/migration/20260812034116_learning_governance_authority.ts create mode 100644 packages/core/src/database/migration/20260812035000_learning_governance_lifecycle.ts create mode 100644 packages/core/src/database/migration/20260812043000_provider_attempt_pre_dispatch_terminal.ts create mode 100644 packages/core/src/database/migration/20260812050000_provider_owner_authority.ts create mode 100644 packages/core/src/database/migration/20260812053000_provider_turn_identity_authority.ts create mode 100644 packages/core/src/database/migration/20260812060000_activity_permission_authority_hardening.ts create mode 100644 packages/core/src/database/migration/20260812061000_provider_cross_state_recovery.ts create mode 100644 packages/core/src/database/migration/20260812114412_task_structured_output_receipt_schema.ts create mode 100644 packages/core/src/database/migration/20260812114500_task_structured_output_receipt_authority.ts create mode 100644 packages/core/src/database/migration/20260812120000_legacy_provider_recovery.ts create mode 100644 packages/core/src/database/migration/20260812130000_legacy_activity_lifecycle_expand.ts create mode 100644 packages/core/src/database/migration/20260812140000_session_diff_manifest.ts create mode 100644 packages/core/src/database/migration/20260812151010_confused_polaris.ts create mode 100644 packages/core/src/database/migration/20260812154657_task_structured_output_evidence.ts create mode 100644 packages/core/src/database/migration/20260812155138_task_structured_output_evidence_parts.ts create mode 100644 packages/core/src/database/migration/20260812155242_task_structured_output_evidence_fence.ts create mode 100644 packages/core/src/database/migration/20260812162033_new_titanium_man.ts create mode 100644 packages/core/src/database/migration/20260812184453_charming_anthem.ts create mode 100644 packages/core/src/database/migration/20260812210000_task_execution_spec_authority.ts create mode 100644 packages/core/src/database/migration/20260812213000_permission_effect_dispatch_authority.ts create mode 100644 packages/core/src/database/migration/20260812220000_task_structured_output_evidence_authority.ts create mode 100644 packages/core/src/database/migration/20260812223000_task_structured_finalizer_response.ts create mode 100644 packages/core/src/database/migration/20260812224000_learning_artifact_phase_receipt.ts create mode 100644 packages/core/src/database/migration/20260813040301_bug407_final_authorities.ts create mode 100644 packages/core/src/database/migration/20260813041000_learning_reviewer_attempt_authority.ts create mode 100644 packages/core/src/database/migration/20260813041100_learning_lifecycle_trigger_authority.ts create mode 100644 packages/core/src/database/migration/20260813041200_v2_provider_shadow_authority.ts create mode 100644 packages/core/src/database/migration/20260813041300_learning_governance_compensation_authority.ts create mode 100644 packages/core/src/database/migration/20260813041400_context_activation_semantic_authority.ts create mode 100644 packages/core/src/database/migration/20260813074240_bug_407_010_maintenance.ts create mode 100644 packages/core/src/database/migration/20260813100000_event_snapshot_authority.ts create mode 100644 packages/core/src/database/migration/20260813110000_provider_recovery_authority_bridge.ts create mode 100644 packages/core/src/database/migration/20260813120000_legacy_provider_receipt_supersession.ts create mode 100644 packages/core/src/database/migration/20260813120346_v2_provider_parity_campaign.ts create mode 100644 packages/core/src/database/migration/20260813121129_v2_provider_parity_response_fingerprint.ts create mode 100644 packages/core/src/database/migration/20260813121200_v2_provider_parity_campaign_authority.ts create mode 100644 packages/core/src/database/migration/20260813125000_event_sync_backfill_authority.ts create mode 100644 packages/core/src/database/migration/20260813130000_file_part_artifact.ts create mode 100644 packages/core/src/database/migration/20260813131000_event_snapshot_chunks.ts create mode 100644 packages/core/src/database/migration/20260813132000_session_diff_artifact.ts create mode 100644 packages/core/src/database/migration/20260813133000_session_transfer_authority.ts create mode 100644 packages/core/src/database/migration/20260813134000_database_capability.ts create mode 100644 packages/core/src/database/migration/20260813135000_event_immutable.ts create mode 100644 packages/core/src/database/migration/20260813140000_event_sidecar_compaction.ts create mode 100644 packages/core/src/database/migration/20260813141000_bug_407_010_sidecar_lifecycle.ts create mode 100644 packages/core/src/database/migration/20260813142000_bug_407_010_sidecar_indexes.ts create mode 100644 packages/core/src/database/migration/20260813143000_bug_407_010_aggregate_indexes.ts create mode 100644 packages/core/src/database/migration/20260813150000_single_authority_snapshot_merge.ts create mode 100644 packages/core/src/deepagent/activity-authority.sql.ts create mode 100644 packages/core/src/deepagent/activity-authority.ts create mode 100644 packages/core/src/deepagent/durable-learning.ts create mode 100644 packages/core/src/deepagent/learning-admission-outbox.sql.ts create mode 100644 packages/core/src/deepagent/learning-admission-outbox.ts create mode 100644 packages/core/src/deepagent/learning-governance.sql.ts create mode 100644 packages/core/src/deepagent/learning-governance.ts create mode 100644 packages/core/src/deepagent/learning-job.sql.ts create mode 100644 packages/core/src/deepagent/learning-job.ts create mode 100644 packages/core/src/deepagent/learning-lifecycle-trigger.sql.ts create mode 100644 packages/core/src/deepagent/learning-lifecycle-trigger.ts create mode 100644 packages/core/src/deepagent/learning-reviewer-attempt.sql.ts create mode 100644 packages/core/src/deepagent/learning-reviewer-attempt.ts create mode 100644 packages/core/src/deepagent/released-snapshot.sql.ts create mode 100644 packages/core/src/deepagent/released-snapshot.ts create mode 100644 packages/core/src/file-part-artifact.sql.ts create mode 100644 packages/core/src/file-part-artifact.ts create mode 100644 packages/core/src/session/runner/prepared-provider-turn.ts create mode 100644 packages/core/src/session/runner/v2-provider-turn.sql.ts create mode 100644 packages/core/src/session/runner/v2-provider-turn.ts create mode 100644 packages/core/src/session/transfer.sql.ts create mode 100644 packages/core/src/tool/read-failure.ts create mode 100644 packages/core/test/database-capability.test.ts create mode 100644 packages/core/test/deepagent/activity-authority.test.ts create mode 100644 packages/core/test/deepagent/document-governance.test.ts create mode 100644 packages/core/test/deepagent/document-store-writer.ts create mode 100644 packages/core/test/deepagent/durable-learning.test.ts create mode 100644 packages/core/test/deepagent/learning-governance-recovery.test.ts create mode 100644 packages/core/test/deepagent/learning-governance.test.ts create mode 100644 packages/core/test/deepagent/learning-job.test.ts create mode 100644 packages/core/test/deepagent/learning-lifecycle-trigger.test.ts create mode 100644 packages/core/test/deepagent/released-selection-fixture.ts create mode 100644 packages/core/test/deepagent/released-snapshot.test.ts create mode 100644 packages/core/test/event-snapshot.test.ts create mode 100644 packages/core/test/event-sync-backfill-migration.test.ts create mode 100644 packages/core/test/file-part-artifact.test.ts create mode 100644 packages/core/test/fixture/v2-provider-owner-process.ts create mode 100644 packages/core/test/legacy-activity-lifecycle-migration.test.ts create mode 100644 packages/core/test/legacy-provider-receipt-supersession-migration.test.ts create mode 100644 packages/core/test/legacy-provider-recovery-delete-cascade.test.ts create mode 100644 packages/core/test/released-knowledge-turn-binding-migration.test.ts create mode 100644 packages/core/test/session-transfer-authority.test.ts create mode 100644 packages/core/test/session-v2-provider-turn.test.ts create mode 100644 packages/core/test/task-structured-finalizer-response-migration.test.ts create mode 100644 packages/core/test/tool-read-failure.test.ts create mode 100644 packages/core/test/v2-provider-cutover-release.test.ts create mode 100644 packages/deepagent-code/script/bug-407-010-release-gate.ts create mode 100644 packages/deepagent-code/script/live-llm/packaged-v2-owner.ts create mode 100644 packages/deepagent-code/src/context-federation/activation-receipt.ts create mode 100644 packages/deepagent-code/src/context-federation/provider-owner-runtime.ts create mode 100644 packages/deepagent-code/src/deepagent/learning-runtime.ts create mode 100644 packages/deepagent-code/src/server/routes/instance/httpapi/middleware/sync-replay-body-limit.ts create mode 100644 packages/deepagent-code/src/session/diff-artifact-schema.ts create mode 100644 packages/deepagent-code/src/session/diff-artifact.sql.ts create mode 100644 packages/deepagent-code/src/session/diff-artifact.ts create mode 100644 packages/deepagent-code/src/session/legacy-provider-resolution.ts create mode 100644 packages/deepagent-code/src/session/llm/provider-wire-seal.ts create mode 100644 packages/deepagent-code/src/session/recovery-transfer-guard.ts create mode 100644 packages/deepagent-code/src/session/session-projector.ts create mode 100644 packages/deepagent-code/src/sync/replay-protocol.ts create mode 100644 packages/deepagent-code/src/tool/task-finalizer-failure.ts create mode 100644 packages/deepagent-code/src/tool/task-structured-output-evidence.ts create mode 100644 packages/deepagent-code/src/tool/task-structured-output.ts create mode 100644 packages/deepagent-code/test/context-federation/activation-receipt.test.ts create mode 100644 packages/deepagent-code/test/context-federation/learning-release-run-ab.test.ts create mode 100644 packages/deepagent-code/test/context-federation/provider-owner-runtime.test.ts create mode 100644 packages/deepagent-code/test/context-federation/readiness.test.ts create mode 100644 packages/deepagent-code/test/control-plane/structured-response-recovery.test.ts create mode 100644 packages/deepagent-code/test/deepagent/learning-reviewer-port.test.ts create mode 100644 packages/deepagent-code/test/deepagent/learning-runtime.test.ts create mode 100644 packages/deepagent-code/test/server/httpapi-deepagent-release.test.ts create mode 100644 packages/deepagent-code/test/server/httpapi-provider-recovery.test.ts create mode 100644 packages/deepagent-code/test/session/diff-artifact.test.ts create mode 100644 packages/deepagent-code/test/session/learning-lifecycle-callers.test.ts create mode 100644 packages/deepagent-code/test/session/legacy-provider-resolution.test.ts create mode 100644 packages/deepagent-code/test/session/permission-effect-authority.test.ts create mode 100644 packages/deepagent-code/test/session/prepared-provider-turn.test.ts create mode 100644 packages/deepagent-code/test/session/provider-receipt-recovery.test.ts create mode 100644 packages/deepagent-code/test/session/tool-capability.test.ts diff --git a/bun.lock b/bun.lock index 1acefd89..318186c5 100644 --- a/bun.lock +++ b/bun.lock @@ -29,7 +29,7 @@ }, "packages/app": { "name": "@deepagent-code/app", - "version": "1.4.5", + "version": "1.4.6", "dependencies": { "@codemirror/autocomplete": "6", "@codemirror/commands": "6", @@ -129,7 +129,7 @@ }, "packages/core": { "name": "@deepagent-code/core", - "version": "4.0.6", + "version": "4.0.7-r2", "bin": { "deepagent-code": "./bin/deepagent-code", }, @@ -347,7 +347,7 @@ }, "packages/desktop": { "name": "@deepagent-code/desktop", - "version": "1.4.5", + "version": "1.4.6", "dependencies": { "@lydell/node-pty": "catalog:", "@zip.js/zip.js": "2.7.62", diff --git a/packages/app/package.json b/packages/app/package.json index 639a9949..b143030a 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@deepagent-code/app", - "version": "1.4.5", + "version": "1.4.6", "description": "", "type": "module", "exports": { diff --git a/packages/app/src/components/review/dialog-review-contract.test.ts b/packages/app/src/components/review/dialog-review-contract.test.ts index 0a3b509b..049fb47f 100644 --- a/packages/app/src/components/review/dialog-review-contract.test.ts +++ b/packages/app/src/components/review/dialog-review-contract.test.ts @@ -4,8 +4,8 @@ import { listPending, reviewSummary, setStatus, listEnvFacts, decideEnvFact, mod // P1-C route contract: the V3.1 self-learning Review dialog talks to the raw-request escape-hatch // routes (NOT the generated SDK). These assertions lock the exact method/url/body so a backend // rename of /deepagent/knowledge/{pending,approve,reject-ids} or a payload shape change breaks CI -// here instead of silently shipping a dead Review UI. Mirrors the backend group schema -// (DeepAgentKnowledgeStatusInput = { ids: string[] }). +// here instead of silently shipping a dead Review UI. Review decisions must round-trip the exact +// immutable authority returned by the list endpoint; a bare id can alias project/global revisions. type Recorded = { method: string; url: string; body?: unknown; headers?: Record } function client(calls: Recorded[], data: unknown) { @@ -24,7 +24,13 @@ describe("DeepAgent review dialog route contract", () => { const calls: Recorded[] = [] const items = [ { + sourceStore: "project" as const, id: "memory:1", + version: 3, + hash: "hash-3", + candidateId: "candidate-3", + fingerprint: "fingerprint-3", + governanceRevision: "governance-3", type: "memory" as const, summary: "s", evidence_strength: "strong" as const, @@ -49,29 +55,73 @@ describe("DeepAgent review dialog route contract", () => { expect(calls).toEqual([{ method: "GET", url: "/deepagent/knowledge/review-summary" }]) }) - test("approve POSTs /deepagent/knowledge/approve with { ids }", async () => { + test("approve POSTs the exact listed authority to /deepagent/knowledge/approve", async () => { const calls: Recorded[] = [] - await setStatus(client(calls, { updated: ["a"] }), "approve", ["a", "b"]) + const item = { + sourceStore: "project" as const, + id: "a", + version: 2, + hash: "hash-a-2", + candidateId: "candidate-a", + fingerprint: "fingerprint-a", + governanceRevision: "governance-a-2", + type: "knowledge" as const, + summary: "A", + evidence_strength: "strong" as const, + evidence_refs: [], + approval_status: "pending" as const, + } + await setStatus(client(calls, { updated: item }), "approve", item) expect(calls).toEqual([ { method: "POST", url: "/deepagent/knowledge/approve", - body: { ids: ["a", "b"] }, + body: { + sourceStore: "project", + id: "a", + version: 2, + hash: "hash-a-2", + candidateId: "candidate-a", + fingerprint: "fingerprint-a", + expectedGovernanceRevision: "governance-a-2", + }, headers: { "Content-Type": "application/json" }, }, ]) }) - test("reject POSTs /deepagent/knowledge/reject-ids with { ids }", async () => { + test("reject POSTs the exact global authority to /deepagent/knowledge/reject-ids", async () => { const calls: Recorded[] = [] - await setStatus(client(calls, { updated: ["a"] }), "reject-ids", ["a"]) + const item = { + sourceStore: "user_global" as const, + id: "a", + version: 4, + hash: "hash-a-4", + candidateId: "candidate-a", + fingerprint: "fingerprint-a", + governanceRevision: "governance-a-4", + type: "memory" as const, + summary: "A", + evidence_strength: "medium" as const, + evidence_refs: [], + approval_status: "pending" as const, + } + await setStatus(client(calls, { updated: item }), "reject-ids", item) expect(calls).toEqual([ { method: "POST", url: "/deepagent/knowledge/reject-ids", - body: { ids: ["a"] }, + body: { + sourceStore: "user_global", + id: "a", + version: 4, + hash: "hash-a-4", + candidateId: "candidate-a", + fingerprint: "fingerprint-a", + expectedGovernanceRevision: "governance-a-4", + }, headers: { "Content-Type": "application/json" }, }, ]) diff --git a/packages/app/src/components/review/dialog-review.api.ts b/packages/app/src/components/review/dialog-review.api.ts index 169ef00f..1a99c2e2 100644 --- a/packages/app/src/components/review/dialog-review.api.ts +++ b/packages/app/src/components/review/dialog-review.api.ts @@ -4,7 +4,13 @@ // for back-compat. Keep this file free of any solid-js/UI imports. export type KnowledgeItem = { + sourceStore: "user_global" | "project" id: string + version: number + hash: string + candidateId: string + fingerprint: string + governanceRevision: string type: "knowledge" | "strategy" | "methodology" | "memory" | "skill" | "failure_dossier" summary: string evidence_strength: "strong" | "medium" | "weak" | "none" @@ -47,16 +53,35 @@ export const reviewSummary = async (client: ReviewClient): Promise<{ pendingCoun export const setStatus = async ( client: ReviewClient, action: "approve" | "reject-ids", - ids: string[], + item: KnowledgeItem, ): Promise => { - await client.client.request<{ updated: string[] }>({ + await client.client.request<{ updated: KnowledgeItem }>({ method: "POST", url: `/deepagent/knowledge/${action}`, - body: { ids }, + body: { + sourceStore: item.sourceStore, + id: item.id, + version: item.version, + hash: item.hash, + candidateId: item.candidateId, + fingerprint: item.fingerprint, + expectedGovernanceRevision: item.governanceRevision, + }, headers: { "Content-Type": "application/json" }, }) } +export const reviewAuthorityKey = (item: KnowledgeItem) => + JSON.stringify([ + item.sourceStore, + item.id, + item.version, + item.hash, + item.candidateId, + item.fingerprint, + item.governanceRevision, + ]) + // V3.8.1 §G environment-fact use-gate. Provisional user-global environment facts surface here so the // user decides, per project, whether to adopt them (§G.5). Credentials never appear — only secret_ref // pointers. `degraded` marks a fact whose last connection attempt failed (§G.6). diff --git a/packages/app/src/components/review/dialog-review.tsx b/packages/app/src/components/review/dialog-review.tsx index c3c8a165..b34f3a41 100644 --- a/packages/app/src/components/review/dialog-review.tsx +++ b/packages/app/src/components/review/dialog-review.tsx @@ -11,6 +11,7 @@ import { listEnvFacts, decideEnvFact, modifyEnvFact, + reviewAuthorityKey, type KnowledgeItem, type ReviewClient, type EnvFactItem, @@ -25,6 +26,7 @@ export { listEnvFacts, decideEnvFact, modifyEnvFact, + reviewAuthorityKey, type KnowledgeItem, type ReviewClient, type EnvFactBody, @@ -187,33 +189,36 @@ export const DialogReview: Component<{ client: ReviewClient }> = (props) => { setCollapsed(next) } - const toggle = (id: string) => { + const toggle = (item: KnowledgeItem) => { + const id = reviewAuthorityKey(item) const next = new Set(selected()) if (next.has(id)) next.delete(id) else next.add(id) setSelected(next) } - const selectAll = () => setSelected(new Set(pending().map((i) => i.id))) + const selectAll = () => setSelected(new Set(pending().map(reviewAuthorityKey))) const invert = () => { const cur = selected() setSelected( new Set( pending() - .map((i) => i.id) + .map(reviewAuthorityKey) .filter((id) => !cur.has(id)), ), ) } const apply = async (action: "approve" | "reject-ids") => { - const ids = [...selected()] - if (ids.length === 0 || busy()) return + const decisions = (items() ?? []).filter((item) => selected().has(reviewAuthorityKey(item))) + if (decisions.length === 0 || busy()) return setBusy(true) try { - await setStatus(props.client, action, ids) + await Promise.all(decisions.map((item) => setStatus(props.client, action, item))) setSelected(new Set()) await refetch() } catch (error) { + setSelected(new Set()) + await refetch() showToast({ variant: "error", title: language.t("review.title"), @@ -225,14 +230,14 @@ export const DialogReview: Component<{ client: ReviewClient }> = (props) => { } const Row = (item: KnowledgeItem) => { - const checked = createMemo(() => selected().has(item.id)) + const checked = createMemo(() => selected().has(reviewAuthorityKey(item))) return (