|
1 | 1 | # @inkeep/agents-cli |
2 | 2 |
|
| 3 | +## 0.61.0 |
| 4 | + |
| 5 | +### Minor Changes |
| 6 | + |
| 7 | +- 12722d9: Add interactive merge conflict resolution UI for inkeep pull command |
| 8 | + |
| 9 | +### Patch Changes |
| 10 | + |
| 11 | +- 1e4f05d: Refactor agent graph editor to use deterministic graph keys and single source of truth for form state |
| 12 | + |
| 13 | + ### Graph identity system |
| 14 | + |
| 15 | + - Add deterministic graph key derivation for all node types (`getSubAgentGraphKey`, `getMcpGraphKey`, `getFunctionToolGraphKey`, `getExternalAgentGraphKey`, `getTeamAgentGraphKey`) via new `graph-keys.ts`, `graph-identity.ts`, `sub-agent-identity.ts`, and `function-tool-identity.ts` modules |
| 16 | + - Replace unstable `generateId()` UUIDs with stable, domain-meaningful identifiers derived from persisted IDs (relation IDs, tool IDs, agent IDs) |
| 17 | + - URL-based sidepane selection now uses graph keys instead of raw React Flow IDs, so deep-links survive re-renders and saves |
| 18 | + |
| 19 | + ### RHF as single source of truth |
| 20 | + |
| 21 | + - Strip `node.data` down to a thin identity envelope (`nodeKey` + minimal refs like `toolId`) — all business fields (name, description, prompt, models, code, etc.) are read exclusively from React Hook Form state |
| 22 | + - Remove `hydrateNodesWithFormData()` entirely; `editorToPayload()` now reads all business data directly from a `SerializeAgentFormState` bundle with `requireFormValue()` fail-fast guards |
| 23 | + - Rename `FullAgentUpdateSchema` → `FullAgentFormSchema`, remove `.transform()` from schema (resolution now happens at serialize-time), split types into `FullAgentFormValues` / `FullAgentFormInputValues` |
| 24 | + |
| 25 | + ### Connection state consolidation |
| 26 | + |
| 27 | + - Collapse scattered `tempSelectedTools`/`tempHeaders`/`tempToolPolicies` on node data into `mcpRelations` and `functionToolRelations` RHF record maps with factory helpers (`createMcpRelationFormInput`, `createFunctionToolRelationFormInput`) |
| 28 | + - Edge removal triggers synchronous `form.unregister()` instead of deferred `requestAnimationFrame` — only `relationshipId` is unregistered for MCP relations to avoid a race condition where headers would be set to empty string on removal |
| 29 | + - Remove `subAgentId` manipulation from Zustand store's `onEdgesChange` |
| 30 | + |
| 31 | + ### Save-cycle reconciliation |
| 32 | + |
| 33 | + - Expand `syncSavedAgentGraph` to reconcile three categories of server-assigned IDs: tool `canUse` relations, external agent delegate relations, and team agent delegate relations |
| 34 | + - Rename MCP node IDs to deterministic graph keys post-save; preserve URL selection state via `findNodeByGraphKey`/`findEdgeByGraphKey` |
| 35 | + - Collapse redundant double `isNodeType` patterns into single guards |
| 36 | + |
| 37 | + ### Bug fixes |
| 38 | + |
| 39 | + - Fix function tool "requires approval" flag not persisting across save/reload by hydrating `needsApproval` tool policies from `canUse` relations back into form state during `apiToFormValues()` |
| 40 | + - Fix model inheritance display: use `getModelInheritanceStatus()` instead of bare `!subAgent.models` check to correctly show "(inherited)" label |
| 41 | + - Fix MCP node editor crash on deep-link/reload: consolidate null guards for `toolData`, `tool`, and `mcpRelation` with proper JSX fallback UI |
| 42 | + - Fix function tool node editor crash after node removal: add early return when `functionId` is undefined |
| 43 | + - Fix race condition when MCP relation is removed but component is still mounted |
| 44 | + |
| 45 | + ### Performance |
| 46 | + |
| 47 | + - Replace `useWatch({ name: 'functionTools' })` with targeted `useWatch({ name: 'functionTools.${id}.functionId' })` to eliminate O(N²) re-renders across function tool nodes |
| 48 | + - Remove `getFunctionIdForTool` helper that iterated the entire `functionTools` map |
| 49 | + |
| 50 | + ### Schema changes |
| 51 | + |
| 52 | + - Rename form field `defaultSubAgentId` → `defaultSubAgentNodeId` to clarify it holds a node key; translation to persisted ID happens at serialization time |
| 53 | + - Add `FunctionToolRelationSchema` and `functionToolRelations` record field to form schema |
| 54 | + - OpenAPI: `defaultSubAgentId` uses `$ref` to `ResourceId`, `maxTransferCount` type corrected to `integer`, function tool `dependencies` simplified to `StringRecord` |
| 55 | + |
| 56 | + ### Test coverage |
| 57 | + |
| 58 | + - Add 7 new test files covering graph identity, function tool identity, form-state defaults, and sync-saved-agent-graph scenarios |
| 59 | + - Expand serialize and deserialize test suites with new architecture patterns |
| 60 | + - Add roundtrip test for approval policy hydration |
| 61 | + |
| 62 | +- Updated dependencies [12722d9] |
| 63 | +- Updated dependencies [15c3f9d] |
| 64 | +- Updated dependencies [ec1b2f7] |
| 65 | +- Updated dependencies [1e4f05d] |
| 66 | +- Updated dependencies [cad67b9] |
| 67 | +- Updated dependencies [f4a9c69] |
| 68 | + - @inkeep/agents-core@0.61.0 |
| 69 | + - @inkeep/agents-manage-ui@0.61.0 |
| 70 | + - @inkeep/agents-sdk@0.61.0 |
| 71 | + |
3 | 72 | ## 0.60.0 |
4 | 73 |
|
5 | 74 | ### Patch Changes |
|
0 commit comments