image-skill 0.1.63 → 0.1.65

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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,26 @@ This changelog tracks the public `image-skill` CLI package and public skill
4
4
  mirror. The npm package metadata remains the authority for tarball integrity and
5
5
  provenance; this file is the human- and agent-readable release map.
6
6
 
7
+ ## 0.1.65 - 2026-06-17
8
+
9
+ - Release (activation/self-fund): make hosted create/edit success
10
+ `data.quota.top_up` and `data.next_actions.self_fund` commands copy-runnable
11
+ from the public CLI, so near-wall agents can move from a successful media
12
+ response into the same zero-setup `npx image-skill@latest` top-up path as
13
+ quota reads and quota errors. No payment caps, wallet action, provider spend,
14
+ hosted deploy, or production write changed in this release bump.
15
+
16
+ ## 0.1.64 - 2026-06-17
17
+
18
+ - Release (activation/self-fund): publish the hosted success-surface
19
+ `data.next_actions.self_fund` visibility payload under an unpublished package
20
+ version so `image-skill@latest` can expose the no-spend self-fund first
21
+ command whenever hosted quota reports top-up availability. `recommended` and
22
+ urgency remain priority signals; availability controls whether the action is
23
+ visible. No payment caps, auth semantics, provider routing, wallet action,
24
+ provider spend, media spend, hosted deploy, or production write changed in
25
+ this release bump.
26
+
7
27
  ## 0.1.63 - 2026-06-17
8
28
 
9
29
  - Release (activation/self-fund): make quota/payment error recovery top-up
package/SKILL.md CHANGED
@@ -284,20 +284,20 @@ image-skill activity show EVENT_OR_JOB_OR_ASSET_OR_FEEDBACK
284
284
  After a successful hosted create/edit, prefer `data.next_actions` when present:
285
285
  `inspect_job` and `inspect_asset` are no-spend recovery commands,
286
286
  `iterate_edit` reuses the asset, and `self_fund` promotes a copy-runnable
287
- top-up quote command when `quota.top_up.recommended` is true. That handoff
288
- mirrors top-up `urgency`, `urgency_score`, and `urgency_reasons`, and exposes
289
- `first_safe_command` plus `first_safe_command_effect` for no-spend rail
290
- inspection before quote/buy. Its `quote_command` omits `--idempotency-key`; the
291
- public CLI generates and returns one for retry safety. Use `jobs show` or
292
- `jobs wait` for
287
+ top-up quote command when `quota.top_up.available` is true. Its `recommended`
288
+ flag and mirrored top-up `urgency`, `urgency_score`, and `urgency_reasons` say
289
+ whether the agent should act now, while `first_safe_command` plus
290
+ `first_safe_command_effect` support no-spend rail inspection before quote/buy.
291
+ Its `quote_command` omits `--idempotency-key`; the public CLI generates and
292
+ returns one for retry safety. Use `jobs show` or `jobs wait` for
293
293
  operational job state, final assets, and retry judgment. Use `activity` for
294
294
  audit trail context (recent jobs, assets, usage events, feedback acceptance,
295
295
  trace IDs, status changes) you can cite in feedback. `activity list/show` may
296
- also return `data.next_actions.self_fund` with the same urgency and no-spend
297
- inspection handoff when the ledger proves generated work and quota says top-up
298
- setup is recommended. `assets show` and hosted asset-id `assets get` may return
299
- the same `data.next_actions.self_fund` after generated work, so downloading or
300
- inspecting the asset does not hide the funding setup path.
296
+ also return `data.next_actions.self_fund` with the same recommendation, urgency,
297
+ and no-spend inspection handoff when the ledger proves generated work and quota
298
+ exposes an available top-up path. `assets show` and hosted asset-id `assets get`
299
+ may return the same `data.next_actions.self_fund` after generated work, so
300
+ downloading or inspecting the asset does not hide the funding setup path.
301
301
  **Do not use `activity` as a wait or recovery command.** Activity is the ledger,
302
302
  not the work queue.
303
303
 
@@ -15,7 +15,7 @@ import { Readable } from "node:stream";
15
15
  import { pipeline } from "node:stream/promises";
16
16
  import os from "node:os";
17
17
 
18
- const VERSION = "0.1.63";
18
+ const VERSION = "0.1.65";
19
19
  const PACKAGE_NAME = "image-skill";
20
20
  const DEFAULT_API_BASE_URL = "https://api.image-skill.com";
21
21
  const DEFAULT_DOCS_BASE_URL = "https://image-skill.com";
@@ -2829,14 +2829,38 @@ function withCopyRunnablePaymentNextActionCommands(result, commandPrefix) {
2829
2829
  }
2830
2830
 
