agentex-creator-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/LICENSE +21 -0
  3. package/README.md +195 -0
  4. package/dist/packages/contracts/src/deployer-investigation.d.ts +1015 -0
  5. package/dist/packages/contracts/src/deployer-investigation.js +101 -0
  6. package/dist/packages/contracts/src/index.d.ts +1701 -0
  7. package/dist/packages/contracts/src/index.js +380 -0
  8. package/dist/packages/contracts/src/indexed-activity.d.ts +684 -0
  9. package/dist/packages/contracts/src/indexed-activity.js +71 -0
  10. package/dist/packages/contracts/src/indexed-agents.d.ts +299 -0
  11. package/dist/packages/contracts/src/indexed-agents.js +131 -0
  12. package/dist/packages/contracts/src/inspection.d.ts +906 -0
  13. package/dist/packages/contracts/src/inspection.js +114 -0
  14. package/dist/packages/contracts/src/kinds.d.ts +5398 -0
  15. package/dist/packages/contracts/src/kinds.js +156 -0
  16. package/dist/packages/contracts/src/report-presentation.d.ts +346 -0
  17. package/dist/packages/contracts/src/report-presentation.js +120 -0
  18. package/dist/packages/contracts/src/solana-inspection.d.ts +451 -0
  19. package/dist/packages/contracts/src/solana-inspection.js +94 -0
  20. package/dist/packages/contracts/src/token-market.d.ts +193 -0
  21. package/dist/packages/contracts/src/token-market.js +335 -0
  22. package/dist/packages/contracts/src/wallet-analysis.d.ts +866 -0
  23. package/dist/packages/contracts/src/wallet-analysis.js +89 -0
  24. package/dist/packages/contracts/src/watchtower.d.ts +1141 -0
  25. package/dist/packages/contracts/src/watchtower.js +196 -0
  26. package/dist/packages/contracts/src/workflow.d.ts +1568 -0
  27. package/dist/packages/contracts/src/workflow.js +651 -0
  28. package/dist/packages/inspector/src/decode.d.ts +23 -0
  29. package/dist/packages/inspector/src/decode.js +150 -0
  30. package/dist/packages/inspector/src/scope.d.ts +87 -0
  31. package/dist/packages/inspector/src/scope.js +64 -0
  32. package/dist/packages/model/src/analysis.d.ts +149 -0
  33. package/dist/packages/model/src/analysis.js +387 -0
  34. package/dist/packages/model/src/pricing.d.ts +38 -0
  35. package/dist/packages/model/src/pricing.js +49 -0
  36. package/dist/packages/model/src/retry.d.ts +20 -0
  37. package/dist/packages/model/src/retry.js +31 -0
  38. package/dist/packages/model/src/schema.d.ts +10 -0
  39. package/dist/packages/model/src/schema.js +51 -0
  40. package/dist/packages/model/src/summary.d.ts +91 -0
  41. package/dist/packages/model/src/summary.js +177 -0
  42. package/dist/packages/model/src/types.d.ts +81 -0
  43. package/dist/packages/model/src/types.js +19 -0
  44. package/dist/packages/monitoring/src/delivery.d.ts +32 -0
  45. package/dist/packages/monitoring/src/delivery.js +53 -0
  46. package/dist/packages/providers/src/chain-transport.d.ts +42 -0
  47. package/dist/packages/providers/src/chain-transport.js +57 -0
  48. package/dist/packages/providers/src/coverage.d.ts +105 -0
  49. package/dist/packages/providers/src/coverage.js +260 -0
  50. package/dist/packages/providers/src/health.d.ts +273 -0
  51. package/dist/packages/providers/src/health.js +505 -0
  52. package/dist/packages/providers/src/keyed.d.ts +96 -0
  53. package/dist/packages/providers/src/keyed.js +240 -0
  54. package/dist/packages/providers/src/snapshot.d.ts +61 -0
  55. package/dist/packages/providers/src/snapshot.js +77 -0
  56. package/dist/packages/publication/src/fixtures.d.ts +45 -0
  57. package/dist/packages/publication/src/fixtures.js +350 -0
  58. package/dist/packages/research/src/index.d.ts +188 -0
  59. package/dist/packages/research/src/index.js +829 -0
  60. package/dist/packages/runtime/src/checkpoints.d.ts +65 -0
  61. package/dist/packages/runtime/src/checkpoints.js +214 -0
  62. package/dist/packages/runtime/src/policy.d.ts +57 -0
  63. package/dist/packages/runtime/src/policy.js +296 -0
  64. package/dist/packages/sdk/src/bin/agentex-buyer.d.ts +2 -0
  65. package/dist/packages/sdk/src/bin/agentex-buyer.js +4 -0
  66. package/dist/packages/sdk/src/bin/agentex.d.ts +2 -0
  67. package/dist/packages/sdk/src/bin/agentex.js +3 -0
  68. package/dist/packages/sdk/src/buyer-cli.d.ts +10 -0
  69. package/dist/packages/sdk/src/buyer-cli.js +210 -0
  70. package/dist/packages/sdk/src/buyer.d.ts +534 -0
  71. package/dist/packages/sdk/src/buyer.js +441 -0
  72. package/dist/packages/sdk/src/cli.d.ts +14 -0
  73. package/dist/packages/sdk/src/cli.js +149 -0
  74. package/dist/packages/sdk/src/errors.d.ts +31 -0
  75. package/dist/packages/sdk/src/errors.js +24 -0
  76. package/dist/packages/sdk/src/index.d.ts +236 -0
  77. package/dist/packages/sdk/src/index.js +150 -0
  78. package/dist/packages/sdk/src/local.d.ts +11 -0
  79. package/dist/packages/sdk/src/local.js +110 -0
  80. package/dist/packages/sdk/src/rails.d.ts +59 -0
  81. package/dist/packages/sdk/src/rails.js +96 -0
  82. package/dist/packages/sdk/src/report.d.ts +121 -0
  83. package/dist/packages/sdk/src/report.js +114 -0
  84. package/dist/packages/sdk/src/version.d.ts +2 -0
  85. package/dist/packages/sdk/src/version.js +2 -0
  86. package/dist/packages/watchtower/src/index.d.ts +150 -0
  87. package/dist/packages/watchtower/src/index.js +786 -0
  88. package/dist/packages/workflow/src/registry.d.ts +61 -0
  89. package/dist/packages/workflow/src/registry.js +76 -0
  90. package/examples/README.md +34 -0
  91. package/examples/cli-usage.sh +30 -0
  92. package/examples/fixtures/base-weth-input.json +4 -0
  93. package/examples/focused-researcher.json +127 -0
  94. package/examples/pay-with-eth-robinhood.mts +37 -0
  95. package/examples/pay-with-usdc.mts +41 -0
  96. package/examples/quickstart.mts +73 -0
  97. package/package.json +50 -0
