[codex] Add IXO transaction Qiforge plugin#211
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5285805271
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| required('collectionId', 'string'), | ||
| required('agentAddress', 'address'), | ||
| required('agentDid', 'did'), | ||
| optional('amount', 'coin'), |
There was a problem hiding this comment.
Require coin arrays for claim intents
For /ixo claims claim-intent, this field is optional and uses the single-coin schema, so the validator both accepts an intent with no amount and rejects the valid Coin[] shape ([{ denom, amount }]). The existing claim client requires amount: Coin[] and passes that array into MsgClaimIntent.fromPartial in packages/oracles-chain-client/src/client/claims/claims.ts:34-58, so normal claim-intent drafts cannot be rendered while invalid ones can pass validation.
Useful? React with 👍 / 👎.
| required('agentAddress', 'address'), | ||
| required('agentDid', 'did'), | ||
| required('adminAddress', 'address'), | ||
| optional('useIntent', 'bool'), |
There was a problem hiding this comment.
Accept submit-claim payment amounts
When a /ixo claims submit draft includes the optional payment amount, validation fails as an unknown field because this strict catalog entry omits it. The existing Claims.submitClaim API accepts amount?: Coin[] and includes it in MsgSubmitClaim.fromPartial in packages/oracles-chain-client/src/client/claims/claims.ts:69-105, so paid or intent-backed claim submissions cannot be prepared through this renderer.
Useful? React with 👍 / 👎.
| required('agentAddress', 'address'), | ||
| required('agentDid', 'did'), | ||
| required('adminAddress', 'address'), | ||
| required('status', 'int'), |
There was a problem hiding this comment.
Preserve the evaluate-claim oracle DID
Claim evaluation payloads that include the oracle DID used by the existing payment/authz flow are rejected because the value schema is strict and this field list omits oracle. Both packages/oracles-chain-client/src/client/payments/payments.ts:113-119 and packages/oracles-chain-client/src/client/authz/authz.test.ts:190-199 encode MsgEvaluateClaim with oracle, so those evaluation transactions cannot be prepared through the new plugin.
Useful? React with 👍 / 👎.
… + verified catalog + proto transfer) Restructure the IXO transaction feature onto the standalone `packages/ixo-transaction` package (server `/qiforge` + frontend `/react`), adopting PR #211's AG-UI wiring and removing the bundled-in-runtime copy. The agent prepares and validates a transaction; the user signs it in their Portal wallet via a hidden `sign_transaction` action. Adopted from PR #211: - `callAgAction` round-trip dispatching the `sign_transaction` AG-UI action. - FE SDK wiring: `exposeToAgent` flag + `registeredAgActions` split so the raw wallet action is executable over the websocket but NOT advertised to the agent — the agent can only sign through the validated `sign_ixo_transaction` tool. - `useIxoTransactionSigningAction()` hook, richer action args, result normalization, and the `@ixo/oracle-runtime/plugin-api` subpath export. Fixed / added on top: - Replaced the vibe-coded catalog with SDK-verified field shapes (`@ixo/impactxclient-sdk@2.4.1`); dropped the non-existent `names` module and `MsgUpdateCollectionQuota`; corrected iid `serviceData`, plural verifications/services, `MsgDeactivateIID.state`, token `mintBatch`, claims fields, etc. - BE→FE proto transfer: messages cross as proto-JSON `{ typeUrl, value }`; the FE hook converts each via the SDK's generated `fromJSON` (`src/react/proto.ts`) — decoding bytes/Long/Timestamp — before `transactSignX`. Heavy proto codecs stay on the FE. - Bridged the client-sdk (Zod 3) / package (Zod 4) seam without `as unknown as` by declaring the hidden action's decorative schema with a matching Zod 3 (`zod3`). - Dropped SKILL.md / agents / references; folded agent guidance into the manifest and tool descriptions. - Tests against the real plugin-api + a proto `fromJSON` test (34 pass). Spec: specs/ixo-transaction-signing-plugin.md.
Summary
signxTransaction/iframe rendering path with a validated Qiforge signing tool that dispatches the Portal frontendsign_transactionAG actionixo-transaction/reactwithuseIxoTransactionSigningAction()so Portal registers the wallet handler againsttransactSignX(messages, memo)without advertising raw signing as an agent tool@ixo/oracle-runtime/plugin-apiauthoring subpath and update tests to use the real runtime plugin API instead of a hand-written runtime stubValidation
pnpm --filter @ixo/oracle-runtime... buildpnpm --filter @ixo/oracles-client-sdk... buildpnpm --filter ixo-transaction testpnpm --filter ixo-transaction typecheckpnpm --filter ixo-transaction buildpnpm exec eslint packages/ixo-transaction packages/oracles-client-sdk/src/hooks/use-ag-action.ts packages/oracles-client-sdk/src/hooks/use-chat/v2/use-chat.ts packages/oracles-client-sdk/src/providers/oracles-provider/oracles-context.tsx packages/oracles-client-sdk/src/providers/oracles-provider/types.ts packages/oracle-runtime/src/plugin-api/index.tspnpm format:check/tmp/ixo-skill-validator-venv/bin/python /Users/shaunconway/.codex/skills/.system/skill-creator/scripts/quick_validate.py packages/ixo-transactionpnpm --filter ixo-transaction exec npm pack --dry-run