@finchtech/cli 0.5.3 → 0.5.4

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 (3) hide show
  1. package/README.md +8 -0
  2. package/dist/finch.js +131 -20
  3. package/package.json +4 -4
package/README.md CHANGED
@@ -196,3 +196,11 @@ CLI 0.5.1 allows ordinary logout and wallet switching with unfinished transactio
196
196
  ## Actionable usage errors, wallet list and network diagnostics (CLI 0.5.2)
197
197
 
198
198
  CLI 0.5.2 names the rejected option, missing argument or unknown subcommand together with the command's usage instead of a generic schema message; every command already prints JSON, so there is no `--json` option. `finch wallet list` shows the current wallet and registered addresses offline. Failed `finch mcp doctor` network checks report `httpStatus` or `networkErrorCode`, so a TLS-intercepting proxy, DNS failure or timeout is distinguishable from a server outage. Its PROD authentication-chain help also lists Injective (`1776`). Upgrade the installed executable to receive these changes; updating the Skill or website alone does not apply them.
199
+
200
+ ### Injective Skill transactions (0.5.4)
201
+
202
+ CLI 0.5.4 supports Skill publication, acquisition, version updates, price/supply changes and recovery on Injective EVM (`1776`). The real transaction adapter now accepts the reviewed Injective chain definition; older executables can reject these plans before reaching RPC. Use the exact chain from the Remote MCP plan; prices and gas use INJ. Upgrade the executable while preserving existing recovery journals.
203
+
204
+ ### Skill display languages (0.5.4)
205
+
206
+ Publication plans accept `sourceLocale` (`en`, `zh`, `zh-TW`). The gateway records it when the publication is confirmed; it stays outside chain metadata and SkillRoot hashes. Display edits and confirmation use Remote MCP after publication. A display-save failure retains recovery state: retry the same intent or fingerprint to finish database initialization without repeating the mint. Deploy the matching gateway and migration before using language-bearing plans.
package/dist/finch.js CHANGED
@@ -6619,7 +6619,7 @@ var init_package = __esm({
6619
6619
  "package.json"() {
6620
6620
  package_default = {
6621
6621
  name: "@finchtech/cli",
6622
- version: "0.5.3",
6622
+ version: "0.5.4",
6623
6623
  description: "Finch Agent CLI for wallet custody, Session-owned execution, and MCP OAuth approval.",
6624
6624
  type: "module",
6625
6625
  bin: {
@@ -22263,6 +22263,33 @@ var init_skill_protocol = __esm({
22263
22263
  factoryFirstBlock: "96438471",
22264
22264
  confirmations: 2
22265
22265
  }
22266
+ },
22267
+ "1776": {
22268
+ enabled: true,
22269
+ network: {
22270
+ chainId: 1776,
22271
+ name: "Injective",
22272
+ explorerUrl: "https://blockscout.injective.network",
22273
+ defaultRpcUrls: [
22274
+ "https://sentry.evm-rpc.injective.network"
22275
+ ]
22276
+ },
22277
+ sourceRepository: "FinchipAI/finchip-protocol",
22278
+ sourceCommit: "fcaa22761169b1e45aca5ea783d2315341c243a5",
22279
+ abiSourceCommit: "61982867d271ea9ebf0730b1a650bee1b9894642",
22280
+ contracts: {
22281
+ skillToken: "0x7ed98f8d72a447483446f28a973288d3301863cc",
22282
+ revenueRight: "0x6e8360b46225f40ecd66ef7c2b7fbfa4fa72dc82",
22283
+ skillInstance: "0xad8999ae8a63fc30dac591dc613105dccbb74c99",
22284
+ skillFactory: "0x6a82c248ffa66b064e3ddd913aa3be18e292a5ee",
22285
+ skillMarket: "0xa21716201931de0744230a58b58f48b94462ed8c",
22286
+ feeRouter: "0x5f3ecf942953e7acbce0b9b49b2ff7e159921de9"
22287
+ },
22288
+ deployment: {
22289
+ firstBlock: "187103028",
22290
+ factoryFirstBlock: "187103063",
22291
+ confirmations: 2
22292
+ }
22266
22293
  }
22267
22294
  }
22268
22295
  }
@@ -22285,6 +22312,7 @@ var init_task_protocol = __esm({
22285
22312
  chains: {
22286
22313
  "84532": {
22287
22314
  enabled: true,
22315
+ creationOpen: true,
22288
22316
  network: {
22289
22317
  chainId: 84532,
22290
22318
  name: "Base Sepolia",
@@ -22330,6 +22358,7 @@ var init_task_protocol = __esm({
22330
22358
  chains: {
22331
22359
  "8453": {
22332
22360
  enabled: true,
22361
+ creationOpen: true,
22333
22362
  network: {
22334
22363
  chainId: 8453,
22335
22364
  name: "Base",
@@ -22370,6 +22399,7 @@ var init_task_protocol = __esm({
22370
22399
  },
22371
22400
  "1776": {
22372
22401
  enabled: true,
22402
+ creationOpen: false,
22373
22403
  network: {
22374
22404
  chainId: 1776,
22375
22405
  name: "Injective",
@@ -22528,7 +22558,8 @@ function getTaskProtocolDeployment(environment3, chainId) {
22528
22558
  paymentTokenDecimals: value.policy.paymentTokenDecimals,
22529
22559
  expectedAwardAttestorAddress: value.authority.awardAttestor,
22530
22560
  expectedCreditGranterAddress: value.authority.creditGranter ?? null,
22531
- defaultRpcUrls: Object.freeze([...value.network.defaultRpcUrls])
22561
+ defaultRpcUrls: Object.freeze([...value.network.defaultRpcUrls]),
22562
+ creationOpen: value.creationOpen
22532
22563
  });
22533
22564
  }
22534
22565
  function getTaskProtocolDeploymentByChainId(chainId) {
@@ -22717,6 +22748,14 @@ var init_chains = __esm({
22717
22748
  });
22718
22749
  taskActiveSchema = external_exports.strictObject({
22719
22750
  enabled: external_exports.literal(true),
22751
+ /**
22752
+ * Whether publishers may create new Tasks on this chain. A chain can be
22753
+ * deployed and reviewed — drafts, reads, and settlement stay resolvable —
22754
+ * while creation stays closed because its treasury, gas funding, or RPC
22755
+ * retention is not production-ready. Opening a chain is a one-line manifest
22756
+ * review, never a UI edit.
22757
+ */
22758
+ creationOpen: external_exports.boolean(),
22720
22759
  network: networkSchema,
22721
22760
  ...sourceSchema,
22722
22761
  abiSourceCommit: commitSchema,
@@ -22877,6 +22916,7 @@ var init_chains = __esm({
22877
22916
  8453: "production",
22878
22917
  42161: "production",
22879
22918
  43114: "production",
22919
+ 1776: "production",
22880
22920
  84532: "test"
22881
22921
  });
22882
22922
  REVIEWED_NETWORKS = Object.freeze({
@@ -22930,17 +22970,26 @@ var init_sales_inquiries = __esm({
22930
22970
  local: {
22931
22971
  enabled: false,
22932
22972
  ipHourlyLimit: 5,
22933
- emailDailyLimit: 10
22973
+ emailDailyLimit: 10,
22974
+ emailFrom: "Finch <notifications@notify.finchtech.ai>",
22975
+ emailReplyTo: "customersupport@finchtech.ai",
22976
+ opsOrigin: "http://localhost:3002"
22934
22977
  },
22935
22978
  test: {
22936
22979
  enabled: true,
22937
22980
  ipHourlyLimit: 5,
22938
- emailDailyLimit: 10
22981
+ emailDailyLimit: 10,
22982
+ emailFrom: "Finch <notifications@notify.finchtech.ai>",
22983
+ emailReplyTo: "customersupport@finchtech.ai",
22984
+ opsOrigin: "https://finch-ops-git-staging-fin-chip-team.vercel.app"
22939
22985
  },
22940
22986
  production: {
22941
22987
  enabled: false,
22942
22988
  ipHourlyLimit: 5,
22943
- emailDailyLimit: 10
22989
+ emailDailyLimit: 10,
22990
+ emailFrom: "Finch <notifications@notify.finchtech.ai>",
22991
+ emailReplyTo: "customersupport@finchtech.ai",
22992
+ opsOrigin: "https://ops.finchtech.ai"
22944
22993
  }
22945
22994
  }
22946
22995
  };
@@ -22954,7 +23003,7 @@ var init_sales_inquiries2 = __esm({
22954
23003
  "use strict";
22955
23004
  init_zod();
22956
23005
  init_sales_inquiries();
22957
- policy = external_exports.strictObject({ enabled: external_exports.boolean(), ipHourlyLimit: external_exports.number().int().min(1).max(100), emailDailyLimit: external_exports.number().int().min(1).max(100) });
23006
+ policy = external_exports.strictObject({ enabled: external_exports.boolean(), ipHourlyLimit: external_exports.number().int().min(1).max(100), emailDailyLimit: external_exports.number().int().min(1).max(100), emailFrom: external_exports.string().regex(/^Finch <[^<>\r\n]+>$/u).refine((value) => external_exports.email().safeParse(value.slice(7, -1)).success), emailReplyTo: external_exports.email(), opsOrigin: external_exports.url() });
22958
23007
  schema = external_exports.strictObject({ schemaVersion: external_exports.literal(1), kind: external_exports.literal("sales_inquiries"), environments: external_exports.strictObject({ local: policy, test: policy, production: policy }) });
22959
23008
  parseSalesInquiryManifest = (value) => schema.parse(value);
22960
23009
  parsed = parseSalesInquiryManifest(sales_inquiries_default);
@@ -23222,6 +23271,15 @@ var init_skill_delivery = __esm({
23222
23271
  pkpId: "0xdf87a5d625926cedc0ad0ef74888adb643936f25",
23223
23272
  groupId: 1
23224
23273
  }
23274
+ },
23275
+ "1776": {
23276
+ chainId: 1776,
23277
+ chainTag: "injective",
23278
+ lit: {
23279
+ provider: "chipotle",
23280
+ pkpId: "0xdf87a5d625926cedc0ad0ef74888adb643936f25",
23281
+ groupId: 1
23282
+ }
23225
23283
  }
23226
23284
  }
23227
23285
  }
@@ -23447,7 +23505,7 @@ function getSkillDeliveryDeployment(environment3, chainId) {
23447
23505
  });
23448
23506
  }
23449
23507
  function getSkillDeliveryDeploymentByChainId(chainId) {
23450
- const environment3 = chainId === 84532 ? "test" : [1, 10, 56, 8453, 42161, 43114].includes(chainId) ? "production" : void 0;
23508
+ const environment3 = chainId === 84532 ? "test" : [1, 10, 56, 8453, 42161, 43114, 1776].includes(chainId) ? "production" : void 0;
23451
23509
  if (!environment3) throw new DeploymentManifestError(`Skill delivery has no reviewed binding for chain ${chainId}.`);
23452
23510
  return getSkillDeliveryDeployment(environment3, chainId);
23453
23511
  }
@@ -23538,7 +23596,7 @@ var init_platform = __esm({
23538
23596
  });
23539
23597
  skillDeliveryBindingSchema = external_exports.strictObject({
23540
23598
  chainId: external_exports.number().int().positive(),
23541
- chainTag: external_exports.enum(["base", "baseSepolia", "ethereum", "optimism", "bsc", "arbitrum", "avalanche"]),
23599
+ chainTag: external_exports.enum(["base", "baseSepolia", "ethereum", "optimism", "bsc", "arbitrum", "avalanche", "injective"]),
23542
23600
  lit: external_exports.strictObject({
23543
23601
  provider: external_exports.literal("chipotle"),
23544
23602
  pkpId: external_exports.string().min(1).max(512),
@@ -29896,7 +29954,7 @@ var init_validation_input = __esm({
29896
29954
  });
29897
29955
 
29898
29956
  // ../../packages/agent-market-contracts/src/v1/errors.ts
29899
- var creatorRequestReasonCodes, buyerStateReasonCodes, agentMarketErrorCodes, nextActionValues, AGENT_MARKET_ERROR_DEFINITIONS, nullableStringSchema, nullableUuidSchema, nullableRevisionSchema2, agentMarketErrorEnvelopeSchema;
29957
+ var creatorRequestReasonCodes, buyerStateReasonCodes, FREE_CALL_FAILURE_MESSAGES, agentMarketErrorCodes, nextActionValues, AGENT_MARKET_ERROR_DEFINITIONS, nullableStringSchema, nullableUuidSchema, nullableRevisionSchema2, agentMarketErrorEnvelopeSchema;
29900
29958
  var init_errors3 = __esm({
29901
29959
  "../../packages/agent-market-contracts/src/v1/errors.ts"() {
29902
29960
  "use strict";
@@ -29918,6 +29976,12 @@ var init_errors3 = __esm({
29918
29976
  "AVATAR_VIDEO_ACCOUNT_DAILY_LIMIT_REACHED",
29919
29977
  "AVATAR_VIDEO_PLATFORM_DAILY_LIMIT_REACHED"
29920
29978
  ];
29979
+ FREE_CALL_FAILURE_MESSAGES = Object.freeze({
29980
+ AGENT_FREE_ONLY_NOT_AVAILABLE: "This free Agent call is no longer available. Refresh your free allowance or connect your wallet to use purchased Credits.",
29981
+ AGENT_FREE_PAID_CONFIRMATION_REQUIRED: "This Agent has reached its daily free usage limit. Confirm paid Credits before continuing.",
29982
+ AGENT_FREE_DAILY_LIMIT_REACHED: "This Agent has reached its daily free usage limit. Please try again tomorrow.",
29983
+ AGENT_FREE_CALLS_PENDING: "Your remaining free calls are reserved by running requests. Wait for them to finish before starting another call."
29984
+ });
29921
29985
  agentMarketErrorCodes = [
29922
29986
  ...ONLINE_API_TECHNICAL_ERROR_CODES,
29923
29987
  "AGENT_MARKET_AUTH_REQUIRED",
@@ -29934,6 +29998,10 @@ var init_errors3 = __esm({
29934
29998
  "PRODUCTION_NOT_AVAILABLE",
29935
29999
  "INTEGRATION_FAMILY_IN_DEVELOPMENT",
29936
30000
  "AGENT_MARKET_STATE_CONFLICT",
30001
+ "AGENT_FREE_PAID_CONFIRMATION_REQUIRED",
30002
+ "AGENT_FREE_ONLY_NOT_AVAILABLE",
30003
+ "AGENT_FREE_DAILY_LIMIT_REACHED",
30004
+ "AGENT_FREE_CALLS_PENDING",
29937
30005
  "AGENT_MARKET_VALIDATION_REQUIRED",
29938
30006
  "AGENT_MARKET_OPERATION_NOT_FOUND",
29939
30007
  "AGENT_MARKET_INPUT_INVALID",
@@ -29981,6 +30049,10 @@ var init_errors3 = __esm({
29981
30049
  PRODUCTION_NOT_AVAILABLE: { httpStatus: 409, retryable: false, nextAction: "none" },
29982
30050
  INTEGRATION_FAMILY_IN_DEVELOPMENT: { httpStatus: 409, retryable: false, nextAction: "choose_supported_integration" },
29983
30051
  AGENT_MARKET_STATE_CONFLICT: { httpStatus: 409, retryable: false, nextAction: "refresh_resource" },
30052
+ AGENT_FREE_PAID_CONFIRMATION_REQUIRED: { httpStatus: 409, retryable: false, nextAction: "refresh_resource" },
30053
+ AGENT_FREE_ONLY_NOT_AVAILABLE: { httpStatus: 409, retryable: false, nextAction: "refresh_resource" },
30054
+ AGENT_FREE_DAILY_LIMIT_REACHED: { httpStatus: 429, retryable: true, nextAction: "retry_tomorrow" },
30055
+ AGENT_FREE_CALLS_PENDING: { httpStatus: 409, retryable: true, nextAction: "retry_later" },
29984
30056
  AGENT_MARKET_VALIDATION_REQUIRED: { httpStatus: 409, retryable: false, nextAction: "run_connection_test" },
29985
30057
  AGENT_MARKET_OPERATION_NOT_FOUND: { httpStatus: 404, retryable: false, nextAction: "none" },
29986
30058
  AGENT_MARKET_INPUT_INVALID: { httpStatus: 422, retryable: false, nextAction: "fix_request" },
@@ -31255,7 +31327,7 @@ function taskProjectionSchema(properties) {
31255
31327
  terminalContent: taskPresentationContentSchema
31256
31328
  }, Object.keys(properties));
31257
31329
  }
31258
- var booleanSchema2, jsonValueSchema, nullSchema2, agentOnInitialInputSchema, agentOnFollowUpContentSchema, feeBpsCapSchema, createPurchaseIntentRequestSchema, purchaseIntentAcceptedSchema, PURCHASE_FEE_DECISION_CONTRACT, feeSnapshotCommon, purchaseFeeDecisionSnapshotSchema, PURCHASE_LIFECYCLE_CONTRACT, FINANCIAL_AUTHORIZATION_CONTRACT, nonNegativeIntegerStringSchema2, callRightPurchaseBatchSchema, callRightsListResponseSchema, CALL_RIGHTS_PAGE_CONTRACT, CALL_FUNDING_SOURCES, fundingSourceSchema, callEligibilityQuerySchema, described2, callEligibilityResponseSchema, invocationStartRequestSchema, invocationContinueRequestSchema, runtimeHandoffStateSchema, p1InvocationReceiptProperties, p1InvocationReceiptSchema, p1InvocationAcceptedSchema, directInvocationAcceptedSchema, supplementalQuestionOptionSchema, p1QuestionSchema, p1QuestionsSchema, p1AwaitingCompletionQuestionsSchema, taskQuestionSchema, taskQuestionsSchema, closedPublicFailureSchema, timeoutFailureSchema, invocationCommon, p1InvocationResponseSchema, directInvocationCommon, directPublicFailureSchema, directInvocationResponseSchema, DIRECT_INVOCATION_READ_CONTRACT, invocationResponseSchema, createTaskRequestSchema, TASK_QUANTITY_AUTHORITY_CONTRACT, taskCreateReceiptProperties, taskCreateReceiptSchema, taskCreateAcceptedSchema, taskStrongEtagSchema, taskInputReceiptSchema, taskInputAcceptedSchema, taskCommon, buyerOutputArtifactSchema, buyerOutputArtifactsSchema, taskFailureCodeSchema, taskFailureSchema, taskPresentationContentSchema, taskResponseSchema, BUYER_AGENTON_RECOVERY_CONTRACT, appendTaskInputRequestSchema, directInvocationRequestSchema, TASK_COMPLETED_CANONICALIZATION;
31330
+ var booleanSchema2, jsonValueSchema, nullSchema2, agentOnInitialInputSchema, agentOnFollowUpContentSchema, feeBpsCapSchema, createPurchaseIntentRequestSchema, purchaseIntentAcceptedSchema, PURCHASE_FEE_DECISION_CONTRACT, feeSnapshotCommon, purchaseFeeDecisionSnapshotSchema, PURCHASE_LIFECYCLE_CONTRACT, FINANCIAL_AUTHORIZATION_CONTRACT, nonNegativeIntegerStringSchema2, callRightPurchaseBatchSchema, callRightsListResponseSchema, CALL_RIGHTS_PAGE_CONTRACT, CALL_FUNDING_SOURCES, fundingSourceSchema, callEligibilityQuerySchema, described2, freeConsentFields, freeCallConsentRequestSchema, freeCallConsentResponseSchema, callEligibilityResponseSchema, invocationStartRequestSchema, invocationContinueRequestSchema, runtimeHandoffStateSchema, p1InvocationReceiptProperties, p1InvocationReceiptSchema, p1InvocationAcceptedSchema, directInvocationAcceptedSchema, supplementalQuestionOptionSchema, p1QuestionSchema, p1QuestionsSchema, p1AwaitingCompletionQuestionsSchema, taskQuestionSchema, taskQuestionsSchema, closedPublicFailureSchema, timeoutFailureSchema, invocationCommon, p1InvocationResponseSchema, directInvocationCommon, directPublicFailureSchema, directInvocationResponseSchema, DIRECT_INVOCATION_READ_CONTRACT, invocationResponseSchema, createTaskRequestSchema, TASK_QUANTITY_AUTHORITY_CONTRACT, taskCreateReceiptProperties, taskCreateReceiptSchema, taskCreateAcceptedSchema, taskStrongEtagSchema, taskInputReceiptSchema, taskInputAcceptedSchema, taskCommon, buyerOutputArtifactSchema, buyerOutputArtifactsSchema, taskFailureCodeSchema, taskFailureSchema, taskPresentationContentSchema, taskResponseSchema, BUYER_AGENTON_RECOVERY_CONTRACT, appendTaskInputRequestSchema, directInvocationRequestSchema, TASK_COMPLETED_CANONICALIZATION;
31259
31331
  var init_buyer = __esm({
31260
31332
  "../../packages/agent-market-contracts/src/v1/buyer.ts"() {
31261
31333
  "use strict";
@@ -31423,6 +31495,30 @@ var init_buyer = __esm({
31423
31495
  }
31424
31496
  }, []);
31425
31497
  described2 = (schema6, description) => Object.freeze({ ...schema6, description });
31498
+ freeConsentFields = {
31499
+ confirmed: { const: true, description: "Must be true only after the user explicitly approves paid fallback for this one call." },
31500
+ requiredUnits: { ...positiveIntegerStringSchema2, maxLength: 78, description: "Exact paid unit cost returned by call eligibility; a changed price invalidates this consent." }
31501
+ };
31502
+ freeCallConsentRequestSchema = Object.freeze({
31503
+ oneOf: [
31504
+ strictObjectSchema2({
31505
+ ...freeConsentFields,
31506
+ offerId: canonicalUuidSchema2,
31507
+ versionId: nullSchema2,
31508
+ quantity: { type: "integer", minimum: 1, maximum: 2147483647 }
31509
+ }),
31510
+ strictObjectSchema2({
31511
+ ...freeConsentFields,
31512
+ offerId: nullSchema2,
31513
+ versionId: canonicalUuidSchema2,
31514
+ quantity: { const: 1 }
31515
+ })
31516
+ ]
31517
+ });
31518
+ freeCallConsentResponseSchema = strictObjectSchema2({ confirmed: {
31519
+ const: true,
31520
+ description: "The exact one-request paid fallback consent was recorded; no invocation was admitted or charged."
31521
+ } });
31426
31522
  callEligibilityResponseSchema = strictObjectSchema2({
31427
31523
  serviceVersionId: described2(canonicalUuidSchema2, "Service version the call would run on."),
31428
31524
  offerId: { anyOf: [canonicalUuidSchema2, nullSchema2], description: "The checked AgentOn offer, or null for a Direct API version." },
@@ -31430,18 +31526,18 @@ var init_buyer = __esm({
31430
31526
  requiredUnits: described2(positiveIntegerStringSchema2, "Call-right units a paid call would reserve, as a decimal integer string."),
31431
31527
  fundingSource: {
31432
31528
  enum: ["merchant_self_test", "promotion", "paid", "insufficient"],
31433
- description: "What the next call would use: merchant_self_test and promotion are free; paid consumes requiredUnits purchased call rights; insufficient means call rights must be purchased first."
31529
+ description: "merchant_self_test and promotion are free; paid reserves requiredUnits purchased call rights. If unused personal calls remain but dailyRemaining is zero, paid funding requires explicit one-request confirmation first. insufficient can mean missing purchased rights or all remaining free calls are still in flight."
31434
31530
  },
31435
31531
  merchantSelfTest: described2(booleanSchema2, "True when the caller owns this contract-tested agent, so calls are a free owner self-test."),
31436
31532
  promotion: {
31437
31533
  anyOf: [strictObjectSchema2({
31438
- availableOperations: described2(nonNegativeIntegerStringSchema2, "Free calls usable now: the lower of personalRemaining and dailyRemaining."),
31439
- personalRemaining: described2(nonNegativeIntegerStringSchema2, "Free calls left for this account in the promotion."),
31440
- expiresAt: described2(canonicalSecondTimestampSchema, "When the promotion ends."),
31441
- dailyRemaining: { anyOf: [nonNegativeIntegerStringSchema2, nullSchema2], description: "Free calls left today for this agent across all buyers, or null when there is no daily limit." },
31442
- dailyResetsAt: { anyOf: [canonicalSecondTimestampSchema, nullSchema2], description: "When the daily limit resets, or null when there is no daily limit." }
31534
+ availableOperations: described2(nonNegativeIntegerStringSchema2, "Free calls usable now after deducting running reservations and applying the shared Agent daily ceiling."),
31535
+ personalRemaining: described2(nonNegativeIntegerStringSchema2, "Unexpired unused calls out of the account/Agent lifetime grant of 10. Only success consumes a call; in-flight reservations are not consumption. This balance ignores shared daily capacity."),
31536
+ expiresAt: described2(canonicalSecondTimestampSchema, "Exclusive Beijing midnight on day 31, starting on max(first Agent publication date, account registration date). Display the preceding Beijing date."),
31537
+ dailyRemaining: { anyOf: [nonNegativeIntegerStringSchema2, nullSchema2], description: "Remaining shared capacity out of 100 free calls per canonical Agent and Beijing calendar day; includes running reservations." },
31538
+ dailyResetsAt: { anyOf: [canonicalSecondTimestampSchema, nullSchema2], description: "Next Beijing (UTC+8) midnight. Revisions and republication never reset daily capacity." }
31443
31539
  }), nullSchema2],
31444
- description: "The active free promotion for this agent, or null when there is none."
31540
+ description: "The canonical account/Agent trial, including expired or exhausted trials for status display; null when no first publication is known. Never renews on login, Revision or republication."
31445
31541
  },
31446
31542
  paid: Object.freeze({
31447
31543
  ...strictObjectSchema2({
@@ -34695,6 +34791,19 @@ var init_operations = __esm({
34695
34791
  integrationFamilies: families.active,
34696
34792
  writes: false
34697
34793
  }),
34794
+ "buyer_free_call_consent.confirm": operation({
34795
+ id: "buyer_free_call_consent.confirm",
34796
+ requiredScope: "agent_market:buyer:invoke",
34797
+ http: http("post", "/api/v1/agent-market/buyer/call-eligibility", 200, {
34798
+ requestSchema: freeCallConsentRequestSchema,
34799
+ responseSchema: freeCallConsentResponseSchema,
34800
+ idempotencyRequired: true
34801
+ }),
34802
+ mcp: { name: "agent_market_buyer_free_call_consent_confirm" },
34803
+ cli: null,
34804
+ integrationFamilies: families.active,
34805
+ writes: true
34806
+ }),
34698
34807
  "buyer_p1_invocations.create": operation({
34699
34808
  id: "buyer_p1_invocations.create",
34700
34809
  requiredScope: "agent_market:buyer:invoke",
@@ -35675,6 +35784,7 @@ var init_schemas3 = __esm({
35675
35784
  deadline: nullableString,
35676
35785
  startAt: nullableString,
35677
35786
  goals: { type: "array", maxItems: 5, items: openObjectSchema2 },
35787
+ chainId: positiveInteger,
35678
35788
  publishNow: { const: false }
35679
35789
  }, ["title", "goal", "rewardAmount", "publishNow"]);
35680
35790
  taskSubmissionRequestSchema = strictObjectSchema3({
@@ -57839,7 +57949,7 @@ function publishPlan(value, context) {
57839
57949
  const chainId = assertAuthority(plan, "publish", context.walletAddress);
57840
57950
  assertLocalAction(plan.localAction, "skill publish-submit");
57841
57951
  const request2 = object2(plan.request, "Skill publish request");
57842
- exact2(request2, ["chainId", "slug", "name", "category", "licenseTypeName", "imageURI", "sourceKind", "contentMode", "unitPrice", "maxSupply", ...Object.hasOwn(request2, "summary") ? ["summary"] : []], "Skill publish request");
57952
+ exact2(request2, ["chainId", "slug", "name", "category", "licenseTypeName", "imageURI", "sourceKind", "contentMode", "unitPrice", "maxSupply", ...Object.hasOwn(request2, "summary") ? ["summary"] : [], ...Object.hasOwn(request2, "sourceLocale") ? ["sourceLocale"] : []], "Skill publish request");
57843
57953
  if (request2.chainId !== chainId) throw new TypeError("Skill publish request chain is invalid.");
57844
57954
  string4(request2.slug, "Skill slug");
57845
57955
  string4(request2.name, "Skill name");
@@ -57849,6 +57959,7 @@ function publishPlan(value, context) {
57849
57959
  throw new TypeError("Skill publish metadata is invalid.");
57850
57960
  }
57851
57961
  if (Object.hasOwn(request2, "summary") && (typeof request2.summary !== "string" || request2.summary.length > 500)) throw new TypeError("Skill summary is invalid.");
57962
+ if (request2.sourceLocale !== void 0 && !["en", "zh", "zh-TW"].includes(String(request2.sourceLocale))) throw new TypeError("Skill source language is invalid.");
57852
57963
  sourceKind(request2.sourceKind);
57853
57964
  contentMode(request2.contentMode);
57854
57965
  string4(request2.unitPrice, "Skill unitPrice", DECIMAL);
@@ -58614,7 +58725,7 @@ var init_skill_local_flow = __esm({
58614
58725
  objectKind: "manifest"
58615
58726
  });
58616
58727
  const chainMetadata = Object.fromEntries(
58617
- Object.entries(request2).filter(([key]) => key !== "sourceKind" && key !== "contentMode" && key !== "summary")
58728
+ Object.entries(request2).filter(([key]) => key !== "sourceKind" && key !== "contentMode" && key !== "summary" && key !== "sourceLocale")
58618
58729
  );
58619
58730
  const createRequest = {
58620
58731
  action: "createSkill",
@@ -63712,7 +63823,7 @@ function textValue(value, name, allowEmpty = false) {
63712
63823
  return value;
63713
63824
  }
63714
63825
  function resolveSkillViemChain(chainId) {
63715
- const chain = [mainnet, optimism, bsc, base2, arbitrum, avalanche, baseSepolia].find((candidate) => candidate.id === chainId);
63826
+ const chain = [mainnet, optimism, bsc, base2, arbitrum, avalanche, injective, baseSepolia].find((candidate) => candidate.id === chainId);
63716
63827
  if (chain !== void 0) return chain;
63717
63828
  throw new TypeError(`Unsupported Skill chain ${String(chainId)}.`);
63718
63829
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@finchtech/cli",
3
- "version": "0.5.3",
3
+ "version": "0.5.4",
4
4
  "description": "Finch Agent CLI for wallet custody, Session-owned execution, and MCP OAuth approval.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -36,11 +36,11 @@
36
36
  "typescript-eslint": "8.67.0",
37
37
  "viem": "2.55.15",
38
38
  "vitest": "4.1.10",
39
- "@finch/deployment-manifest": "0.1.0",
40
39
  "@finch/agent-market-contracts": "0.1.0",
41
- "@finch/task-market-contracts": "0.1.0",
40
+ "@finch/deployment-manifest": "0.1.0",
42
41
  "@finch/skill-market-contracts": "0.1.0",
43
- "@finch/skill-content": "0.1.0"
42
+ "@finch/skill-content": "0.1.0",
43
+ "@finch/task-market-contracts": "0.1.0"
44
44
  },
45
45
  "scripts": {
46
46
  "build": "esbuild src/bootstrap.ts --bundle --platform=node --format=esm --target=node20 --outfile=dist/finch.js --banner:js=\"import { createRequire as createBundleRequire } from 'node:module'; const require = createBundleRequire(import.meta.url);\"",