@@ -0,0 +1,114 @@
1
+ import { z } from 'zod';
2
+ import { AddressSchema, AgentManifestSchema, AtomicAmountSchema, ChainKeySchema, ObservationSchema, ResearchErrorSchema, contentHash, evmEvidenceItemSchema, matchesTemplateInput, publishManifest } from './index.js';
3
+ /** Transaction Inspector contracts. Kept outside index.ts so both modules initialise without a circular import. */
4
+ export const INSPECTION_MAX_DATA_BYTES = 16384;
5
+ export const INSPECTION_RPC_CEILING = 24;
6
+ export const INSPECTION_TOOL = 'evm.inspect-transaction@0.1.0';
7
+ const Hash = z.string().regex(/^[a-f0-9]{64}$/);
8
+ const Hex32 = z.string().regex(/^0x[a-f0-9]{64}$/);
9
+ export const CalldataSchema = z.string().max(2 + INSPECTION_MAX_DATA_BYTES * 2, `Calldata exceeds ${INSPECTION_MAX_DATA_BYTES} bytes`).regex(/^0x(?:[0-9a-fA-F]{2})*$/, 'Expected even-length 0x-prefixed hex data');
10
+ /** A proposed, unsigned payload. There is deliberately no signature, nonce, key or broadcast field. */
11
+ export const TransactionInspectionInputSchema = z.strictObject({
12
+ chain: ChainKeySchema,
13
+ from: AddressSchema,
14
+ to: AddressSchema.nullable().default(null),
15
+ data: CalldataSchema,
16
+ value: AtomicAmountSchema.default('0'),
17
+ snapshotBlock: AtomicAmountSchema.optional(),
18
+ }).superRefine((input, ctx) => {
19
+ if (input.to === null && input.data === '0x')
20
+ ctx.addIssue({ code: 'custom', path: ['data'], message: 'Contract creation (to = null) requires init code' });
21
+ });
22
+ export const TRANSACTION_INSPECTOR_MANIFEST = publishManifest({
23
+ schemaVersion: '1.0', id: 'transaction-inspector', version: '0.1.0', name: 'Transaction Inspector',
24
+ description: 'Decode a proposed EVM payload, read target and grantee context at one finalized snapshot, and run eth_call plus eth_estimateGas from the sender. It never signs or broadcasts, does not trace asset flows and gives no safety verdict.',
25
+ author: { id: 'agentex', name: 'AGENTEX', ownership: 'first-party' }, license: 'Proprietary', visibility: 'source-visible', chains: ['ethereum', 'base'],
26
+ inputSchema: { type: 'object', additionalProperties: false, properties: { chain: { type: 'string', description: 'Explicit analysis network', enum: ['ethereum', 'base'] }, from: { type: 'string', description: 'Sender address used as simulation context' }, to: { type: 'string', description: 'Target address; omit or null for contract creation' }, data: { type: 'string', description: 'Hex calldata or init code, at most 16 KiB' }, value: { type: 'string', description: 'Native value in atomic units' }, snapshotBlock: { type: 'string', description: 'Optional finalized block number' } }, required: ['chain', 'from', 'data'] },
27
+ outputSchemaId: 'agentex.transaction-inspection.v1', tools: [{ id: 'evm.inspect-transaction', version: '0.1.0', capability: 'evm.read', chains: ['ethereum', 'base'], addressScope: 'input-transaction', maximumCalls: 24 }],
28
+ modelPolicy: { mode: 'deterministic', maximumModelTokens: 0 }, limits: { maximumRpcCalls: 24, maximumDurationMs: 60000, maximumOutputBytes: 262144, maximumGraphDepth: 4, maximumPages: 0, maximumExecutionAtomic: '0' },
29
+ workflow: [{ id: 'input', type: 'input', dependsOn: [] }, { id: 'inspect', type: 'tool', tool: 'evm.inspect-transaction', dependsOn: ['input'], arguments: { chain: { source: 'input', path: 'chain' }, from: { source: 'input', path: 'from' }, to: { source: 'input', path: 'to' }, data: { source: 'input', path: 'data' }, value: { source: 'input', path: 'value' }, snapshotBlock: { source: 'input', path: 'snapshotBlock' } } }, { id: 'report', type: 'output', dependsOn: ['inspect'], from: 'inspect' }],
30
+ testCases: ['erc20-decoders', 'nested-multicall-bound', 'unknown-selector', 'revert-reason', 'contract-creation', 'no-code-target', 'unlimited-approval', 'provider-failure', 'budget-stop'],
31
+ }).manifest;
32
+ /** Transaction Inspector 0.2.0: identical graph, tool, limits and output schema to 0.1.0 (kept byte-identical, hash 4dab080b…); instant-read wording for new drafts. */
33
+ export const TRANSACTION_INSPECTOR_MANIFEST_V2 = publishManifest({
34
+ ...structuredClone(TRANSACTION_INSPECTOR_MANIFEST), version: '0.2.0',
35
+ description: 'Decode a proposed EVM payload, read target and grantee context at the latest block (sequencer-confirmed), pinned for the run and rechecked at completion, and run eth_call plus eth_estimateGas from the sender. It never signs or broadcasts, does not trace asset flows and gives no safety verdict.',
36
+ inputSchema: { ...structuredClone(TRANSACTION_INSPECTOR_MANIFEST.inputSchema), properties: { ...structuredClone(TRANSACTION_INSPECTOR_MANIFEST.inputSchema.properties), snapshotBlock: { type: 'string', description: 'Optional block number (defaults to the latest block)' } } },
37
+ }).manifest;
38
+ /** Executable manifest subset for the transaction inspector: fixed graph and tool, selectable chains and lower limits only. */
39
+ export const SupportedTransactionInspectorManifestSchema = AgentManifestSchema.superRefine((manifest, ctx) => {
40
+ if (manifest.outputSchemaId !== 'agentex.transaction-inspection.v1')
41
+ ctx.addIssue({ code: 'custom', path: ['outputSchemaId'], message: 'Only agentex.transaction-inspection.v1 manifests are Transaction Inspector packages.' });
42
+ if (contentHash(manifest.workflow) !== contentHash(TRANSACTION_INSPECTOR_MANIFEST.workflow))
43
+ ctx.addIssue({ code: 'custom', path: ['workflow'], message: 'The executor supports only the bounded Transaction Inspector graph.' });
44
+ if (!matchesTemplateInput(manifest, [TRANSACTION_INSPECTOR_MANIFEST, TRANSACTION_INSPECTOR_MANIFEST_V2]))
45
+ ctx.addIssue({ code: 'custom', path: ['inputSchema'], message: 'The input declaration must match the supported chain/from/to/data/value/snapshot inputs.' });
46
+ const tool = manifest.tools[0];
47
+ if (manifest.tools.length !== 1 || tool?.id !== 'evm.inspect-transaction' || tool.version !== '0.1.0' || tool.capability !== 'evm.read' || tool.addressScope !== 'input-transaction')
48
+ ctx.addIssue({ code: 'custom', path: ['tools'], message: 'Only evm.inspect-transaction@0.1.0 with the read-only input-transaction grant is executable.' });
49
+ if (manifest.researchPolicy !== undefined)
50
+ ctx.addIssue({ code: 'custom', path: ['researchPolicy'], message: 'The inspector has no selectable research policy.' });
51
+ });
52
+ export const InspectionEvidenceItemSchema = evmEvidenceItemSchema(INSPECTION_TOOL);
53
+ export const INSPECTION_RPC_METHODS = ['eth_chainId', 'eth_getBlockByNumber', 'eth_getCode', 'eth_getStorageAt', 'eth_call', 'eth_estimateGas'];
54
+ export const DecodedActionKindSchema = z.enum(['native-transfer', 'contract-creation', 'erc20.transfer', 'erc20.approve', 'erc20-or-erc721.transferFrom', 'erc20.increaseAllowance', 'erc20.decreaseAllowance',
55
+ 'eip2612.permit', 'erc721-or-erc1155.setApprovalForAll', 'erc721.safeTransferFrom', 'erc1155.safeTransferFrom', 'weth.deposit', 'weth.withdraw', 'multicall', 'unknown']);
56
+ export const DecodedActionSchema = z.strictObject({
57
+ path: z.string().regex(/^\d{1,3}(?:\.\d{1,3}){0,7}$/), depth: z.number().int().min(0).max(8), target: AddressSchema.nullable(),
58
+ status: z.enum(['decoded', 'unknown', 'invalid', 'bound-reached']), kind: DecodedActionKindSchema,
59
+ selector: z.string().regex(/^0x[a-f0-9]{8}$/).nullable(), signature: z.string().max(200).nullable(),
60
+ arguments: z.record(z.string().regex(/^[a-zA-Z][a-zA-Z0-9]{0,31}$/), z.union([z.string().max(1024), z.boolean()])),
61
+ notes: z.array(z.string().max(500)).max(8),
62
+ });
63
+ export const InspectionFindingCodeSchema = z.enum(['unlimited-approval', 'approval-grantee-without-code', 'operator-approval-granted', 'operator-grantee-without-code', 'native-value-sent',
64
+ 'upgradeable-proxy-target', 'target-without-code', 'simulation-reverted', 'contract-creation', 'unknown-action', 'invalid-calldata', 'decoding-bound-reached']);
65
+ /** New inspections record the pinned latest block (`sequencer-confirmed`); `finalized` parses inspections captured before the instant-read rule. */
66
+ const SnapshotSchema = z.strictObject({ blockNumber: AtomicAmountSchema, blockHash: z.string(), timestamp: AtomicAmountSchema, finality: z.enum(['finalized', 'sequencer-confirmed']), canonicality: z.enum(['verified-at-completion', 'unchecked', 'changed']) });
67
+ export const TransactionInspectionReportSchema = z.strictObject({
68
+ schemaVersion: z.literal('agentex.transaction-inspection.v1'), agentVersion: z.string().regex(/^\d+\.\d+\.\d+$/), manifestHash: Hash,
69
+ input: TransactionInspectionInputSchema, status: z.enum(['complete', 'partial', 'failed']), generatedAt: z.iso.datetime(),
70
+ chainId: z.number().int().positive().nullable(), snapshot: SnapshotSchema.nullable(),
71
+ transaction: z.strictObject({ kind: z.enum(['call', 'native-transfer', 'contract-creation']), selector: z.string().regex(/^0x[a-f0-9]{8}$/).nullable(), dataBytes: z.number().int().min(0).max(INSPECTION_MAX_DATA_BYTES), dataHash: Hex32, valueAtomic: AtomicAmountSchema, valueFormatted: z.string(), valueUnit: z.literal('native-18-decimals') }),
72
+ actions: z.array(DecodedActionSchema).max(64),
73
+ target: z.strictObject({ address: AddressSchema.nullable(), codePresent: ObservationSchema, codeHash: ObservationSchema, implementation: ObservationSchema, admin: ObservationSchema, beacon: ObservationSchema, tokenName: ObservationSchema, tokenSymbol: ObservationSchema, tokenDecimals: ObservationSchema }),
74
+ grantees: z.array(z.strictObject({ address: AddressSchema, owner: AddressSchema, role: z.enum(['spender', 'operator']), actionPaths: z.array(z.string()).min(1).max(64), codePresent: ObservationSchema, currentAllowance: ObservationSchema })).max(8),
75
+ simulation: z.strictObject({
76
+ semantics: z.literal('eth_call-at-snapshot-not-asset-flow'),
77
+ call: z.strictObject({ status: z.enum(['success', 'reverted', 'execution-error', 'error', 'not-run']), reason: z.string().max(1000), returnData: z.string().regex(/^0x(?:[a-f0-9]{2})*$/).max(514).nullable(), returnDataBytes: z.number().int().nonnegative().nullable(), returnDataHash: Hex32.nullable(), revertData: z.string().regex(/^0x(?:[a-f0-9]{2})*$/).max(2 + INSPECTION_MAX_DATA_BYTES * 2).nullable(), revertReason: z.string().max(1024).nullable(), evidenceIds: z.array(z.string()) }),
78
+ gasEstimate: ObservationSchema, balanceChanges: ObservationSchema,
79
+ }),
80
+ findings: z.array(z.strictObject({ code: InspectionFindingCodeSchema, message: z.string().max(1000), actionPaths: z.array(z.string()).max(64), evidenceIds: z.array(z.string()) })).max(64),
81
+ limitations: z.array(z.string()), errors: z.array(ResearchErrorSchema), evidence: z.array(InspectionEvidenceItemSchema).max(INSPECTION_RPC_CEILING * 2),
82
+ usage: z.strictObject({ rpcCalls: z.number().int().nonnegative(), maximumRpcCalls: z.number().int().positive(), elapsedMs: z.number().int().nonnegative(), modelTokens: z.literal(0), providerCostAtomic: z.null(), providerCostStatus: z.literal('unpriced') }),
83
+ }).superRefine((report, ctx) => {
84
+ const ids = new Set(report.evidence.map((item) => item.id));
85
+ if (ids.size !== report.evidence.length)
86
+ ctx.addIssue({ code: 'custom', message: 'Duplicate evidence id' });
87
+ if (report.simulation.balanceChanges.status === 'observed')
88
+ ctx.addIssue({ code: 'custom', path: ['simulation', 'balanceChanges'], message: 'eth_call does not observe balance changes; they must remain unobserved.' });
89
+ if ((report.input.to === null) !== (report.target.address === null) || (report.input.to !== null && report.target.address?.toLowerCase() !== report.input.to.toLowerCase()))
90
+ ctx.addIssue({ code: 'custom', path: ['target'], message: 'Target context must describe the input target.' });
91
+ const paths = new Set(report.actions.map((action) => action.path));
92
+ const references = [...Object.values(report.target).filter((value) => typeof value === 'object' && value !== null), ...report.grantees.flatMap((grantee) => [grantee.codePresent, grantee.currentAllowance]),
93
+ report.simulation.call, report.simulation.gasEstimate, report.simulation.balanceChanges, ...report.findings];
94
+ for (const item of references)
95
+ for (const id of item.evidenceIds)
96
+ if (!ids.has(id))
97
+ ctx.addIssue({ code: 'custom', message: `Unknown evidence reference ${id}` });
98
+ for (const item of [...report.findings, ...report.grantees])
99
+ for (const path of item.actionPaths)
100
+ if (!paths.has(path))
101
+ ctx.addIssue({ code: 'custom', message: `Unknown action reference ${path}` });
102
+ for (const error of report.errors)
103
+ if (error.evidenceId && !ids.has(error.evidenceId))
104
+ ctx.addIssue({ code: 'custom', message: `Unknown error evidence reference ${error.evidenceId}` });
105
+ for (const item of report.evidence) {
106
+ if (contentHash(item.result) !== item.contentHash)
107
+ ctx.addIssue({ code: 'custom', message: 'Evidence content hash does not match its captured result' });
108
+ // An allowlist of read methods: signing and broadcast methods can never appear in a valid report.
109
+ if (!INSPECTION_RPC_METHODS.includes(item.source.method))
110
+ ctx.addIssue({ code: 'custom', message: `Unsupported inspector RPC method ${item.source.method}` });
111
+ }
112
+ if (['success', 'reverted', 'execution-error'].includes(report.simulation.call.status) && report.simulation.call.evidenceIds.length === 0)
113
+ ctx.addIssue({ code: 'custom', path: ['simulation', 'call'], message: 'A simulation outcome needs its captured eth_call receipt.' });
114
+ });