Commit Graph
1437 Commits
Author SHA1 Message Date
Charles YaoandClaude Opus 4.8 893ffedbf0 feat(dify-builder): add DIFY_BUILDER_SKILL_LEARNING_POLICY config + FeatureService surface (C-2)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 12:38:04 -07:00
Charles YaoandClaude Opus 4.8 e4b0195528 feat(dify-builder): add build.await_learning state + skill_learning_policy context field (C-2)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 12:24:19 -07:00
Charles YaoandClaude Opus 4.8 7e83264330 refactor: rename Workflow Copilot → Dify Builder
Project rename across api/ + web/: modules, symbols, routes
(/console/api/dify-builder/*), feature flag (DIFY_BUILDER_ENABLED),
Celery queue/tasks, the 7 DB tables (via migration df1b0114de40),
and regenerated contract artifacts. Behavior unchanged; 430 tests green,
ruff clean. Branch renamed feat/copilot-py-backend → dify-builder.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 11:18:35 -07:00
Charles YaoandClaude Opus 4.8 478e8bf1fe fix(copilot): drive recovery_restart through working FIX/FIX_CHECKLIST entry states
The runner's check_recovery/recovery_continue/recovery_restart short-circuit
committed the transition and returned immediately, without entering the
advance loop. recovery_restart in FIX/FIX_CHECKLIST mode (the forced path for
structural_invalidating drift) lands on the *working* fix.diagnose /
checklist.diagnose entry state, which the runner must drive by running its
handler -- the early return stranded the session there with no UI actions.
Fix: rest only when the landed state is waiting/terminal (covers stop/resume,
check_recovery, recovery_continue, and BUILD/EDIT restarts unchanged);
otherwise consume the action and fall through to the existing advance loop.

Also: parity-test recovery.entry_state_for against the states
service.create_*_session actually assigns; add classify()-through-runner
coverage for the three remaining recovery classes and target_node_ids guard
branches; pin recovery_ref_for's message for config_only/structural_compatible;
and qualify dify_port.py's graph_ops delegations (module import) so
structural_fingerprint/node_ids no longer read as unqualified self-recursion.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 10:42:53 -07:00
Charles YaoandClaude Opus 4.8 b810869941 feat(copilot): surface SessionView.recovery via RecoveryRef + regen artifacts (C-1)
Adds RecoveryRef to the contract, recovery_ref_for() to recovery.py, and
wires it into get_session_view() beside the existing CheckpointRef pattern.
Regenerates contract_schema.json and the FE types.ts from contract.py
(additive only: RecoveryRef + SessionView.recovery). Also updates
test_wiring.py's exact asdict() round-trip assertion to include the new
recovery: None default, since dataclasses.asdict(SessionView) is exhaustive.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 10:14:45 -07:00
Charles YaoandClaude Opus 4.8 a789dd4858 feat(copilot): DifyPort.structural_fingerprint + graph_node_ids, apply_repair stamps fingerprint (C-1)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 09:37:43 -07:00
Charles YaoandClaude Opus 4.8 39665a8bc2 feat(copilot): add recovery fields to ApplyResult + CopilotContext + serde (C-1)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 09:28:54 -07:00
Charles YaoandClaude Opus 4.8 529db1f879 feat(copilot): add graph_ops.structural_fingerprint + node_ids (C-1)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 09:22:15 -07:00
Charles YaoandClaude Opus 4.8 47937f739f copilot: pause/resume (runner stop/resume short-circuit + RunStatus.PAUSED)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 05:42:18 -07:00
Charles YaoandClaude Opus 4.8 7b41d09549 copilot: surface SessionView.checkpoint from fc.checkpoint_id
Populate the frozen SessionView.checkpoint field from the session context's
active checkpoint_id. When set, build a CheckpointRef with the checkpoint_id
and a generic "Restore point" label; otherwise None.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 05:33:17 -07:00
Charles YaoandClaude Opus 4.8 8481cd6017 copilot: Repository.invalidate_conversation_items (approval-card invalidation)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 04:57:54 -07:00
Charles YaoandClaude Opus 4.8 2f1e342ed0 copilot: DifyPort.restore_graph (whole-graph draft restore)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 04:50:09 -07:00
Charles YaoandClaude Opus 4.8 e464c2879f copilot: CopilotContext lifecycle fields (paused, checkpoint_seq) + serde
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 04:41:27 -07:00
Charles YaoandClaude Opus 4.8 ef255c4dde copilot: Edit service wiring + create_edit_session + merged registry
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 02:27:55 -07:00
Charles YaoandClaude Opus 4.8 f668959ece copilot: CopilotContext Edit fields + serde defaults
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 01:29:17 -07:00
Charles YaoandClaude Opus 4.8 25b897353d copilot: Build session bootstrap + capability_check handler + merged registry
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 21:49:48 -07:00
Charles YaoandClaude Opus 4.8 4be0e77ade copilot: rename FixContext -> CopilotContext + additive Build fields
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 21:24:48 -07:00
Charles Yao b3b4776e95 feat(workflow-copilot): opt-in per-intent canvas-event emission through apply_repair 2026-08-22 10:57:37 -07:00
Charles YaoandClaude Opus 4.8 c8c1a7052d feat(workflow-copilot): apply_repair dispatches all 5 verbs + real graph diff feeds change_set
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 10:46:12 -07:00
Charles YaoandClaude Opus 4.8 18e45a1964 feat(workflow-copilot): diff_graphs real before/after graph diff
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 10:34:43 -07:00
Charles Yao df584c7221 feat(workflow-copilot): canned node-default-config registry for Build's 4 node types 2026-08-22 10:28:44 -07:00
Charles YaoandClaude Opus 4.8 59b781ac50 feat(workflow-copilot): apply_insert_between graph mutation
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 10:22:44 -07:00
Charles YaoandClaude Opus 4.8 5c950b1a9a feat(workflow-copilot): apply_connect graph mutation
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 10:15:45 -07:00
Charles Yao 5006a34226 feat(workflow-copilot): apply_delete_node graph mutation 2026-08-22 10:08:58 -07:00
Charles YaoandClaude Opus 4.8 0097f7d2b1 fix(workflow-copilot): ruff-clean create_node tests + explicit-position sentinel + deepcopy config
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 10:04:19 -07:00
Charles YaoandClaude Opus 4.8 7a8e27c06d feat(workflow-copilot): apply_create_node graph mutation
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 09:54:58 -07:00
Charles YaoandClaude Opus 4.8 1e3578d341 feat(workflow-copilot): document + enforce MutationIntent's per-op arg contract
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 09:48:05 -07:00
Charles Yao f9b38f9be0 fix(workflow-copilot): reachable reject at approval gate, client-only-action guard, contract doc fixes 2026-08-22 01:55:17 -07:00
Charles Yao d089a84da7 refactor(workflow-copilot): re-express Fix conversation items onto the card vocabulary 2026-08-22 00:48:03 -07:00
Charles Yao fd01a6cfe8 feat(workflow-copilot): data-driven SessionView.actions + action_id endpoint acceptance 2026-08-22 00:32:11 -07:00
Charles Yao 5a098f89d4 fix(workflow-copilot): _run_status reports COMPLETE for Build/Edit terminal states 2026-08-21 23:49:45 -07:00
Charles Yao eb1ee3981a feat(workflow-copilot): Action/CheckpointRef + SessionView entry_mode/phase/actions/checkpoint 2026-08-21 23:36:53 -07:00
Charles YaoandClaude Opus 4.8 72c171b63c feat(copilot): record the failed Dify run as a CopilotRun on session create
create_fix_session now treats failed_run_id as the Dify workflow-run id and
records it as an immutable original-failed CopilotRun, pointing
fc.failed_run_id at that row so the async diagnose can resolve it. Closes the
FE->diagnose gap for a live Fix flow.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 21:46:53 -07:00
Charles YaoandClaude Opus 4.8 086186a579 fix(copilot): close SSE subscription even if snapshot frame is interrupted
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 21:46:53 -07:00
Charles Yao 925491fac4 feat(copilot): SSE stream route (snapshot-first + heartbeat) 2026-08-18 21:45:07 -07:00
Charles Yao 6431d146dc feat(copilot): service wiring + view-serialize + error-map helpers 2026-08-18 21:45:07 -07:00
Charles Yao 9d982be3d0 feat(copilot): pluggable CopilotAgent factory (P3c seam) 2026-08-18 21:45:07 -07:00
Charles Yao 0cfea5cea4 feat(copilot): workflow_copilot_enabled feature flag 2026-08-18 21:45:07 -07:00
Charles Yao 48419e3f69 feat(copilot): copilot session usecase + dispatch 2026-08-18 21:45:06 -07:00
Charles YaoandClaude Opus 4.8 a7db7d36f1 feat(copilot): session progress bus over the broadcast channel
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 21:45:06 -07:00
Charles Yao 043df4e6dc fix(copilot): prefix-serialize lock-release eval key + prefix regression test 2026-08-18 21:45:06 -07:00
Charles Yao 639235de98 feat(copilot): cross-process session advance lock 2026-08-18 21:45:06 -07:00
Charles YaoandClaude Opus 4.8 f889a97032 feat(copilot): SQL repository — checkpoints, runs, test-inputs, conversation
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 21:45:06 -07:00
Charles Yao 2ca01cc802 feat(copilot): SQL repository — sessions + version-CAS
Add SqlCopilotRepository implementing the Repository Protocol's session
lifecycle (create_session/get_session) and compare_and_advance as a real
DB-level version-CAS: a single UPDATE ... WHERE version=base_version, with
rowcount==0 disambiguated into NotFoundError (missing session) vs
ConflictError (stale version). A UNIQUE(session_id, seq) collision on
conversation items during compare_and_advance is caught and mapped to
ConflictError, making the DB the seq authority. Remaining Repository
methods (checkpoints/runs/test-inputs/list_conversation) are stubbed with
NotImplementedError, deferred to Task 5.

Tested against SQLite in-memory: create/get round-trip, CAS version bump,
stale-version conflict leaving the row unchanged, missing-session
NotFoundError, and duplicate-seq ConflictError.
2026-08-18 21:45:06 -07:00
Charles Yao 0c4eefba1b feat(copilot): FixContext JSON (de)serialization 2026-08-18 21:45:06 -07:00
Charles YaoandClaude Opus 4.8 3ec6c8990d fix(copilot): adapter review fixes — node_outputs test, tighter apply assert, publish audit fields, no-op apply short-circuit
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 21:45:05 -07:00
Charles Yao ef2ed808fd feat(copilot): WorkflowService-backed DifyPort adapter
Implements WorkflowServiceDifyPort, the real DifyPort adapter that wires
the pure P1 domain and Task 1-3 helpers to WorkflowService,
AppGenerateService, and the node-execution repository. Each method opens
its own session, resolves account/app via the identity helpers, and
mutates the draft graph client-side (no server-side patch primitive)
before writing it back with graph_only=True/sync_agent_bindings=False.
Pins the publish workflow_id+commit gotcha and the hash-mismatch
re-mapping. Confirmed via mocked-service unit tests and a runtime_checkable
isinstance(..., DifyPort) check.
2026-08-18 21:45:05 -07:00
Charles Yao 5a93bec706 feat(copilot): actor→account resolution + app loading with tenant guard 2026-08-18 21:45:05 -07:00
Charles YaoandClaude Opus 4.8 388d3a949b feat(copilot): pure run-result mapping
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 21:45:05 -07:00
Charles Yao 535788f1c1 feat(copilot): pure set_node_config graph mutation 2026-08-18 21:45:05 -07:00