2831
2831
  function paymentNextActionsWithCopyRunnableCommands(data, commandPrefix) {
2832
+ let changed = false;
2833
+ let updated = data;
2834
+
2835
+ if (
2836
+ data.quota !== null &&
2837
+ typeof data.quota === "object" &&
2838
+ !Array.isArray(data.quota) &&
2839
+ data.quota.top_up !== null &&
2840
+ typeof data.quota.top_up === "object" &&
2841
+ !Array.isArray(data.quota.top_up)
2842
+ ) {
2843
+ updated = {
2844
+ ...updated,
2845
+ quota: {
2846
+ ...data.quota,
2847
+ top_up: quotaTopUpWithCopyRunnableCommands(
2848
+ data.quota.top_up,
2849
+ commandPrefix,
2850
+ ),
2851
+ },
2852
+ };
2853
+ changed = true;
2854
+ }
2855
+
2832
2856
  if (
2833
2857
  data.next_actions === null ||
2834
2858
  typeof data.next_actions !== "object" ||
2835
2859
  Array.isArray(data.next_actions)
2836
2860
  ) {
2837
- return data;
2861
+ return changed ? updated : data;
2838
2862
  }
2839
- let changed = false;
2863
+
2840
2864
  const nextActions = { ...data.next_actions };
2841
2865
 
2842
2866
  if (
@@ -2893,7 +2917,18 @@ function paymentNextActionsWithCopyRunnableCommands(data, commandPrefix) {
2893
2917
  nextActions.recommended_settlement = recommendedSettlement;
2894
2918
  }
2895
2919
 
2896
- return changed ? { ...data, next_actions: nextActions } : data;
2920
+ if (
2921
+ nextActions.self_fund !== null &&
2922
+ typeof nextActions.self_fund === "object" &&
2923
+ !Array.isArray(nextActions.self_fund)
2924
+ ) {
2925
+ const selfFund = { ...nextActions.self_fund };
2926
+ changed =
2927
+ renderSelfFundActionCommandFields(selfFund, commandPrefix) || changed;
2928
+ nextActions.self_fund = selfFund;
2929
+ }
2930
+
2931
+ return changed ? { ...updated, next_actions: nextActions } : data;
2897
2932
  }
2898
2933
 
2899
2934
  function renderPaymentActionCommandField(record, field, commandPrefix) {
@@ -2911,6 +2946,57 @@ function renderPaymentActionCommandField(record, field, commandPrefix) {
2911
2946
  return true;
2912
2947
  }
2913
2948
 
2949
+ function renderSelfFundActionCommandFields(record, commandPrefix) {
2950
+ let changed = false;
2951
+ for (const field of [
2952
+ "first_safe_command",
2953
+ "inspect_methods_command",
2954
+ "inspect_packs_command",
2955
+ "quote_command",
2956
+ "buy_command",
2957
+ "status_command",
2958
+ "fallback_quote_command",
2959
+ "fallback_buy_command",
2960
+ ]) {
2961
+ changed =
2962
+ renderPaymentActionCommandField(record, field, commandPrefix) || changed;
2963
+ }
2964
+
2965
+ if (
2966
+ record.workflow !== null &&
2967
+ typeof record.workflow === "object" &&
2968
+ !Array.isArray(record.workflow) &&
2969
+ Array.isArray(record.workflow.steps)
2970
+ ) {
2971
+ let workflowChanged = false;
2972
+ const steps = record.workflow.steps.map((step) => {
2973
+ if (
2974
+ step === null ||
2975
+ typeof step !== "object" ||
2976
+ Array.isArray(step) ||
2977
+ typeof step.command !== "string"
2978
+ ) {
2979
+ return step;
2980
+ }
2981
+ const command = renderCopyRunnablePaymentCommand(
2982
+ commandPrefix,
2983
+ step.command,
2984
+ );
2985
+ if (command === step.command) {
2986
+ return step;
2987
+ }
2988
+ workflowChanged = true;
2989
+ return { ...step, command };
2990
+ });
2991
+ if (workflowChanged) {
2992
+ record.workflow = { ...record.workflow, steps };
2993
+ changed = true;
2994
+ }
2995
+ }
2996
+
2997
+ return changed;
2998
+ }
2999
+
2914
3000
  function creditQuoteWithCopyRunnableCommands(quote, commandPrefix) {
2915
3001
  const recommendedBuy =
2916
3002
  quote.next_actions?.recommended_buy !== null &&
@@ -4057,50 +4143,56 @@ async function create(argv) {
4057
4143
  argv,
4058
4144
  })
4059
4145
  : null;
4060
- const result = withCopyRunnableQuotaRecoveryCommands(
4061
- await apiRequest({
4062
- command: "image-skill create",
4063
- method: "POST",
4064
- apiBaseUrl: apiBase(args),
4065
- path: "/v1/create",
4066
- ...(token.token === null ? {} : { token: token.token }),
4067
- body: {
4068
- prompt: prompt.value,
4069
- ...(flagString(args, "provider") === null
4070
- ? {}
4071
- : { provider: flagString(args, "provider") }),
4072
- ...(flagString(args, "model") === null
4073
- ? {}
4074
- : { model: flagString(args, "model") }),
4075
- ...(flagString(args, "intent") === null
4076
- ? {}
4077
- : { intent: flagString(args, "intent") }),
4078
- aspect_ratio: flagString(args, "aspect-ratio") ?? "1:1",
4079
- ...(references.references.length === 0
4080
- ? {}
4081
- : { references: references.references }),
4082
- ...(outputCount.value === null
4083
- ? {}
4084
- : { output_count: outputCount.value }),
4085
- ...(flagNumber(args, "max-estimated-usd-per-image") === null
4086
- ? {}
4087
- : {
4088
- max_estimated_usd_per_image: flagNumber(
4089
- args,
4090
- "max-estimated-usd-per-image",
4091
- ),
4092
- }),
4093
- ...(modelParameters.value === null
4094
- ? {}
4095
- : { model_parameters: modelParameters.value }),
4096
- // Retry-safe dedupe (#1228/#1789): a live create always carries a key so a
4097
- // retry (or an interrupted-then-recovered run) dedupes to one charge.
4098
- ...(idempotencyKey === null ? {} : { idempotency_key: idempotencyKey }),
4099
- dry_run: flagBool(args, "dry-run"),
4100
- accept_unknown_cost: flagBool(args, "accept-unknown-cost"),
4101
- },
4102
- }),
4103
- createGuideCommandPrefix(),
4146
+ const commandPrefix = createGuideCommandPrefix();
4147
+ const result = withCopyRunnablePaymentNextActionCommands(
4148
+ withCopyRunnableQuotaRecoveryCommands(
4149
+ await apiRequest({
4150
+ command: "image-skill create",
4151
+ method: "POST",
4152
+ apiBaseUrl: apiBase(args),
4153
+ path: "/v1/create",
4154
+ ...(token.token === null ? {} : { token: token.token }),
4155
+ body: {
4156
+ prompt: prompt.value,
4157
+ ...(flagString(args, "provider") === null
4158
+ ? {}
4159
+ : { provider: flagString(args, "provider") }),
4160
+ ...(flagString(args, "model") === null
4161
+ ? {}
4162
+ : { model: flagString(args, "model") }),
4163
+ ...(flagString(args, "intent") === null
4164
+ ? {}
4165
+ : { intent: flagString(args, "intent") }),
4166
+ aspect_ratio: flagString(args, "aspect-ratio") ?? "1:1",
4167
+ ...(references.references.length === 0
4168
+ ? {}
4169
+ : { references: references.references }),
4170
+ ...(outputCount.value === null
4171
+ ? {}
4172
+ : { output_count: outputCount.value }),
4173
+ ...(flagNumber(args, "max-estimated-usd-per-image") === null
4174
+ ? {}
4175
+ : {
4176
+ max_estimated_usd_per_image: flagNumber(
4177
+ args,
4178
+ "max-estimated-usd-per-image",
4179
+ ),
4180
+ }),
4181
+ ...(modelParameters.value === null
4182
+ ? {}
4183
+ : { model_parameters: modelParameters.value }),
4184
+ // Retry-safe dedupe (#1228/#1789): a live create always carries a key so a
4185
+ // retry (or an interrupted-then-recovered run) dedupes to one charge.
4186
+ ...(idempotencyKey === null
4187
+ ? {}
4188
+ : { idempotency_key: idempotencyKey }),
4189
+ dry_run: flagBool(args, "dry-run"),
4190
+ accept_unknown_cost: flagBool(args, "accept-unknown-cost"),
4191
+ },
4192
+ }),
4193
+ commandPrefix,
4194
+ ),
4195
+ commandPrefix,
4104
4196
  );
4105
4197
  await clearInFlightSpendForResult(inFlight, result);
4106
4198
  return result;
@@ -4194,47 +4286,55 @@ async function edit(argv) {
4194
4286
  argv,
4195
4287
  })
4196
4288
  : null;
4197
- const result = withCopyRunnableQuotaRecoveryCommands(
4198
- await apiRequest({
4199
- command: "image-skill edit",
4200
- method: "POST",
4201
- apiBaseUrl: apiBase(args),
4202
- path: "/v1/edit",
4203
- token: token.token,
4204
- body: {
4205
- input_asset_id: assetId.assetId,
4206
- ...(maskAssetId === null ? {} : { mask_asset_id: maskAssetId.assetId }),
4207
- ...(references.references.length === 0
4208
- ? {}
4209
- : { references: references.references }),
4210
- ...(prompt.value.length === 0 ? {} : { prompt: prompt.value }),
4211
- ...(flagString(args, "provider") === null
4212
- ? {}
4213
- : { provider: flagString(args, "provider") }),
4214
- ...(modelId === null ? {} : { model: modelId }),
4215
- ...(flagString(args, "intent") === null
4216
- ? {}
4217
- : { intent: flagString(args, "intent") }),
4218
- aspect_ratio: flagString(args, "aspect-ratio") ?? "auto",
4219
- ...(flagNumber(args, "max-estimated-usd-per-image") === null
4220
- ? {}
4221
- : {
4222
- max_estimated_usd_per_image: flagNumber(
4223
- args,
4224
- "max-estimated-usd-per-image",
4225
- ),
4226
- }),
4227
- ...(modelParameters.value === null
4228
- ? {}
4229
- : { model_parameters: modelParameters.value }),
4230
- ...(flagBool(args, "dry-run") ? { dry_run: true } : {}),
4231
- // Retry-safe dedupe (#1228/#1789): a live edit always carries a key so a
4232
- // retry (or an interrupted-then-recovered run) dedupes to one charge.
4233
- ...(idempotencyKey === null ? {} : { idempotency_key: idempotencyKey }),
4234
- accept_unknown_cost: flagBool(args, "accept-unknown-cost"),
4235
- },
4236
- }),
4237
- createGuideCommandPrefix(),
4289
+ const commandPrefix = createGuideCommandPrefix();
4290
+ const result = withCopyRunnablePaymentNextActionCommands(
4291
+ withCopyRunnableQuotaRecoveryCommands(
4292
+ await apiRequest({
4293
+ command: "image-skill edit",
4294
+ method: "POST",
4295
+ apiBaseUrl: apiBase(args),
4296
+ path: "/v1/edit",
4297
+ token: token.token,
4298
+ body: {
4299
+ input_asset_id: assetId.assetId,
4300
+ ...(maskAssetId === null
4301
+ ? {}
4302
+ : { mask_asset_id: maskAssetId.assetId }),
4303
+ ...(references.references.length === 0
4304
+ ? {}
4305
+ : { references: references.references }),
4306
+ ...(prompt.value.length === 0 ? {} : { prompt: prompt.value }),
4307
+ ...(flagString(args, "provider") === null
4308
+ ? {}
4309
+ : { provider: flagString(args, "provider") }),
4310
+ ...(modelId === null ? {} : { model: modelId }),
4311
+ ...(flagString(args, "intent") === null
4312
+ ? {}
4313
+ : { intent: flagString(args, "intent") }),
4314
+ aspect_ratio: flagString(args, "aspect-ratio") ?? "auto",
4315
+ ...(flagNumber(args, "max-estimated-usd-per-image") === null
4316
+ ? {}
4317
+ : {
4318
+ max_estimated_usd_per_image: flagNumber(
4319
+ args,
4320
+ "max-estimated-usd-per-image",
4321
+ ),
4322
+ }),
4323
+ ...(modelParameters.value === null
4324
+ ? {}
4325
+ : { model_parameters: modelParameters.value }),
4326
+ ...(flagBool(args, "dry-run") ? { dry_run: true } : {}),
4327
+ // Retry-safe dedupe (#1228/#1789): a live edit always carries a key so a
4328
+ // retry (or an interrupted-then-recovered run) dedupes to one charge.
4329
+ ...(idempotencyKey === null
4330
+ ? {}
4331
+ : { idempotency_key: idempotencyKey }),
4332
+ accept_unknown_cost: flagBool(args, "accept-unknown-cost"),
4333
+ },
4334
+ }),
4335
+ commandPrefix,
4336
+ ),
4337
+ commandPrefix,
4238
4338
  );
4239
4339
  await clearInFlightSpendForResult(inFlight, result);
4240
4340
  return result;
@@ -4259,22 +4359,28 @@ async function assets(argv) {
4259
4359
  return token.result;
4260
4360
  }
4261
4361
  if (subcommand === "show") {
4262
- return apiRequest({
4263
- command: "image-skill assets show",
4264
- method: "GET",
4265
- apiBaseUrl: apiBase(args),
4266
- path: `/v1/assets/${encodeURIComponent(assetId)}`,
4267
- token: token.token,
4268
- });
4362
+ return withCopyRunnablePaymentNextActionCommands(
4363
+ await apiRequest({
4364
+ command: "image-skill assets show",
4365
+ method: "GET",
4366
+ apiBaseUrl: apiBase(args),
4367
+ path: `/v1/assets/${encodeURIComponent(assetId)}`,
4368
+ token: token.token,
4369
+ }),
4370
+ createGuideCommandPrefix(),
4371
+ );
4269
4372
  }
4270
4373
  if (subcommand === "get") {
4271
- const shown = await apiRequest({
4272
- command: "image-skill assets get",
4273
- method: "GET",
4274
- apiBaseUrl: apiBase(args),
4275
- path: `/v1/assets/${encodeURIComponent(assetId)}`,
4276
- token: token.token,
4277
- });
4374
+ const shown = withCopyRunnablePaymentNextActionCommands(
4375
+ await apiRequest({
4376
+ command: "image-skill assets get",
4377
+ method: "GET",
4378
+ apiBaseUrl: apiBase(args),
4379
+ path: `/v1/assets/${encodeURIComponent(assetId)}`,
4380
+ token: token.token,
4381
+ }),
4382
+ createGuideCommandPrefix(),
4383
+ );
4278
4384
  if (!shown.envelope.ok) {
4279
4385
  return shown;
4280
4386
  }
@@ -4315,26 +4421,32 @@ async function jobs(argv) {
4315
4421
  return token.result;
4316
4422
  }
4317
4423
  if (subcommand === "show") {
4318
- return apiRequest({
4319
- command: "image-skill jobs show",
4320
- method: "GET",
4321
- apiBaseUrl: apiBase(args),
4322
- path: `/v1/jobs/${encodeURIComponent(jobId)}`,
4323
- token: token.token,
4324
- });
4424
+ return withCopyRunnablePaymentNextActionCommands(
4425
+ await apiRequest({
4426
+ command: "image-skill jobs show",
4427
+ method: "GET",
4428
+ apiBaseUrl: apiBase(args),
4429
+ path: `/v1/jobs/${encodeURIComponent(jobId)}`,
4430
+ token: token.token,
4431
+ }),
4432
+ createGuideCommandPrefix(),
4433
+ );
4325
4434
  }
4326
4435
  if (subcommand === "wait") {
4327
4436
  const timeoutMs = flagNumber(args, "timeout-ms") ?? 30_000;
4328
4437
  const pollIntervalMs = flagNumber(args, "poll-interval-ms") ?? 1_000;
4329
4438
  const started = Date.now();
4330
4439
  while (Date.now() - started <= timeoutMs) {
4331
- const current = await apiRequest({
4332
- command: "image-skill jobs wait",
4333
- method: "GET",
4334
- apiBaseUrl: apiBase(args),
4335
- path: `/v1/jobs/${encodeURIComponent(jobId)}`,
4336
- token: token.token,
4337
- });
4440
+ const current = withCopyRunnablePaymentNextActionCommands(
4441
+ await apiRequest({
4442
+ command: "image-skill jobs wait",
4443
+ method: "GET",
4444
+ apiBaseUrl: apiBase(args),
4445
+ path: `/v1/jobs/${encodeURIComponent(jobId)}`,
4446
+ token: token.token,
4447
+ }),
4448
+ createGuideCommandPrefix(),
4449
+ );
4338
4450
  if (!current.envelope.ok) {
4339
4451
  return current;
4340
4452
  }
@@ -4380,13 +4492,16 @@ async function activity(argv) {
4380
4492
  "activity show requires REFERENCE",
4381
4493
  );
4382
4494
  }
4383
- return apiRequest({
4384
- command: "image-skill activity show",
4385
- method: "GET",
4386
- apiBaseUrl: apiBase(args),
4387
- path: `/v1/activity/${encodeURIComponent(reference)}`,
4388
- token: token.token,
4389
- });
4495
+ return withCopyRunnablePaymentNextActionCommands(
4496
+ await apiRequest({
4497
+ command: "image-skill activity show",
4498
+ method: "GET",
4499
+ apiBaseUrl: apiBase(args),
4500
+ path: `/v1/activity/${encodeURIComponent(reference)}`,
4501
+ token: token.token,
4502
+ }),
4503
+ createGuideCommandPrefix(),
4504
+ );
4390
4505
  }
4391
4506
  if (subcommand === "list") {
4392
4507
  const query = new URLSearchParams();
@@ -4398,13 +4513,16 @@ async function activity(argv) {
4398
4513
  if (subject !== null) {
4399
4514
  query.set("subject", subject);
4400
4515
  }
4401
- return apiRequest({
4402
- command: "image-skill activity list",
4403
- method: "GET",
4404
- apiBaseUrl: apiBase(args),
4405
- path: `/v1/activity${query.size > 0 ? `?${query.toString()}` : ""}`,
4406
- token: token.token,
4407
- });
4516
+ return withCopyRunnablePaymentNextActionCommands(
4517
+ await apiRequest({
4518
+ command: "image-skill activity list",
4519
+ method: "GET",
4520
+ apiBaseUrl: apiBase(args),
4521
+ path: `/v1/activity${query.size > 0 ? `?${query.toString()}` : ""}`,
4522
+ token: token.token,
4523
+ }),
4524
+ createGuideCommandPrefix(),
4525
+ );
4408
4526
  }
4409
4527
  return invalid("image-skill activity", "activity requires list or show");
4410
4528
  }
package/cli.md CHANGED
@@ -1603,14 +1603,15 @@ include a new generated asset URL, job id, safety state, quota consumption, and
1603
1603
  input asset metadata where
1604
1604
  applicable. Responses do not include raw prompts, source bytes, base64
1605
1605
  payloads, local paths, full external URLs, bucket names, or object keys.
1606
- When `quota.top_up.recommended` is true, `next_actions.self_fund.quote_command`
1607
- is a copy-runnable top-up quote command. `next_actions.self_fund` also mirrors
1608
- top-up `urgency`, `urgency_score`, and `urgency_reasons`, and exposes
1609
- `first_safe_command`, `first_safe_command_effect`, `inspect_methods_command`,
1610
- and `inspect_packs_command` for no-spend payment rail inspection before
1611
- quote/buy. The quote command omits `--idempotency-key` so the public CLI
1612
- generates and returns one for retry safety before the agent follows the quote
1613
- response into `credits buy` and `credits status`.
1606
+ When `quota.top_up.available` is true, `next_actions.self_fund.quote_command`
1607
+ is a copy-runnable top-up quote command. `next_actions.self_fund.recommended`
1608
+ and the mirrored top-up `urgency`, `urgency_score`, and `urgency_reasons` say
1609
+ whether the agent should act now. The handoff exposes `first_safe_command`,
1610
+ `first_safe_command_effect`, `inspect_methods_command`, and
1611
+ `inspect_packs_command` for no-spend payment rail inspection before quote/buy.
1612
+ The quote command omits `--idempotency-key` so the public CLI generates and
1613
+ returns one for retry safety before the agent follows the quote response into
1614
+ `credits buy` and `credits status`.
1614
1615
 
1615
1616
  Provider/model names in this paragraph are preview provenance, not the primary
1616
1617
  public UX. The public selection surface should be Image Skill capabilities and
@@ -1665,9 +1666,10 @@ Minimum success data:
1665
1666
  External URLs are rejected. Older assets created before hosted asset metadata
1666
1667
  was recorded may still be inspectable by Image Skill-owned URL.
1667
1668
 
1668
- For hosted generated assets, when quota says top-up setup is recommended,
1669
- `data.next_actions.self_fund` mirrors the top-up urgency and no-spend payment
1670
- rail inspection handoff used by create/edit, jobs, and activity responses.
1669
+ For hosted generated assets, when quota exposes an available top-up path,
1670
+ `data.next_actions.self_fund` mirrors the top-up recommendation, urgency, and
1671
+ no-spend payment rail inspection handoff used by create/edit, jobs, and
1672
+ activity responses.
1671
1673
 
1672
1674
  ### `image-skill assets get`
1673
1675
 
@@ -1755,10 +1757,10 @@ related job IDs, asset IDs, usage IDs, feedback IDs, trace IDs, status changes,
1755
1757
  and product-memory writes. Use `jobs show` or `jobs wait` when you need
1756
1758
  operational recovery, polling, retry judgment, or final job assets.
1757
1759
 
1758
- When the ledger proves generated work and current quota says top-up setup is
1759
- recommended, `data.next_actions.self_fund` mirrors the same urgency and
1760
- no-spend payment-method inspection handoff returned by successful create/edit
1761
- and `jobs show`.
1760
+ When the ledger proves generated work and current quota exposes an available
1761
+ top-up path, `data.next_actions.self_fund` mirrors the same recommendation,
1762
+ urgency, and no-spend payment-method inspection handoff returned by successful
1763
+ create/edit and `jobs show`.
1762
1764
 
1763
1765
  Minimum success data:
1764
1766
 
@@ -1816,9 +1818,10 @@ image-skill activity show sig_... --json
1816
1818
  `activity show` accepts activity event IDs plus job, asset, usage, feedback, and
1817
1819
  trace references. When the reference is a subject rather than one exact event,
1818
1820
  the response includes matching ledger events so an agent can cite the right
1819
- event without reading telemetry logs. When current quota recommends top-up
1820
- setup after generated work, `data.next_actions.self_fund.first_safe_command`
1821
- is the no-spend rail inspection command to run before any quote/buy step.
1821
+ event without reading telemetry logs. When current quota exposes top-up
1822
+ availability after generated work,
1823
+ `data.next_actions.self_fund.first_safe_command` is the no-spend rail
1824
+ inspection command to run before any quote/buy step.
1822
1825
 
1823
1826
  Hosted API equivalent:
1824
1827
 
package/llms.txt CHANGED
@@ -62,10 +62,10 @@ First-run guide loop:
62
62
  2. Read data.guide_warning, then follow data.next_command when its next_command_safety is safe for the current spend policy. Prefer data.guide_recovery for no-doc recovery: data.guide_recovery.no_spend_command_field and data.guide_recovery.no_spend_command name the safest no-spend command, data.guide_recovery.live_create_command_field and data.guide_recovery.live_payment_command_field name fields that would spend, and data.guide_recovery.double_spend_guard tells you when to check error.recovery, jobs, activity, or payment status before any live retry. Do not run doctor, models list, signup, whoami, quota, dry-run, or payment commands as a setup checklist before the guide asks for them.
63
63
  3. If data.stage is prompt_required, rerun data.next_command with the real prompt.
64
64
  4. If data.stage is auth_required, data.auth_ready.ready is false and data.guide_warning.next_command_safety is hosted_signup_no_spend_setup. Run data.next_command, then rerun the guide once. Hosted signup saves the restricted token to the public CLI config by default with 0600 permissions. If the configured config path is blocked, data.next_command sets IMAGE_SKILL_CONFIG_PATH="$PWD/.image-skill/config.json" and still runs a saved-config signup; do not switch to raw-token handoff unless recovery explicitly requires it. If the runtime intentionally uses --no-save --show-token, store the returned token in the agent runtime secret store, then rerun with IMAGE_SKILL_TOKEN or --token-stdin; data.auth_handoff.rerun_guide.with_env and data.auth_handoff.rerun_guide.with_stdin are copy-safe templates for that mode. Signup is anonymous by default: no contact inbox is required to get a restricted token. The optional --agent-contact flag takes an email-shaped durable contact inbox for the restricted agent identity, not a requirement to find an individual human; attach one later with image-skill claim request --contact INBOX --json when funding or durability makes it worth having. Hosted signup returns the raw restricted token only when --show-token is set, and only once. When providing a contact, use an agent-owned inbox when available; otherwise use an operator, team, or sponsor inbox that can receive future claim, billing, or abuse notices. Never invent an inbox or borrow an unrelated human email just to fill the flag — omit it instead. example.invalid addresses are only appropriate inside documented harness or proof runs. --human-email remains accepted as a compatibility alias, but the guide must not teach it. Anonymous signups mint a fresh agent identity on every call; reuse the saved config instead of re-running signup. --save is accepted as a compatibility no-op for the default save behavior; use --no-save only when the runtime has a separate secret store and does not want local config.
65
- 5. At any guide stage, read data.checks.quota.top_up. When recommended is true, it includes recommendation_reason, preferred_payment_method, quote_command, quote_command_copy_runnable, quote_command_effect, and quote/buy/status command templates for the browserless x402 top-up path. On quota/payment recovery errors, read error.recovery.top_up: when delegated live-money quoting is allowed, prefer error.recovery.top_up.quote_command to open the top-up path, and use error.recovery.suggested_command for no-spend payment-method inspection. If data.stage is quota_required, data.guide_warning.next_command_safety is live_money_payment_action and data.guide_warning.payment_top_up_path summarizes the live-money path. Run data.self_fund_next_command to start the top-up. It aliases data.next_command and is the first payment command, usually an x402 or Stripe quote. First read data.checks.payments.preferred_method_summary.top_up_path: browserless_agent_self_fund means a wallet-equipped agent can complete the preferred live-money rail without a browser; human_payment_handoff means the agent can create the payment attempt but a human/browser step must complete before credits are granted. If the guide authenticated from env or stdin, prefer data.self_fund_handoff.auth.next_command.with_env or data.self_fund_handoff.auth.next_command.with_stdin so auth follows the payment command. Then follow data.self_fund_handoff.payment_commands.buy and status, and rerun data.self_fund_handoff.after_next once credits are granted. If data.stage is ready_to_create, inspect data.self_fund_preparation before consuming the remaining free allowance. When available and recommended are true, data.self_fund_preparation.quote_command is the pre-wall browserless x402 quote: it creates an authenticated live-money quote/payment object, but data.self_fund_preparation.quote_command_effect must show no provider call, no hosted create, no credit debit, no media write, and no wallet settlement until a later buy/payment step. One Image Skill credit is $0.01. Credit quotes grant prepaid value units; create/edit operations debit model-priced credits reported as cost.credit_pricing. Starter preview currently gives bounded free-preview credits plus a four-job daily cap.
65
+ 5. At any guide stage, read data.checks.quota.top_up. When available is true, it includes recommended, recommendation_reason, preferred_payment_method, quote_command, quote_command_copy_runnable, quote_command_effect, and quote/buy/status command templates for the browserless x402 top-up path; recommended and urgency say whether to act now. On quota/payment recovery errors, read error.recovery.top_up: when delegated live-money quoting is allowed, prefer error.recovery.top_up.quote_command to open the top-up path, and use error.recovery.suggested_command for no-spend payment-method inspection. If data.stage is quota_required, data.guide_warning.next_command_safety is live_money_payment_action and data.guide_warning.payment_top_up_path summarizes the live-money path. Run data.self_fund_next_command to start the top-up. It aliases data.next_command and is the first payment command, usually an x402 or Stripe quote. First read data.checks.payments.preferred_method_summary.top_up_path: browserless_agent_self_fund means a wallet-equipped agent can complete the preferred live-money rail without a browser; human_payment_handoff means the agent can create the payment attempt but a human/browser step must complete before credits are granted. If the guide authenticated from env or stdin, prefer data.self_fund_handoff.auth.next_command.with_env or data.self_fund_handoff.auth.next_command.with_stdin so auth follows the payment command. Then follow data.self_fund_handoff.payment_commands.buy and status, and rerun data.self_fund_handoff.after_next once credits are granted. If data.stage is ready_to_create, inspect data.self_fund_preparation before consuming the remaining free allowance. When available and recommended are true, data.self_fund_preparation.quote_command is the pre-wall browserless x402 quote: it creates an authenticated live-money quote/payment object, but data.self_fund_preparation.quote_command_effect must show no provider call, no hosted create, no credit debit, no media write, and no wallet settlement until a later buy/payment step. One Image Skill credit is $0.01. Credit quotes grant prepaid value units; create/edit operations debit model-priced credits reported as cost.credit_pricing. Starter preview currently gives bounded free-preview credits plus a four-job daily cap.
66
66
  5a. When data.stage is quota_required, data.self_fund_handoff mirrors top-up urgency, urgency_score, and urgency_reasons, and exposes first_safe_command plus first_safe_command_effect. Run first_safe_command, usually image-skill credits methods --json, for no-spend rail inspection before quote/buy when delegated spend authority is absent or unclear.
67
67
  6. If data.stage is ready_to_create, data.next_command is the first bounded live create. data.guide_warning.next_command_safety must be live_media_create_credit_debit, data.guide_warning.no_spend_safe must be false, data.guide_warning.spend_required must be true, and data.guide_warning.recommended_command_field must be recommended_no_spend_command. data.auth_ready.ready and data.auth_ready.next_command_auth_ready must be true; data.auth_ready.next_command_requires_auth must be true, and the command can reuse saved config, IMAGE_SKILL_TOKEN, or --token-stdin context without exposing a raw token. data.next_command_effect.label must be live_media_create_credit_debit and its provider_call, hosted_create, credit_debit, and media_write flags are true. data.no_spend_evaluation.stop_here must be true, data.no_spend_evaluation.next_command_is_live_create must be true, and data.no_spend_evaluation.recommended_command_field must be recommended_no_spend_command. Run data.next_command only when media spend is allowed. In no-spend evaluations, or when you only need to prove readiness without media/provider work, stop before data.next_command and run data.recommended_no_spend_command instead. data.recommended_no_spend_command must equal data.no_spend_next_command. data.no_spend_next_command_effect.label must be dry_run_planned_job_no_provider_call_no_credit_debit_no_media_write: no_spend, hosted_create_dry_run, planned_job, and plan_receipt are true; activity_event is job.planned; provider_call, credit_debit, and media_write are false. This dry-run may create a recoverable planned job/activity receipt but no provider execution, debit, downloadable asset, or media write. If the guide authenticated from env or stdin, prefer data.auth_handoff.next_command.with_env or data.auth_handoff.next_command.with_stdin so auth follows the live create. In guide cost output, cost.estimated_usd_per_image and cost.estimated_debit_usd_per_image are the Image Skill debit dollars for one output; cost.estimated_provider_usd_per_image is only the upstream provider estimate. Use the guide's returned max_estimated_usd_per_image because it is sized to the credit debit the agent funds. Add --output-count N only after models show confirms the selected create model supports more than one output; credit_pricing.credits_required is the total debit across outputs, while max_estimated_usd_per_image remains a per-image Image Skill debit guard.
68
- 7. After create, prefer data.next_actions when present: inspect_job and inspect_asset are copy-runnable no-spend recovery commands, iterate_edit is the reusable-asset edit template, and self_fund is the promoted top-up quote handoff when quota.top_up.recommended is true. self_fund mirrors urgency, urgency_score, and urgency_reasons, and exposes first_safe_command plus first_safe_command_effect for no-spend rail inspection before quote/buy. self_fund.quote_command is copy-runnable and omits --idempotency-key so the public CLI generates and returns one for retry safety; follow the quote response into buy/status. Otherwise use image-skill jobs show JOB_ID to recover status, cost, safety, timestamps, and final assets; image-skill assets get ASSET_URL_OR_ID --output ./result.png to fetch the generated asset without repeating provider work; and image-skill activity list --subject JOB_ID to find ledger events, trace, usage, asset links, and any data.next_actions.self_fund handoff to cite or follow. Hosted asset-id assets show/get may also return data.next_actions.self_fund after generated work, so inspect that field before ending the session.
68
+ 7. After create, prefer data.next_actions when present: inspect_job and inspect_asset are copy-runnable no-spend recovery commands, iterate_edit is the reusable-asset edit template, and self_fund is the promoted top-up quote handoff when quota.top_up.available is true. self_fund.recommended plus urgency, urgency_score, and urgency_reasons say whether to act now, and self_fund exposes first_safe_command plus first_safe_command_effect for no-spend rail inspection before quote/buy. self_fund.quote_command is copy-runnable and omits --idempotency-key so the public CLI generates and returns one for retry safety; follow the quote response into buy/status. Otherwise use image-skill jobs show JOB_ID to recover status, cost, safety, timestamps, and final assets; image-skill assets get ASSET_URL_OR_ID --output ./result.png to fetch the generated asset without repeating provider work; and image-skill activity list --subject JOB_ID to find ledger events, trace, usage, asset links, and any data.next_actions.self_fund handoff to cite or follow. Hosted asset-id assets show/get may also return data.next_actions.self_fund after generated work, so inspect that field before ending the session.
69
69
  8. Leave image-skill feedback create if the first-run flow is confusing, blocked, missing an affordance, or easier through a direct provider than through Image Skill. Feedback auth uses saved config from default signup, IMAGE_SKILL_TOKEN, or --token-stdin; if signup or guide already saved config, run feedback create normally and do not copy a raw token. Never paste tokens into feedback title, body, evidence, issues, or logs. Use image-skill activity show FEEDBACK_ID only when you need to confirm the feedback entered the hosted ledger.
70
70
 
71
71
  Manual escape hatches are not prerequisites. Use image-skill doctor, image-skill models list, image-skill models show MODEL_ID, image-skill whoami, image-skill usage quota, image-skill credits methods, image-skill credits packs list, image-skill credits quote, image-skill credits buy, image-skill credits status, image-skill create --dry-run, and image-skill edit --dry-run only when data.next_command or data.escape_hatches asks for them, or when the task genuinely needs deeper capability, quota, payment, or planning detail.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "image-skill",
3
- "version": "0.1.63",
3
+ "version": "0.1.65",
4
4
  "description": "Zero-setup durable creative-media CLI for agents (image + video + audio + 3D): guide-first creation, model and cost inspection, owned URLs, JSON recovery, payments, reusable assets, and feedback.",
5
5
  "type": "module",
6
6
  "private": false,
package/skill.md CHANGED
@@ -284,20 +284,20 @@ image-skill activity show EVENT_OR_JOB_OR_ASSET_OR_FEEDBACK
284
284
  After a successful hosted create/edit, prefer `data.next_actions` when present:
285
285
  `inspect_job` and `inspect_asset` are no-spend recovery commands,
286
286
  `iterate_edit` reuses the asset, and `self_fund` promotes a copy-runnable
287
- top-up quote command when `quota.top_up.recommended` is true. That handoff
288
- mirrors top-up `urgency`, `urgency_score`, and `urgency_reasons`, and exposes
289
- `first_safe_command` plus `first_safe_command_effect` for no-spend rail
290
- inspection before quote/buy. Its `quote_command` omits `--idempotency-key`; the
291
- public CLI generates and returns one for retry safety. Use `jobs show` or
292
- `jobs wait` for
287
+ top-up quote command when `quota.top_up.available` is true. Its `recommended`
288
+ flag and mirrored top-up `urgency`, `urgency_score`, and `urgency_reasons` say
289
+ whether the agent should act now, while `first_safe_command` plus
290
+ `first_safe_command_effect` support no-spend rail inspection before quote/buy.
291
+ Its `quote_command` omits `--idempotency-key`; the public CLI generates and
292
+ returns one for retry safety. Use `jobs show` or `jobs wait` for
293
293
  operational job state, final assets, and retry judgment. Use `activity` for
294
294
  audit trail context (recent jobs, assets, usage events, feedback acceptance,
295
295
  trace IDs, status changes) you can cite in feedback. `activity list/show` may
296
- also return `data.next_actions.self_fund` with the same urgency and no-spend
297
- inspection handoff when the ledger proves generated work and quota says top-up
298
- setup is recommended. `assets show` and hosted asset-id `assets get` may return
299
- the same `data.next_actions.self_fund` after generated work, so downloading or
300
- inspecting the asset does not hide the funding setup path.
296
+ also return `data.next_actions.self_fund` with the same recommendation, urgency,
297
+ and no-spend inspection handoff when the ledger proves generated work and quota
298
+ exposes an available top-up path. `assets show` and hosted asset-id `assets get`
299
+ may return the same `data.next_actions.self_fund` after generated work, so
300
+ downloading or inspecting the asset does not hide the funding setup path.
301
301
  **Do not use `activity` as a wait or recovery command.** Activity is the ledger,
302
302
  not the work queue.
303
303
 
@@ -284,20 +284,20 @@ image-skill activity show EVENT_OR_JOB_OR_ASSET_OR_FEEDBACK
284
284
  After a successful hosted create/edit, prefer `data.next_actions` when present:
285
285
  `inspect_job` and `inspect_asset` are no-spend recovery commands,
286
286
  `iterate_edit` reuses the asset, and `self_fund` promotes a copy-runnable
287
- top-up quote command when `quota.top_up.recommended` is true. That handoff
288
- mirrors top-up `urgency`, `urgency_score`, and `urgency_reasons`, and exposes
289
- `first_safe_command` plus `first_safe_command_effect` for no-spend rail
290
- inspection before quote/buy. Its `quote_command` omits `--idempotency-key`; the
291
- public CLI generates and returns one for retry safety. Use `jobs show` or
292
- `jobs wait` for
287
+ top-up quote command when `quota.top_up.available` is true. Its `recommended`
288
+ flag and mirrored top-up `urgency`, `urgency_score`, and `urgency_reasons` say
289
+ whether the agent should act now, while `first_safe_command` plus
290
+ `first_safe_command_effect` support no-spend rail inspection before quote/buy.
291
+ Its `quote_command` omits `--idempotency-key`; the public CLI generates and
292
+ returns one for retry safety. Use `jobs show` or `jobs wait` for
293
293
  operational job state, final assets, and retry judgment. Use `activity` for
294
294
  audit trail context (recent jobs, assets, usage events, feedback acceptance,
295
295
  trace IDs, status changes) you can cite in feedback. `activity list/show` may
296
- also return `data.next_actions.self_fund` with the same urgency and no-spend
297
- inspection handoff when the ledger proves generated work and quota says top-up
298
- setup is recommended. `assets show` and hosted asset-id `assets get` may return
299
- the same `data.next_actions.self_fund` after generated work, so downloading or
300
- inspecting the asset does not hide the funding setup path.
296
+ also return `data.next_actions.self_fund` with the same recommendation, urgency,
297
+ and no-spend inspection handoff when the ledger proves generated work and quota
298
+ exposes an available top-up path. `assets show` and hosted asset-id `assets get`
299
+ may return the same `data.next_actions.self_fund` after generated work, so
300
+ downloading or inspecting the asset does not hide the funding setup path.
301
301
  **Do not use `activity` as a wait or recovery command.** Activity is the ledger,
302
302
  not the work queue.
303
303
 
@@ -1603,14 +1603,15 @@ include a new generated asset URL, job id, safety state, quota consumption, and
1603
1603
  input asset metadata where
1604
1604
  applicable. Responses do not include raw prompts, source bytes, base64
1605
1605
  payloads, local paths, full external URLs, bucket names, or object keys.
1606
- When `quota.top_up.recommended` is true, `next_actions.self_fund.quote_command`
1607
- is a copy-runnable top-up quote command. `next_actions.self_fund` also mirrors
1608
- top-up `urgency`, `urgency_score`, and `urgency_reasons`, and exposes
1609
- `first_safe_command`, `first_safe_command_effect`, `inspect_methods_command`,
1610
- and `inspect_packs_command` for no-spend payment rail inspection before
1611
- quote/buy. The quote command omits `--idempotency-key` so the public CLI
1612
- generates and returns one for retry safety before the agent follows the quote
1613
- response into `credits buy` and `credits status`.
1606
+ When `quota.top_up.available` is true, `next_actions.self_fund.quote_command`
1607
+ is a copy-runnable top-up quote command. `next_actions.self_fund.recommended`
1608
+ and the mirrored top-up `urgency`, `urgency_score`, and `urgency_reasons` say
1609
+ whether the agent should act now. The handoff exposes `first_safe_command`,
1610
+ `first_safe_command_effect`, `inspect_methods_command`, and
1611
+ `inspect_packs_command` for no-spend payment rail inspection before quote/buy.
1612
+ The quote command omits `--idempotency-key` so the public CLI generates and
1613
+ returns one for retry safety before the agent follows the quote response into
1614
+ `credits buy` and `credits status`.
1614
1615
 
1615
1616
  Provider/model names in this paragraph are preview provenance, not the primary
1616
1617
  public UX. The public selection surface should be Image Skill capabilities and
@@ -1665,9 +1666,10 @@ Minimum success data:
1665
1666
  External URLs are rejected. Older assets created before hosted asset metadata
1666
1667
  was recorded may still be inspectable by Image Skill-owned URL.
1667
1668
 
1668
- For hosted generated assets, when quota says top-up setup is recommended,
1669
- `data.next_actions.self_fund` mirrors the top-up urgency and no-spend payment
1670
- rail inspection handoff used by create/edit, jobs, and activity responses.
1669
+ For hosted generated assets, when quota exposes an available top-up path,
1670
+ `data.next_actions.self_fund` mirrors the top-up recommendation, urgency, and
1671
+ no-spend payment rail inspection handoff used by create/edit, jobs, and
1672
+ activity responses.
1671
1673
 
1672
1674
  ### `image-skill assets get`
1673
1675
 
@@ -1755,10 +1757,10 @@ related job IDs, asset IDs, usage IDs, feedback IDs, trace IDs, status changes,
1755
1757
  and product-memory writes. Use `jobs show` or `jobs wait` when you need
1756
1758
  operational recovery, polling, retry judgment, or final job assets.
1757
1759
 
1758
- When the ledger proves generated work and current quota says top-up setup is
1759
- recommended, `data.next_actions.self_fund` mirrors the same urgency and
1760
- no-spend payment-method inspection handoff returned by successful create/edit
1761
- and `jobs show`.
1760
+ When the ledger proves generated work and current quota exposes an available
1761
+ top-up path, `data.next_actions.self_fund` mirrors the same recommendation,
1762
+ urgency, and no-spend payment-method inspection handoff returned by successful
1763
+ create/edit and `jobs show`.
1762
1764
 
1763
1765
  Minimum success data:
1764
1766
 
@@ -1816,9 +1818,10 @@ image-skill activity show sig_... --json
1816
1818
  `activity show` accepts activity event IDs plus job, asset, usage, feedback, and
1817
1819
  trace references. When the reference is a subject rather than one exact event,
1818
1820
  the response includes matching ledger events so an agent can cite the right
1819
- event without reading telemetry logs. When current quota recommends top-up
1820
- setup after generated work, `data.next_actions.self_fund.first_safe_command`
1821
- is the no-spend rail inspection command to run before any quote/buy step.
1821
+ event without reading telemetry logs. When current quota exposes top-up
1822
+ availability after generated work,
1823
+ `data.next_actions.self_fund.first_safe_command` is the no-spend rail
1824
+ inspection command to run before any quote/buy step.
1822
1825
 
1823
1826
  Hosted API equivalent:
1824
1827
 
@@ -62,10 +62,10 @@ First-run guide loop:
62
62
  2. Read data.guide_warning, then follow data.next_command when its next_command_safety is safe for the current spend policy. Prefer data.guide_recovery for no-doc recovery: data.guide_recovery.no_spend_command_field and data.guide_recovery.no_spend_command name the safest no-spend command, data.guide_recovery.live_create_command_field and data.guide_recovery.live_payment_command_field name fields that would spend, and data.guide_recovery.double_spend_guard tells you when to check error.recovery, jobs, activity, or payment status before any live retry. Do not run doctor, models list, signup, whoami, quota, dry-run, or payment commands as a setup checklist before the guide asks for them.
63
63
  3. If data.stage is prompt_required, rerun data.next_command with the real prompt.
64
64
  4. If data.stage is auth_required, data.auth_ready.ready is false and data.guide_warning.next_command_safety is hosted_signup_no_spend_setup. Run data.next_command, then rerun the guide once. Hosted signup saves the restricted token to the public CLI config by default with 0600 permissions. If the configured config path is blocked, data.next_command sets IMAGE_SKILL_CONFIG_PATH="$PWD/.image-skill/config.json" and still runs a saved-config signup; do not switch to raw-token handoff unless recovery explicitly requires it. If the runtime intentionally uses --no-save --show-token, store the returned token in the agent runtime secret store, then rerun with IMAGE_SKILL_TOKEN or --token-stdin; data.auth_handoff.rerun_guide.with_env and data.auth_handoff.rerun_guide.with_stdin are copy-safe templates for that mode. Signup is anonymous by default: no contact inbox is required to get a restricted token. The optional --agent-contact flag takes an email-shaped durable contact inbox for the restricted agent identity, not a requirement to find an individual human; attach one later with image-skill claim request --contact INBOX --json when funding or durability makes it worth having. Hosted signup returns the raw restricted token only when --show-token is set, and only once. When providing a contact, use an agent-owned inbox when available; otherwise use an operator, team, or sponsor inbox that can receive future claim, billing, or abuse notices. Never invent an inbox or borrow an unrelated human email just to fill the flag — omit it instead. example.invalid addresses are only appropriate inside documented harness or proof runs. --human-email remains accepted as a compatibility alias, but the guide must not teach it. Anonymous signups mint a fresh agent identity on every call; reuse the saved config instead of re-running signup. --save is accepted as a compatibility no-op for the default save behavior; use --no-save only when the runtime has a separate secret store and does not want local config.
65
- 5. At any guide stage, read data.checks.quota.top_up. When recommended is true, it includes recommendation_reason, preferred_payment_method, quote_command, quote_command_copy_runnable, quote_command_effect, and quote/buy/status command templates for the browserless x402 top-up path. On quota/payment recovery errors, read error.recovery.top_up: when delegated live-money quoting is allowed, prefer error.recovery.top_up.quote_command to open the top-up path, and use error.recovery.suggested_command for no-spend payment-method inspection. If data.stage is quota_required, data.guide_warning.next_command_safety is live_money_payment_action and data.guide_warning.payment_top_up_path summarizes the live-money path. Run data.self_fund_next_command to start the top-up. It aliases data.next_command and is the first payment command, usually an x402 or Stripe quote. First read data.checks.payments.preferred_method_summary.top_up_path: browserless_agent_self_fund means a wallet-equipped agent can complete the preferred live-money rail without a browser; human_payment_handoff means the agent can create the payment attempt but a human/browser step must complete before credits are granted. If the guide authenticated from env or stdin, prefer data.self_fund_handoff.auth.next_command.with_env or data.self_fund_handoff.auth.next_command.with_stdin so auth follows the payment command. Then follow data.self_fund_handoff.payment_commands.buy and status, and rerun data.self_fund_handoff.after_next once credits are granted. If data.stage is ready_to_create, inspect data.self_fund_preparation before consuming the remaining free allowance. When available and recommended are true, data.self_fund_preparation.quote_command is the pre-wall browserless x402 quote: it creates an authenticated live-money quote/payment object, but data.self_fund_preparation.quote_command_effect must show no provider call, no hosted create, no credit debit, no media write, and no wallet settlement until a later buy/payment step. One Image Skill credit is $0.01. Credit quotes grant prepaid value units; create/edit operations debit model-priced credits reported as cost.credit_pricing. Starter preview currently gives bounded free-preview credits plus a four-job daily cap.
65
+ 5. At any guide stage, read data.checks.quota.top_up. When available is true, it includes recommended, recommendation_reason, preferred_payment_method, quote_command, quote_command_copy_runnable, quote_command_effect, and quote/buy/status command templates for the browserless x402 top-up path; recommended and urgency say whether to act now. On quota/payment recovery errors, read error.recovery.top_up: when delegated live-money quoting is allowed, prefer error.recovery.top_up.quote_command to open the top-up path, and use error.recovery.suggested_command for no-spend payment-method inspection. If data.stage is quota_required, data.guide_warning.next_command_safety is live_money_payment_action and data.guide_warning.payment_top_up_path summarizes the live-money path. Run data.self_fund_next_command to start the top-up. It aliases data.next_command and is the first payment command, usually an x402 or Stripe quote. First read data.checks.payments.preferred_method_summary.top_up_path: browserless_agent_self_fund means a wallet-equipped agent can complete the preferred live-money rail without a browser; human_payment_handoff means the agent can create the payment attempt but a human/browser step must complete before credits are granted. If the guide authenticated from env or stdin, prefer data.self_fund_handoff.auth.next_command.with_env or data.self_fund_handoff.auth.next_command.with_stdin so auth follows the payment command. Then follow data.self_fund_handoff.payment_commands.buy and status, and rerun data.self_fund_handoff.after_next once credits are granted. If data.stage is ready_to_create, inspect data.self_fund_preparation before consuming the remaining free allowance. When available and recommended are true, data.self_fund_preparation.quote_command is the pre-wall browserless x402 quote: it creates an authenticated live-money quote/payment object, but data.self_fund_preparation.quote_command_effect must show no provider call, no hosted create, no credit debit, no media write, and no wallet settlement until a later buy/payment step. One Image Skill credit is $0.01. Credit quotes grant prepaid value units; create/edit operations debit model-priced credits reported as cost.credit_pricing. Starter preview currently gives bounded free-preview credits plus a four-job daily cap.
66
66
  5a. When data.stage is quota_required, data.self_fund_handoff mirrors top-up urgency, urgency_score, and urgency_reasons, and exposes first_safe_command plus first_safe_command_effect. Run first_safe_command, usually image-skill credits methods --json, for no-spend rail inspection before quote/buy when delegated spend authority is absent or unclear.
67
67
  6. If data.stage is ready_to_create, data.next_command is the first bounded live create. data.guide_warning.next_command_safety must be live_media_create_credit_debit, data.guide_warning.no_spend_safe must be false, data.guide_warning.spend_required must be true, and data.guide_warning.recommended_command_field must be recommended_no_spend_command. data.auth_ready.ready and data.auth_ready.next_command_auth_ready must be true; data.auth_ready.next_command_requires_auth must be true, and the command can reuse saved config, IMAGE_SKILL_TOKEN, or --token-stdin context without exposing a raw token. data.next_command_effect.label must be live_media_create_credit_debit and its provider_call, hosted_create, credit_debit, and media_write flags are true. data.no_spend_evaluation.stop_here must be true, data.no_spend_evaluation.next_command_is_live_create must be true, and data.no_spend_evaluation.recommended_command_field must be recommended_no_spend_command. Run data.next_command only when media spend is allowed. In no-spend evaluations, or when you only need to prove readiness without media/provider work, stop before data.next_command and run data.recommended_no_spend_command instead. data.recommended_no_spend_command must equal data.no_spend_next_command. data.no_spend_next_command_effect.label must be dry_run_planned_job_no_provider_call_no_credit_debit_no_media_write: no_spend, hosted_create_dry_run, planned_job, and plan_receipt are true; activity_event is job.planned; provider_call, credit_debit, and media_write are false. This dry-run may create a recoverable planned job/activity receipt but no provider execution, debit, downloadable asset, or media write. If the guide authenticated from env or stdin, prefer data.auth_handoff.next_command.with_env or data.auth_handoff.next_command.with_stdin so auth follows the live create. In guide cost output, cost.estimated_usd_per_image and cost.estimated_debit_usd_per_image are the Image Skill debit dollars for one output; cost.estimated_provider_usd_per_image is only the upstream provider estimate. Use the guide's returned max_estimated_usd_per_image because it is sized to the credit debit the agent funds. Add --output-count N only after models show confirms the selected create model supports more than one output; credit_pricing.credits_required is the total debit across outputs, while max_estimated_usd_per_image remains a per-image Image Skill debit guard.
68
- 7. After create, prefer data.next_actions when present: inspect_job and inspect_asset are copy-runnable no-spend recovery commands, iterate_edit is the reusable-asset edit template, and self_fund is the promoted top-up quote handoff when quota.top_up.recommended is true. self_fund mirrors urgency, urgency_score, and urgency_reasons, and exposes first_safe_command plus first_safe_command_effect for no-spend rail inspection before quote/buy. self_fund.quote_command is copy-runnable and omits --idempotency-key so the public CLI generates and returns one for retry safety; follow the quote response into buy/status. Otherwise use image-skill jobs show JOB_ID to recover status, cost, safety, timestamps, and final assets; image-skill assets get ASSET_URL_OR_ID --output ./result.png to fetch the generated asset without repeating provider work; and image-skill activity list --subject JOB_ID to find ledger events, trace, usage, asset links, and any data.next_actions.self_fund handoff to cite or follow. Hosted asset-id assets show/get may also return data.next_actions.self_fund after generated work, so inspect that field before ending the session.
68
+ 7. After create, prefer data.next_actions when present: inspect_job and inspect_asset are copy-runnable no-spend recovery commands, iterate_edit is the reusable-asset edit template, and self_fund is the promoted top-up quote handoff when quota.top_up.available is true. self_fund.recommended plus urgency, urgency_score, and urgency_reasons say whether to act now, and self_fund exposes first_safe_command plus first_safe_command_effect for no-spend rail inspection before quote/buy. self_fund.quote_command is copy-runnable and omits --idempotency-key so the public CLI generates and returns one for retry safety; follow the quote response into buy/status. Otherwise use image-skill jobs show JOB_ID to recover status, cost, safety, timestamps, and final assets; image-skill assets get ASSET_URL_OR_ID --output ./result.png to fetch the generated asset without repeating provider work; and image-skill activity list --subject JOB_ID to find ledger events, trace, usage, asset links, and any data.next_actions.self_fund handoff to cite or follow. Hosted asset-id assets show/get may also return data.next_actions.self_fund after generated work, so inspect that field before ending the session.
69
69
  8. Leave image-skill feedback create if the first-run flow is confusing, blocked, missing an affordance, or easier through a direct provider than through Image Skill. Feedback auth uses saved config from default signup, IMAGE_SKILL_TOKEN, or --token-stdin; if signup or guide already saved config, run feedback create normally and do not copy a raw token. Never paste tokens into feedback title, body, evidence, issues, or logs. Use image-skill activity show FEEDBACK_ID only when you need to confirm the feedback entered the hosted ledger.
70
70
 
71
71
  Manual escape hatches are not prerequisites. Use image-skill doctor, image-skill models list, image-skill models show MODEL_ID, image-skill whoami, image-skill usage quota, image-skill credits methods, image-skill credits packs list, image-skill credits quote, image-skill credits buy, image-skill credits status, image-skill create --dry-run, and image-skill edit --dry-run only when data.next_command or data.escape_hatches asks for them, or when the task genuinely needs deeper capability, quota, payment, or planning detail.