filecoin 0.0.0 → 0.5.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 (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +139 -10
  3. package/bin/filecoin.js +7 -0
  4. package/dist/chunks/_esm-BBXTTBLC.js +9 -0
  5. package/dist/chunks/_esm-BBXTTBLC.js.map +7 -0
  6. package/dist/chunks/ccip-TGFMQFIR.js +3 -0
  7. package/dist/chunks/ccip-TGFMQFIR.js.map +7 -0
  8. package/dist/chunks/chunk-2VZELE36.js +124 -0
  9. package/dist/chunks/chunk-2VZELE36.js.map +7 -0
  10. package/dist/chunks/chunk-35V77X3C.js +12 -0
  11. package/dist/chunks/chunk-35V77X3C.js.map +7 -0
  12. package/dist/chunks/chunk-3TJUKWFC.js +6 -0
  13. package/dist/chunks/chunk-3TJUKWFC.js.map +7 -0
  14. package/dist/chunks/chunk-63JLHZEK.js +4 -0
  15. package/dist/chunks/chunk-63JLHZEK.js.map +7 -0
  16. package/dist/chunks/chunk-72RYXITT.js +186 -0
  17. package/dist/chunks/chunk-72RYXITT.js.map +7 -0
  18. package/dist/chunks/chunk-7MEK5RQ7.js +11 -0
  19. package/dist/chunks/chunk-7MEK5RQ7.js.map +7 -0
  20. package/dist/chunks/chunk-AKXAQJ6H.js +3 -0
  21. package/dist/chunks/chunk-AKXAQJ6H.js.map +7 -0
  22. package/dist/chunks/chunk-ASZ5KTWE.js +4 -0
  23. package/dist/chunks/chunk-ASZ5KTWE.js.map +7 -0
  24. package/dist/chunks/chunk-BFBNDHQG.js +3 -0
  25. package/dist/chunks/chunk-BFBNDHQG.js.map +7 -0
  26. package/dist/chunks/chunk-BZITZ3BI.js +3 -0
  27. package/dist/chunks/chunk-BZITZ3BI.js.map +7 -0
  28. package/dist/chunks/chunk-CIVQHT3F.js +5 -0
  29. package/dist/chunks/chunk-CIVQHT3F.js.map +7 -0
  30. package/dist/chunks/chunk-DHTPICN4.js +4 -0
  31. package/dist/chunks/chunk-DHTPICN4.js.map +7 -0
  32. package/dist/chunks/chunk-FCVBKUS5.js +4 -0
  33. package/dist/chunks/chunk-FCVBKUS5.js.map +7 -0
  34. package/dist/chunks/chunk-GCPUMM4E.js +3 -0
  35. package/dist/chunks/chunk-GCPUMM4E.js.map +7 -0
  36. package/dist/chunks/chunk-IAJFQYLN.js +4 -0
  37. package/dist/chunks/chunk-IAJFQYLN.js.map +7 -0
  38. package/dist/chunks/chunk-JFBUOLJ3.js +3 -0
  39. package/dist/chunks/chunk-JFBUOLJ3.js.map +7 -0
  40. package/dist/chunks/chunk-JUFFOBKU.js +59 -0
  41. package/dist/chunks/chunk-JUFFOBKU.js.map +7 -0
  42. package/dist/chunks/chunk-K63EJUGU.js +4 -0
  43. package/dist/chunks/chunk-K63EJUGU.js.map +7 -0
  44. package/dist/chunks/chunk-MWVOEA6K.js +4 -0
  45. package/dist/chunks/chunk-MWVOEA6K.js.map +7 -0
  46. package/dist/chunks/chunk-QRFSFJOZ.js +3 -0
  47. package/dist/chunks/chunk-QRFSFJOZ.js.map +7 -0
  48. package/dist/chunks/chunk-RK6JJQZL.js +41 -0
  49. package/dist/chunks/chunk-RK6JJQZL.js.map +7 -0
  50. package/dist/chunks/chunk-YIAP3JO3.js +3 -0
  51. package/dist/chunks/chunk-YIAP3JO3.js.map +7 -0
  52. package/dist/chunks/chunk-YVRWI5E3.js +3 -0
  53. package/dist/chunks/chunk-YVRWI5E3.js.map +7 -0
  54. package/dist/chunks/chunk-Z6O5SHUU.js +3 -0
  55. package/dist/chunks/chunk-Z6O5SHUU.js.map +7 -0
  56. package/dist/chunks/delete-BO7K4456.js +3 -0
  57. package/dist/chunks/delete-BO7K4456.js.map +7 -0
  58. package/dist/chunks/doctor-NF75MDBO.js +3 -0
  59. package/dist/chunks/doctor-NF75MDBO.js.map +7 -0
  60. package/dist/chunks/get-3EC2XCFH.js +3 -0
  61. package/dist/chunks/get-3EC2XCFH.js.map +7 -0
  62. package/dist/chunks/inspect-FDI442BE.js +3 -0
  63. package/dist/chunks/inspect-FDI442BE.js.map +7 -0
  64. package/dist/chunks/inspect-RJCGSGKG.js +3 -0
  65. package/dist/chunks/inspect-RJCGSGKG.js.map +7 -0
  66. package/dist/chunks/login-NNTYQ37I.js +4 -0
  67. package/dist/chunks/login-NNTYQ37I.js.map +7 -0
  68. package/dist/chunks/logout-3RWZFH2E.js +3 -0
  69. package/dist/chunks/logout-3RWZFH2E.js.map +7 -0
  70. package/dist/chunks/ls-F546AXRG.js +3 -0
  71. package/dist/chunks/ls-F546AXRG.js.map +7 -0
  72. package/dist/chunks/ls-GNEVBKRP.js +3 -0
  73. package/dist/chunks/ls-GNEVBKRP.js.map +7 -0
  74. package/dist/chunks/map-error-QLS3CQMO.js +3 -0
  75. package/dist/chunks/map-error-QLS3CQMO.js.map +7 -0
  76. package/dist/chunks/put-FXMGPSU6.js +3 -0
  77. package/dist/chunks/put-FXMGPSU6.js.map +7 -0
  78. package/dist/chunks/resume-G5PS246S.js +3 -0
  79. package/dist/chunks/resume-G5PS246S.js.map +7 -0
  80. package/dist/chunks/secp256k1-2OHXXNYZ.js +3 -0
  81. package/dist/chunks/secp256k1-2OHXXNYZ.js.map +7 -0
  82. package/dist/chunks/skills.run-E7FJPXEM.js +5 -0
  83. package/dist/chunks/skills.run-E7FJPXEM.js.map +7 -0
  84. package/dist/chunks/status-HOLDXKMR.js +3 -0
  85. package/dist/chunks/status-HOLDXKMR.js.map +7 -0
  86. package/dist/main.js +3 -0
  87. package/dist/main.js.map +7 -0
  88. package/dist/tsconfig.tsbuildinfo +1 -0
  89. package/package.json +49 -10
  90. package/skills/filecoin/SKILL.md +41 -0
  91. package/basic_types.md +0 -94
  92. package/chain.md +0 -280
  93. package/index.js +0 -1
  94. package/messages.md +0 -1684
  95. package/state.md +0 -1415
@@ -0,0 +1,4 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{B as u,a as r,c as i,e as s,f as a,g as p,k as n,u as m,v as c,w as l}from"./chunk-JUFFOBKU.js";import{d as t}from"./chunk-3TJUKWFC.js";var h=t({name:"ls",description:"List put and delete operations, most recently updated first",examples:["filecoin operations ls","filecoin operations ls --incomplete"],input:p({...l,incomplete:i().default(!1).describe("Only operations that have not completed"),...m}),env:c,secrets:["sessionKey"],output:a({network:r(),operations:s(u),nextCursor:r().optional()}),errors:[n.authRequired,n.loginPending],readOnly:!0,human:o=>o.operations.length===0?`No operations on ${o.network}.`:[...o.operations.map(e=>`${e.id} ${e.action.padEnd(6)} ${e.executionStatus.padEnd(9)} ${e.phase.padEnd(10)} ${e.resourceRef}${e.error?` ${e.error}`:""}`),...o.nextCursor?[`more: --cursor ${o.nextCursor}`]:[]].join(`
3
+ `),handler:()=>import("./ls-GNEVBKRP.js")});export{h as a};
4
+ //# sourceMappingURL=chunk-ASZ5KTWE.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/operations/ls.ts"],
4
+ "sourcesContent": ["import { defineCommand } from 'clipact'\nimport * as z from 'zod'\nimport { ErrorCodes } from '../../errors.ts'\nimport { account, accountEnv, operationSummary, paging } from '../shared.ts'\n\n/** `filecoin operations ls`: saved put and delete jobs, newest update first. */\nexport const ls = defineCommand({\n name: 'ls',\n description: 'List put and delete operations, most recently updated first',\n examples: ['filecoin operations ls', 'filecoin operations ls --incomplete'],\n input: z.strictObject({\n ...paging,\n incomplete: z\n .boolean()\n .default(false)\n .describe('Only operations that have not completed'),\n ...account,\n }),\n env: accountEnv,\n secrets: ['sessionKey'],\n output: z.object({\n network: z.string(),\n operations: z.array(operationSummary),\n nextCursor: z.string().optional(),\n }),\n errors: [ErrorCodes.authRequired, ErrorCodes.loginPending],\n readOnly: true,\n human: (data) =>\n data.operations.length === 0\n ? `No operations on ${data.network}.`\n : [\n ...data.operations.map(\n (op) =>\n `${op.id} ${op.action.padEnd(6)} ${op.executionStatus.padEnd(9)} ${op.phase.padEnd(10)} ${op.resourceRef}${op.error ? ` ${op.error}` : ''}`\n ),\n ...(data.nextCursor ? [`more: --cursor ${data.nextCursor}`] : []),\n ].join('\\n'),\n handler: () => import('../../handlers/operations/ls.ts'),\n})\n"],
5
+ "mappings": ";+IAMO,IAAMA,EAAKC,EAAc,CAC9B,KAAM,KACN,YAAa,8DACb,SAAU,CAAC,yBAA0B,qCAAqC,EAC1E,MAASC,EAAa,CACpB,GAAGC,EACH,WACGC,EAAQ,EACR,QAAQ,EAAK,EACb,SAAS,yCAAyC,EACrD,GAAGC,CACL,CAAC,EACD,IAAKC,EACL,QAAS,CAAC,YAAY,EACtB,OAAUC,EAAO,CACf,QAAWC,EAAO,EAClB,WAAcC,EAAMC,CAAgB,EACpC,WAAcF,EAAO,EAAE,SAAS,CAClC,CAAC,EACD,OAAQ,CAACG,EAAW,aAAcA,EAAW,YAAY,EACzD,SAAU,GACV,MAAQC,GACNA,EAAK,WAAW,SAAW,EACvB,oBAAoBA,EAAK,OAAO,IAChC,CACE,GAAGA,EAAK,WAAW,IAChBC,GACC,GAAGA,EAAG,EAAE,KAAKA,EAAG,OAAO,OAAO,CAAC,CAAC,IAAIA,EAAG,gBAAgB,OAAO,CAAC,CAAC,IAAIA,EAAG,MAAM,OAAO,EAAE,CAAC,IAAIA,EAAG,WAAW,GAAGA,EAAG,MAAQ,KAAKA,EAAG,KAAK,GAAK,EAAE,EAC/I,EACA,GAAID,EAAK,WAAa,CAAC,kBAAkBA,EAAK,UAAU,EAAE,EAAI,CAAC,CACjE,EAAE,KAAK;AAAA,CAAI,EACjB,QAAS,IAAM,OAAO,kBAAiC,CACzD,CAAC",
6
+ "names": ["ls", "defineCommand", "strictObject", "paging", "boolean", "account", "accountEnv", "object", "string", "array", "operationSummary", "ErrorCodes", "data", "op"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{C as l,a as e,b as r,c as n,f as s,g as u,i as c,k as i,u as a,v as f}from"./chunk-JUFFOBKU.js";import{d as o}from"./chunk-3TJUKWFC.js";var b=o({name:"get",description:"Download and verify a resource (by ref or PieceCID)",examples:["filecoin get res_abc123","filecoin get res_abc123 --output ./copy"],input:u({target:e().describe("Resource ref (res_\u2026), PieceCID, or root CID"),output:e().optional().describe("Output path (default: the resource name)"),force:n().default(!1).describe("Overwrite an existing file"),...a}),positionals:["target"],env:f,secrets:["sessionKey"],output:s({kind:c(["file","folder"]),ref:e().optional(),pieceCid:e(),output:e().describe("Written file or directory"),size:r().int().describe("Verified bytes downloaded"),files:r().int().optional().describe("Files extracted"),url:e()}),errors:[i.authRequired,i.loginPending,i.notFound,i.outputExists,i.verificationFailed,i.unsafePath],idempotent:!0,human:t=>`Wrote ${t.output} (${l(t.size)}${t.files==null?"":`, ${t.files} files`}), verified against ${t.pieceCid}`,handler:()=>import("./get-3EC2XCFH.js")});export{b as a};
3
+ //# sourceMappingURL=chunk-BFBNDHQG.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/get.ts"],
4
+ "sourcesContent": ["import { defineCommand } from 'clipact'\nimport * as z from 'zod'\nimport { ErrorCodes } from '../errors.ts'\nimport { account, accountEnv, formatBytes } from './shared.ts'\n\n/**\n * `filecoin get <target>`: download a resource (or any PieceCID) from Curio and\n * verify it. Files are written as-is; folders are extracted.\n */\nexport const get = defineCommand({\n name: 'get',\n description: 'Download and verify a resource (by ref or PieceCID)',\n examples: [\n 'filecoin get res_abc123',\n 'filecoin get res_abc123 --output ./copy',\n ],\n input: z.strictObject({\n target: z.string().describe('Resource ref (res_\u2026), PieceCID, or root CID'),\n output: z\n .string()\n .optional()\n .describe('Output path (default: the resource name)'),\n force: z.boolean().default(false).describe('Overwrite an existing file'),\n ...account,\n }),\n positionals: ['target'],\n env: accountEnv,\n secrets: ['sessionKey'],\n output: z.object({\n kind: z.enum(['file', 'folder']),\n ref: z.string().optional(),\n pieceCid: z.string(),\n output: z.string().describe('Written file or directory'),\n size: z.number().int().describe('Verified bytes downloaded'),\n files: z.number().int().optional().describe('Files extracted'),\n url: z.string(),\n }),\n errors: [\n ErrorCodes.authRequired,\n ErrorCodes.loginPending,\n ErrorCodes.notFound,\n ErrorCodes.outputExists,\n ErrorCodes.verificationFailed,\n ErrorCodes.unsafePath,\n ],\n idempotent: true,\n human: (data) =>\n `Wrote ${data.output} (${formatBytes(data.size)}${data.files == null ? '' : `, ${data.files} files`}), verified against ${data.pieceCid}`,\n handler: () => import('../handlers/get.ts'),\n})\n"],
5
+ "mappings": ";+IASO,IAAMA,EAAMC,EAAc,CAC/B,KAAM,MACN,YAAa,sDACb,SAAU,CACR,0BACA,yCACF,EACA,MAASC,EAAa,CACpB,OAAUC,EAAO,EAAE,SAAS,kDAA6C,EACzE,OACGA,EAAO,EACP,SAAS,EACT,SAAS,0CAA0C,EACtD,MAASC,EAAQ,EAAE,QAAQ,EAAK,EAAE,SAAS,4BAA4B,EACvE,GAAGC,CACL,CAAC,EACD,YAAa,CAAC,QAAQ,EACtB,IAAKC,EACL,QAAS,CAAC,YAAY,EACtB,OAAUC,EAAO,CACf,KAAQC,EAAK,CAAC,OAAQ,QAAQ,CAAC,EAC/B,IAAOL,EAAO,EAAE,SAAS,EACzB,SAAYA,EAAO,EACnB,OAAUA,EAAO,EAAE,SAAS,2BAA2B,EACvD,KAAQM,EAAO,EAAE,IAAI,EAAE,SAAS,2BAA2B,EAC3D,MAASA,EAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,iBAAiB,EAC7D,IAAON,EAAO,CAChB,CAAC,EACD,OAAQ,CACNO,EAAW,aACXA,EAAW,aACXA,EAAW,SACXA,EAAW,aACXA,EAAW,mBACXA,EAAW,UACb,EACA,WAAY,GACZ,MAAQC,GACN,SAASA,EAAK,MAAM,KAAKC,EAAYD,EAAK,IAAI,CAAC,GAAGA,EAAK,OAAS,KAAO,GAAK,KAAKA,EAAK,KAAK,QAAQ,uBAAuBA,EAAK,QAAQ,GACzI,QAAS,IAAM,OAAO,mBAAoB,CAC5C,CAAC",
6
+ "names": ["get", "defineCommand", "strictObject", "string", "boolean", "account", "accountEnv", "object", "_enum", "number", "ErrorCodes", "data", "formatBytes"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{D as l,F as f,a as e,b as i,c as n,e as r,f as p,g as m,i as t,k as o,u as a,v as d}from"./chunk-JUFFOBKU.js";import{d as c}from"./chunk-3TJUKWFC.js";var z=c({name:"login",description:"Authorize a session key in the filecoin-app dashboard",examples:["filecoin login","filecoin login --scopes createDataSet --scopes addPieces","filecoin login --check",'filecoin login --name "filecoin on laptop" --days 7',"filecoin login --network mainnet --fresh"],input:m({network:a.network,sessionKey:a.sessionKey,scopes:r(t(l)).min(1).optional().describe("Scopes to request (default: the saved key's, else createDataSet, addPieces, schedulePieceRemovals)"),name:e().trim().min(1).max(64).optional().describe(`Key name the owner sees, recorded on chain (default: the saved key's, else ${f})`),days:i().int().min(1).max(365).optional().describe("Days until the approval expires (default: the saved key's, else 30)"),wait:n().optional().describe("Wait for approval (default: only when a human is present)"),open:n().default(!0).describe("Open the approval page in a browser; never for agents"),fresh:n().default(!1).describe("Generate a new key, replacing a pending or valid saved key"),check:n().default(!1).describe("Only confirm the saved key; never generate a new one"),timeout:i().int().min(1).default(600).describe("Seconds to wait for approval")}),env:{network:d.network,sessionKey:d.sessionKey},secrets:["sessionKey"],output:p({network:e(),address:e().describe("Session key address"),rootAddress:e().describe("Wallet that authorized it"),scopes:r(t(l)).describe("Granted scopes"),expiresAt:e().optional().describe("Earliest scope expiry")}),errors:[o.authRequired,o.loginPending,o.permissionDenied,o.sessionConflict,o.sessionExpired],idempotent:!0,human:s=>`Logged in on ${s.network} as ${s.rootAddress} with ${s.scopes.join(", ")}${s.expiresAt?` until ${s.expiresAt}`:""}.`,handler:()=>import("./login-NNTYQ37I.js")});export{z as a};
3
+ //# sourceMappingURL=chunk-BZITZ3BI.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/login.ts"],
4
+ "sourcesContent": ["import { defineCommand } from 'clipact'\nimport * as z from 'zod'\nimport { DEFAULT_KEY_NAME, SCOPE_IDS } from '../auth/scope-ids.ts'\nimport { ErrorCodes } from '../errors.ts'\nimport { account, accountEnv } from './shared.ts'\n\n/**\n * `filecoin login`: authorize a session key in the filecoin-app dashboard. A human\n * waits for approval; an agent gets the approval link back as a\n * `login_pending` error and runs `filecoin login --check` once the user approves.\n * Flags left out keep the saved key's request, and only `--fresh` replaces a\n * key that is pending or still valid.\n */\nexport const login = defineCommand({\n name: 'login',\n description: 'Authorize a session key in the filecoin-app dashboard',\n examples: [\n 'filecoin login',\n 'filecoin login --scopes createDataSet --scopes addPieces',\n 'filecoin login --check',\n 'filecoin login --name \"filecoin on laptop\" --days 7',\n 'filecoin login --network mainnet --fresh',\n ],\n input: z.strictObject({\n network: account.network,\n sessionKey: account.sessionKey,\n scopes: z\n .array(z.enum(SCOPE_IDS))\n .min(1)\n .optional()\n .describe(\n \"Scopes to request (default: the saved key's, else createDataSet, addPieces, schedulePieceRemovals)\"\n ),\n name: z\n .string()\n .trim()\n .min(1)\n .max(64)\n .optional()\n .describe(\n `Key name the owner sees, recorded on chain (default: the saved key's, else ${DEFAULT_KEY_NAME})`\n ),\n days: z\n .number()\n .int()\n .min(1)\n .max(365)\n .optional()\n .describe(\n \"Days until the approval expires (default: the saved key's, else 30)\"\n ),\n wait: z\n .boolean()\n .optional()\n .describe('Wait for approval (default: only when a human is present)'),\n open: z\n .boolean()\n .default(true)\n .describe('Open the approval page in a browser; never for agents'),\n fresh: z\n .boolean()\n .default(false)\n .describe('Generate a new key, replacing a pending or valid saved key'),\n check: z\n .boolean()\n .default(false)\n .describe('Only confirm the saved key; never generate a new one'),\n timeout: z\n .number()\n .int()\n .min(1)\n .default(600)\n .describe('Seconds to wait for approval'),\n }),\n env: { network: accountEnv.network, sessionKey: accountEnv.sessionKey },\n secrets: ['sessionKey'],\n output: z.object({\n network: z.string(),\n address: z.string().describe('Session key address'),\n rootAddress: z.string().describe('Wallet that authorized it'),\n scopes: z.array(z.enum(SCOPE_IDS)).describe('Granted scopes'),\n expiresAt: z.string().optional().describe('Earliest scope expiry'),\n }),\n errors: [\n ErrorCodes.authRequired,\n ErrorCodes.loginPending,\n ErrorCodes.permissionDenied,\n ErrorCodes.sessionConflict,\n ErrorCodes.sessionExpired,\n ],\n idempotent: true,\n human: (data) =>\n `Logged in on ${data.network} as ${data.rootAddress} with ${data.scopes.join(', ')}${data.expiresAt ? ` until ${data.expiresAt}` : ''}.`,\n handler: () => import('../handlers/login.ts'),\n})\n"],
5
+ "mappings": ";6JAaO,IAAMA,EAAQC,EAAc,CACjC,KAAM,QACN,YAAa,wDACb,SAAU,CACR,iBACA,2DACA,yBACA,sDACA,0CACF,EACA,MAASC,EAAa,CACpB,QAASC,EAAQ,QACjB,WAAYA,EAAQ,WACpB,OACGC,EAAQC,EAAKC,CAAS,CAAC,EACvB,IAAI,CAAC,EACL,SAAS,EACT,SACC,oGACF,EACF,KACGC,EAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,EAAE,EACN,SAAS,EACT,SACC,8EAA8EC,CAAgB,GAChG,EACF,KACGC,EAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,IAAI,GAAG,EACP,SAAS,EACT,SACC,qEACF,EACF,KACGC,EAAQ,EACR,SAAS,EACT,SAAS,2DAA2D,EACvE,KACGA,EAAQ,EACR,QAAQ,EAAI,EACZ,SAAS,uDAAuD,EACnE,MACGA,EAAQ,EACR,QAAQ,EAAK,EACb,SAAS,4DAA4D,EACxE,MACGA,EAAQ,EACR,QAAQ,EAAK,EACb,SAAS,sDAAsD,EAClE,QACGD,EAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,QAAQ,GAAG,EACX,SAAS,8BAA8B,CAC5C,CAAC,EACD,IAAK,CAAE,QAASE,EAAW,QAAS,WAAYA,EAAW,UAAW,EACtE,QAAS,CAAC,YAAY,EACtB,OAAUC,EAAO,CACf,QAAWL,EAAO,EAClB,QAAWA,EAAO,EAAE,SAAS,qBAAqB,EAClD,YAAeA,EAAO,EAAE,SAAS,2BAA2B,EAC5D,OAAUH,EAAQC,EAAKC,CAAS,CAAC,EAAE,SAAS,gBAAgB,EAC5D,UAAaC,EAAO,EAAE,SAAS,EAAE,SAAS,uBAAuB,CACnE,CAAC,EACD,OAAQ,CACNM,EAAW,aACXA,EAAW,aACXA,EAAW,iBACXA,EAAW,gBACXA,EAAW,cACb,EACA,WAAY,GACZ,MAAQC,GACN,gBAAgBA,EAAK,OAAO,OAAOA,EAAK,WAAW,SAASA,EAAK,OAAO,KAAK,IAAI,CAAC,GAAGA,EAAK,UAAY,UAAUA,EAAK,SAAS,GAAK,EAAE,IACvI,QAAS,IAAM,OAAO,qBAAsB,CAC9C,CAAC",
6
+ "names": ["login", "defineCommand", "strictObject", "account", "array", "_enum", "SCOPE_IDS", "string", "DEFAULT_KEY_NAME", "number", "boolean", "accountEnv", "object", "ErrorCodes", "data"]
7
+ }
@@ -0,0 +1,5 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{C as h,a as e,b as s,c as r,e as c,f as i,g as l,i as a,j as d,m as u,u as z,v as m,x as f,y as g}from"./chunk-JUFFOBKU.js";import{d as p}from"./chunk-3TJUKWFC.js";var b=i({kind:a(["file","folder"]),name:e(),size:s().int().describe("Bytes to store: the file, or the packed CAR"),files:s().int(),rootCid:e().optional(),network:e(),authorization:a(["ready","login_required","login_pending","scopes_missing"]).describe("Whether the session key can sign this put"),missingScopes:c(e()).optional(),provider:i({id:e(),serviceURL:e(),dataSetId:e().optional().describe("Existing data set to add to")}).optional(),cost:i({token:d("USDFC"),ready:r().describe("The payer can cover it now"),depositNeeded:e(),needsApproval:r(),ratePerMonth:e(),lockup:e(),fundingUrl:e().optional()}).optional(),checkedAt:e()}),k=p({name:"put",description:"Store a file (raw piece) or directory (UnixFS CAR) with one copy",examples:["filecoin put ./report.pdf","filecoin put ./site --name docs","filecoin publish ./site --dry-run"],input:l({path:e().describe("File or directory to store"),name:e().min(1).optional().describe("Display name (default: basename)"),provider:e().regex(/^\d+$/,"Expected a decimal provider ID").optional().describe("Storage provider ID (default: automatic)"),...z}),positionals:["path"],env:m,secrets:["sessionKey"],output:i({dryRun:r(),operationId:e().optional().describe("Set when dryRun is false"),state:d("ready").optional(),resource:f.optional(),urls:g.optional(),estimate:b.optional().describe("Set when dryRun is true")}),errors:u,dryRun:!0,human:o=>{if(o.estimate){let t=o.estimate,n=[`Would store ${t.kind} ${t.name}: ${h(t.size)}, ${t.files} file(s) on ${t.network}`,`authorization: ${t.authorization}`];return t.provider&&n.push(`provider: ${t.provider.id} (${t.provider.serviceURL})`),t.cost&&n.push(`cost: ${t.cost.ratePerMonth} USDFC/month, lockup ${t.cost.lockup} USDFC, ${t.cost.ready?"funded":`deposit ${t.cost.depositNeeded} USDFC first`}`),n.join(`
3
+ `)}return`Stored ${o.resource?.name} (${o.resource?.ref})
4
+ ${o.urls?.browser}`},handler:()=>import("./put-FXMGPSU6.js")});export{k as a};
5
+ //# sourceMappingURL=chunk-CIVQHT3F.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/put.ts"],
4
+ "sourcesContent": ["import { defineCommand } from 'clipact'\nimport * as z from 'zod'\nimport { JOB_ERRORS } from '../errors.ts'\nimport { account, accountEnv, formatBytes, resource, urls } from './shared.ts'\n\n/** What `put --dry-run` reports instead of storing anything. */\nconst estimate = z.object({\n kind: z.enum(['file', 'folder']),\n name: z.string(),\n size: z\n .number()\n .int()\n .describe('Bytes to store: the file, or the packed CAR'),\n files: z.number().int(),\n rootCid: z.string().optional(),\n network: z.string(),\n authorization: z\n .enum(['ready', 'login_required', 'login_pending', 'scopes_missing'])\n .describe('Whether the session key can sign this put'),\n missingScopes: z.array(z.string()).optional(),\n provider: z\n .object({\n id: z.string(),\n serviceURL: z.string(),\n dataSetId: z.string().optional().describe('Existing data set to add to'),\n })\n .optional(),\n cost: z\n .object({\n token: z.literal('USDFC'),\n ready: z.boolean().describe('The payer can cover it now'),\n depositNeeded: z.string(),\n needsApproval: z.boolean(),\n ratePerMonth: z.string(),\n lockup: z.string(),\n fundingUrl: z.string().optional(),\n })\n .optional(),\n checkedAt: z.string(),\n})\n\n/**\n * `filecoin put <path>` (alias `publish`): store a file as exact bytes, or a\n * directory as a UnixFS CAR served at `/ipfs/<rootCid>/`, with one copy.\n */\nexport const put = defineCommand({\n name: 'put',\n description:\n 'Store a file (raw piece) or directory (UnixFS CAR) with one copy',\n examples: [\n 'filecoin put ./report.pdf',\n 'filecoin put ./site --name docs',\n 'filecoin publish ./site --dry-run',\n ],\n input: z.strictObject({\n path: z.string().describe('File or directory to store'),\n name: z\n .string()\n .min(1)\n .optional()\n .describe('Display name (default: basename)'),\n provider: z\n .string()\n .regex(/^\\d+$/, 'Expected a decimal provider ID')\n .optional()\n .describe('Storage provider ID (default: automatic)'),\n ...account,\n }),\n positionals: ['path'],\n env: accountEnv,\n secrets: ['sessionKey'],\n output: z.object({\n dryRun: z.boolean(),\n operationId: z.string().optional().describe('Set when dryRun is false'),\n state: z.literal('ready').optional(),\n resource: resource.optional(),\n urls: urls.optional(),\n estimate: estimate.optional().describe('Set when dryRun is true'),\n }),\n errors: JOB_ERRORS,\n dryRun: true,\n human: (data) => {\n if (data.estimate) {\n const e = data.estimate\n const lines = [\n `Would store ${e.kind} ${e.name}: ${formatBytes(e.size)}, ${e.files} file(s) on ${e.network}`,\n `authorization: ${e.authorization}`,\n ]\n if (e.provider)\n lines.push(`provider: ${e.provider.id} (${e.provider.serviceURL})`)\n if (e.cost) {\n lines.push(\n `cost: ${e.cost.ratePerMonth} USDFC/month, lockup ${e.cost.lockup} USDFC, ${e.cost.ready ? 'funded' : `deposit ${e.cost.depositNeeded} USDFC first`}`\n )\n }\n return lines.join('\\n')\n }\n return `Stored ${data.resource?.name} (${data.resource?.ref})\\n${data.urls?.browser}`\n },\n handler: () => import('../handlers/put.ts'),\n})\n"],
5
+ "mappings": ";2KAMA,IAAMA,EAAaC,EAAO,CACxB,KAAQC,EAAK,CAAC,OAAQ,QAAQ,CAAC,EAC/B,KAAQC,EAAO,EACf,KACGC,EAAO,EACP,IAAI,EACJ,SAAS,6CAA6C,EACzD,MAASA,EAAO,EAAE,IAAI,EACtB,QAAWD,EAAO,EAAE,SAAS,EAC7B,QAAWA,EAAO,EAClB,cACGD,EAAK,CAAC,QAAS,iBAAkB,gBAAiB,gBAAgB,CAAC,EACnE,SAAS,2CAA2C,EACvD,cAAiBG,EAAQF,EAAO,CAAC,EAAE,SAAS,EAC5C,SACGF,EAAO,CACN,GAAME,EAAO,EACb,WAAcA,EAAO,EACrB,UAAaA,EAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B,CACzE,CAAC,EACA,SAAS,EACZ,KACGF,EAAO,CACN,MAASK,EAAQ,OAAO,EACxB,MAASC,EAAQ,EAAE,SAAS,4BAA4B,EACxD,cAAiBJ,EAAO,EACxB,cAAiBI,EAAQ,EACzB,aAAgBJ,EAAO,EACvB,OAAUA,EAAO,EACjB,WAAcA,EAAO,EAAE,SAAS,CAClC,CAAC,EACA,SAAS,EACZ,UAAaA,EAAO,CACtB,CAAC,EAMYK,EAAMC,EAAc,CAC/B,KAAM,MACN,YACE,mEACF,SAAU,CACR,4BACA,kCACA,mCACF,EACA,MAASC,EAAa,CACpB,KAAQP,EAAO,EAAE,SAAS,4BAA4B,EACtD,KACGA,EAAO,EACP,IAAI,CAAC,EACL,SAAS,EACT,SAAS,kCAAkC,EAC9C,SACGA,EAAO,EACP,MAAM,QAAS,gCAAgC,EAC/C,SAAS,EACT,SAAS,0CAA0C,EACtD,GAAGQ,CACL,CAAC,EACD,YAAa,CAAC,MAAM,EACpB,IAAKC,EACL,QAAS,CAAC,YAAY,EACtB,OAAUX,EAAO,CACf,OAAUM,EAAQ,EAClB,YAAeJ,EAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B,EACtE,MAASG,EAAQ,OAAO,EAAE,SAAS,EACnC,SAAUO,EAAS,SAAS,EAC5B,KAAMC,EAAK,SAAS,EACpB,SAAUd,EAAS,SAAS,EAAE,SAAS,yBAAyB,CAClE,CAAC,EACD,OAAQe,EACR,OAAQ,GACR,MAAQC,GAAS,CACf,GAAIA,EAAK,SAAU,CACjB,IAAMC,EAAID,EAAK,SACTE,EAAQ,CACZ,eAAeD,EAAE,IAAI,IAAIA,EAAE,IAAI,KAAKE,EAAYF,EAAE,IAAI,CAAC,KAAKA,EAAE,KAAK,eAAeA,EAAE,OAAO,GAC3F,kBAAkBA,EAAE,aAAa,EACnC,EACA,OAAIA,EAAE,UACJC,EAAM,KAAK,aAAaD,EAAE,SAAS,EAAE,KAAKA,EAAE,SAAS,UAAU,GAAG,EAChEA,EAAE,MACJC,EAAM,KACJ,SAASD,EAAE,KAAK,YAAY,wBAAwBA,EAAE,KAAK,MAAM,WAAWA,EAAE,KAAK,MAAQ,SAAW,WAAWA,EAAE,KAAK,aAAa,cAAc,EACrJ,EAEKC,EAAM,KAAK;AAAA,CAAI,CACxB,CACA,MAAO,UAAUF,EAAK,UAAU,IAAI,KAAKA,EAAK,UAAU,GAAG;AAAA,EAAMA,EAAK,MAAM,OAAO,EACrF,EACA,QAAS,IAAM,OAAO,mBAAoB,CAC5C,CAAC",
6
+ "names": ["estimate", "object", "_enum", "string", "number", "array", "literal", "boolean", "put", "defineCommand", "strictObject", "account", "accountEnv", "resource", "urls", "JOB_ERRORS", "data", "e", "lines", "formatBytes"]
7
+ }
@@ -0,0 +1,4 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a as r,b as c,c as a,f as i,g as u,i as d,k as t,u as p,v as l,x as m,y as b}from"./chunk-JUFFOBKU.js";import{d as n}from"./chunk-3TJUKWFC.js";var C=n({name:"inspect",description:"Show a managed resource and its retrieval URLs",examples:["filecoin inspect res_abc123","filecoin inspect res_abc123 --check"],input:u({ref:r().describe("Resource ref (res_\u2026)"),check:a().default(!1).describe("Probe the piece URL with a HEAD request"),...p}),positionals:["ref"],env:l,secrets:["sessionKey"],output:i({resource:m,urls:b,retrieval:i({url:r(),state:d(["ready","unavailable"]),status:c().int().describe("HTTP status; 0 when unreachable"),checkedAt:r()}).optional()}),errors:[t.authRequired,t.loginPending,t.notFound],readOnly:!0,human:({resource:e,urls:o,retrieval:s})=>[`${e.ref} ${e.kind} ${e.name} (${e.status})`,`pieceCid: ${e.pieceCid}`,...e.rootCid?[`rootCid: ${e.rootCid}`]:[],`piece: ${o.piece}`,`browser: ${o.browser}`,...s?[`retrieval: ${s.state} (HTTP ${s.status})`]:[]].join(`
3
+ `),handler:()=>import("./inspect-RJCGSGKG.js")});export{C as a};
4
+ //# sourceMappingURL=chunk-DHTPICN4.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/inspect.ts"],
4
+ "sourcesContent": ["import { defineCommand } from 'clipact'\nimport * as z from 'zod'\nimport { ErrorCodes } from '../errors.ts'\nimport { account, accountEnv, resource, urls } from './shared.ts'\n\n/** `filecoin inspect <ref>`: show a resource and its retrieval URLs. */\nexport const inspect = defineCommand({\n name: 'inspect',\n description: 'Show a managed resource and its retrieval URLs',\n examples: [\n 'filecoin inspect res_abc123',\n 'filecoin inspect res_abc123 --check',\n ],\n input: z.strictObject({\n ref: z.string().describe('Resource ref (res_\u2026)'),\n check: z\n .boolean()\n .default(false)\n .describe('Probe the piece URL with a HEAD request'),\n ...account,\n }),\n positionals: ['ref'],\n env: accountEnv,\n secrets: ['sessionKey'],\n output: z.object({\n resource,\n urls,\n retrieval: z\n .object({\n url: z.string(),\n state: z.enum(['ready', 'unavailable']),\n status: z.number().int().describe('HTTP status; 0 when unreachable'),\n checkedAt: z.string(),\n })\n .optional(),\n }),\n errors: [\n ErrorCodes.authRequired,\n ErrorCodes.loginPending,\n ErrorCodes.notFound,\n ],\n readOnly: true,\n human: ({ resource: r, urls: u, retrieval }) =>\n [\n `${r.ref} ${r.kind} ${r.name} (${r.status})`,\n `pieceCid: ${r.pieceCid}`,\n ...(r.rootCid ? [`rootCid: ${r.rootCid}`] : []),\n `piece: ${u.piece}`,\n `browser: ${u.browser}`,\n ...(retrieval\n ? [`retrieval: ${retrieval.state} (HTTP ${retrieval.status})`]\n : []),\n ].join('\\n'),\n handler: () => import('../handlers/inspect.ts'),\n})\n"],
5
+ "mappings": ";sJAMO,IAAMA,EAAUC,EAAc,CACnC,KAAM,UACN,YAAa,iDACb,SAAU,CACR,8BACA,qCACF,EACA,MAASC,EAAa,CACpB,IAAOC,EAAO,EAAE,SAAS,2BAAsB,EAC/C,MACGC,EAAQ,EACR,QAAQ,EAAK,EACb,SAAS,yCAAyC,EACrD,GAAGC,CACL,CAAC,EACD,YAAa,CAAC,KAAK,EACnB,IAAKC,EACL,QAAS,CAAC,YAAY,EACtB,OAAUC,EAAO,CACf,SAAAC,EACA,KAAAC,EACA,UACGF,EAAO,CACN,IAAOJ,EAAO,EACd,MAASO,EAAK,CAAC,QAAS,aAAa,CAAC,EACtC,OAAUC,EAAO,EAAE,IAAI,EAAE,SAAS,iCAAiC,EACnE,UAAaR,EAAO,CACtB,CAAC,EACA,SAAS,CACd,CAAC,EACD,OAAQ,CACNS,EAAW,aACXA,EAAW,aACXA,EAAW,QACb,EACA,SAAU,GACV,MAAO,CAAC,CAAE,SAAUC,EAAG,KAAMC,EAAG,UAAAC,CAAU,IACxC,CACE,GAAGF,EAAE,GAAG,IAAIA,EAAE,IAAI,IAAIA,EAAE,IAAI,KAAKA,EAAE,MAAM,IACzC,aAAaA,EAAE,QAAQ,GACvB,GAAIA,EAAE,QAAU,CAAC,YAAYA,EAAE,OAAO,EAAE,EAAI,CAAC,EAC7C,UAAUC,EAAE,KAAK,GACjB,YAAYA,EAAE,OAAO,GACrB,GAAIC,EACA,CAAC,cAAcA,EAAU,KAAK,UAAUA,EAAU,MAAM,GAAG,EAC3D,CAAC,CACP,EAAE,KAAK;AAAA,CAAI,EACb,QAAS,IAAM,OAAO,uBAAwB,CAChD,CAAC",
6
+ "names": ["inspect", "defineCommand", "strictObject", "string", "boolean", "account", "accountEnv", "object", "resource", "urls", "_enum", "number", "ErrorCodes", "r", "u", "retrieval"]
7
+ }
@@ -0,0 +1,4 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{p as n}from"./chunk-3TJUKWFC.js";var s=new Set(["HttpRequestError","RpcRequestError","WebSocketRequestError","NetworkError","FetchError","ResourceUnavailableRpcError","InternalRpcError","LimitExceededRpcError"]),u=new Set(["TimeoutError"]);function*i(r){let e=r;for(let t=0;e instanceof Error&&t<10;t++)yield e,e=e.cause}function o(r){return r.message.split(`
3
+ `)[0]??r.name}function c(r){for(let e of i(r)){if(u.has(e.name))return new n({code:"timeout",message:`A request timed out: ${o(e)}`,cause:r});if(s.has(e.name))return new n({code:"service_unavailable",message:`A service did not respond: ${o(e)}`,cause:r})}}export{o as a,c as b};
4
+ //# sourceMappingURL=chunk-FCVBKUS5.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/map-error.ts"],
4
+ "sourcesContent": ["import { CliError } from 'clipact'\n\n/** Error names from viem and iso-web for an unreachable or failing endpoint. */\nconst UNAVAILABLE = new Set([\n 'HttpRequestError',\n 'RpcRequestError',\n 'WebSocketRequestError',\n 'NetworkError',\n 'FetchError',\n 'ResourceUnavailableRpcError',\n 'InternalRpcError',\n 'LimitExceededRpcError',\n])\n\n/** Error names for a request that took too long. */\nconst TIMEOUT = new Set(['TimeoutError'])\n\n/** The error and its causes, outermost first. */\nfunction* causes(error: unknown): Generator<Error> {\n let current = error\n for (let depth = 0; current instanceof Error && depth < 10; depth++) {\n yield current\n current = current.cause\n }\n}\n\n/** First line of an error message, without viem's detail blocks. */\nexport function firstLine(error: Error): string {\n return error.message.split('\\n')[0] ?? error.name\n}\n\n/**\n * Translate RPC and HTTP failures from viem and synapse-core into\n * clipact's transient codes. clipact marks them retryable only for read-only\n * and idempotent commands; put and delete wrap errors with their operation\n * first, so they never reach this hook. Loaded only when a handler throws\n * something other than a `CliError`.\n *\n * @see https://github.com/hugomrdias/agents/blob/main/docs/agent-cli/framework-design.md#output-and-errors\n */\nexport default function mapError(error: unknown): CliError | undefined {\n for (const cause of causes(error)) {\n if (TIMEOUT.has(cause.name)) {\n return new CliError({\n code: 'timeout',\n message: `A request timed out: ${firstLine(cause)}`,\n cause: error,\n })\n }\n if (UNAVAILABLE.has(cause.name)) {\n return new CliError({\n code: 'service_unavailable',\n message: `A service did not respond: ${firstLine(cause)}`,\n cause: error,\n })\n }\n }\n return undefined\n}\n"],
5
+ "mappings": ";wCAGA,IAAMA,EAAc,IAAI,IAAI,CAC1B,mBACA,kBACA,wBACA,eACA,aACA,8BACA,mBACA,uBACF,CAAC,EAGKC,EAAU,IAAI,IAAI,CAAC,cAAc,CAAC,EAGxC,SAAUC,EAAOC,EAAkC,CACjD,IAAIC,EAAUD,EACd,QAASE,EAAQ,EAAGD,aAAmB,OAASC,EAAQ,GAAIA,IAC1D,MAAMD,EACNA,EAAUA,EAAQ,KAEtB,CAGO,SAASE,EAAUH,EAAsB,CAC9C,OAAOA,EAAM,QAAQ,MAAM;AAAA,CAAI,EAAE,CAAC,GAAKA,EAAM,IAC/C,CAWe,SAARI,EAA0BJ,EAAsC,CACrE,QAAWK,KAASN,EAAOC,CAAK,EAAG,CACjC,GAAIF,EAAQ,IAAIO,EAAM,IAAI,EACxB,OAAO,IAAIC,EAAS,CAClB,KAAM,UACN,QAAS,wBAAwBH,EAAUE,CAAK,CAAC,GACjD,MAAOL,CACT,CAAC,EAEH,GAAIH,EAAY,IAAIQ,EAAM,IAAI,EAC5B,OAAO,IAAIC,EAAS,CAClB,KAAM,sBACN,QAAS,8BAA8BH,EAAUE,CAAK,CAAC,GACvD,MAAOL,CACT,CAAC,CAEL,CAEF",
6
+ "names": ["UNAVAILABLE", "TIMEOUT", "causes", "error", "current", "depth", "firstLine", "mapError", "cause", "CliError"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a as w}from"./chunk-AKXAQJ6H.js";import{a as y,b as M}from"./chunk-YVRWI5E3.js";import{C as L,F as g,L as J,M as _,N as S,O as T,Q as b,R as z,S as F,T as B,U as v}from"./chunk-72RYXITT.js";import{k as p,o as E,p as I,q as l}from"./chunk-JUFFOBKU.js";import{p as m,q as $}from"./chunk-3TJUKWFC.js";import{createReadStream as j}from"node:fs";import{rm as q,stat as k}from"node:fs/promises";import{basename as Q,join as X,resolve as V}from"node:path";var G={source:"filecoin"},K={source:"filecoin",withIPFSIndexing:""},Y=96;async function H(e){let t=V(e.path),i=await k(t).catch(()=>{});if(!i||!(i.isFile()||i.isDirectory()))throw I(`No file or directory at ${e.path}.`,"path");let r=e.name??Q(t);return i.isDirectory()?{sourcePath:t,kind:"folder",name:r}:(C(i.size),{sourcePath:t,kind:"file",name:r,size:i.size})}async function ve(e,t){let i=await H(t),r=S(e.db,{action:"put",resourceRef:_("res"),chainId:e.chainId,payer:e.payer,input:{sourcePath:i.sourcePath,name:i.name,kind:i.kind,providerId:t.providerId?.toString()}});return await N(e,r.id)}async function Se(e){let t=await H(e),i;if(t.kind==="file")i={kind:"file",name:t.name,size:t.size??0,files:1};else{let d=await w(t.sourcePath);C(d.size),i={kind:"folder",name:t.name,size:d.size,files:d.files,rootCid:d.rootCid.toString()}}if(!e.backend)return i;let r=await e.backend.selectPlacement({metadata:P(i.kind),providerId:e.providerId}),a=await e.backend.quote({size:i.size,placement:r});return{...i,placement:r,quote:a}}async function N(e,t){let i=T(e.db,t);if(!i)throw l(`Operation ${t} not found.`);if(i.executionStatus==="completed")return x(e,i);let r=z(e.db,t);try{return e.onOperation?.(r),r.action==="put"?await te(e,r):await ae(e,r)}catch(a){throw b(e.db,r.id,{executionStatus:"failed",pid:null,error:e.signal?.aborted?"Interrupted":a instanceof Error?a.message:String(a)}),e.signal?.aborted?a:E(a,r.id)}finally{F(r.id)}}function x(e,t){let i=v(e.db,t.resourceRef);if(!i)throw l(`Resource ${t.resourceRef} of ${t.id} no longer exists.`);return Z(e,t,i)}function Z(e,t,i){return{operationId:t.id,state:t.action==="put"?"ready":"removal_pending",resource:i,urls:M(i,e.apiUrl)}}function W(e,t,i,r={}){J(e.db,()=>{B(e.db,i),b(e.db,t.id,{executionStatus:"completed",phase:"done",pid:null,error:null,checkpoint:r})})}function C(e){if(e<g.MIN_UPLOAD_SIZE||e>g.MAX_UPLOAD_SIZE)throw I(`Content must be between ${g.MIN_UPLOAD_SIZE} and ${g.MAX_UPLOAD_SIZE} bytes; got ${e}.`,"path")}function P(e){return e==="folder"?K:G}async function ee(e,t){let i=j(e,{signal:t});return(await L(i)).toString()}function u(e,t,i,r){return b(e.db,t.id,{checkpoint:i,...r?{phase:r}:{}})}async function te(e,t){let{input:i}=t,r=i.kind??"file",a=i.name??"upload",d=e.signal;if(!i.sourcePath)throw new Error(`Operation ${t.id} has no source.`);let s=i.sourcePath;if(r==="folder"&&(s=X(e.stagingDir(t.id),"folder.car"),!await k(s).catch(()=>{}))){if(t.checkpoint.pieceCid)throw new m({code:p.stagingMissing,message:`The staged CAR of ${t.id} is missing, so it cannot be resumed.`,next:[{by:"agent",command:`filecoin put ${i.sourcePath}`,description:"Start a new put of the same directory"}]});t=u(e,t,{},"packing"),e.progress?.({phase:"packing",message:`Packing ${i.sourcePath}`});let D=await w(i.sourcePath,s);t=u(e,t,{rootCid:D.rootCid.toString(),size:D.size})}d?.throwIfAborted();let c=(await k(s)).size;C(c),e.progress?.({phase:"hashing",message:"Computing PieceCID"});let o=await ee(s,d);if(t.checkpoint.pieceCid&&t.checkpoint.pieceCid!==o)throw new m({code:p.sourceChanged,message:`${s} changed since operation ${t.id} started.`,next:[{by:"agent",command:`filecoin put ${i.sourcePath}`,description:"Start a new put with the current content"}]});t=u(e,t,{pieceCid:o,size:c},"storing");let n=ne(t.checkpoint);if(!n){e.progress?.({phase:"placing",message:"Selecting a storage provider"}),n=await e.backend.selectPlacement({metadata:P(r),providerId:i.providerId?BigInt(i.providerId):void 0});let h=await e.backend.quote({size:c,placement:n});if(!h.ready)throw re(h);t=u(e,t,{providerId:n.providerId.toString(),serviceURL:n.serviceURL,payee:n.payee,...n.dataSetId==null?{}:{dataSetId:n.dataSetId.toString(),clientDataSetId:n.clientDataSetId?.toString()}})}t.checkpoint.commit||t.checkpoint.stored||(await e.backend.hasPiece({serviceURL:n.serviceURL,pieceCid:o})||(e.progress?.({phase:"uploading",message:`Uploading ${c} bytes to provider ${n.providerId}`}),await e.backend.upload({serviceURL:n.serviceURL,path:s,size:c,pieceCid:o})),t=u(e,t,{stored:!0}));let R=y({apiUrl:e.apiUrl,chainId:t.chainId,pieceCid:o,rootCid:t.checkpoint.rootCid,providerId:n.providerId.toString()}),U=()=>e.progress?.({phase:"link",message:R.browser,data:{pieceCid:o,urls:R}});r==="file"&&U();let f=await ie(e,t,n,{pieceCid:o,name:a},r==="folder"?U:void 0),O=y({apiUrl:e.apiUrl,chainId:t.chainId,pieceCid:o,rootCid:t.checkpoint.rootCid}),A={ref:t.resourceRef,kind:r,name:a,chainId:t.chainId,payer:t.payer,pieceCid:o,...t.checkpoint.rootCid?{rootCid:t.checkpoint.rootCid}:{},size:c,copies:[{providerId:n.providerId.toString(),dataSetId:f.dataSetId.toString(),pieceId:f.pieceId.toString(),serviceURL:n.serviceURL}],url:O.browser,status:"active",createdAt:new Date().toISOString()};return W(e,t,A,{dataSetId:f.dataSetId.toString(),pieceId:f.pieceId.toString()}),r==="folder"&&await q(e.stagingDir(t.id),{recursive:!0,force:!0}).catch(()=>{}),{operationId:t.id,state:"ready",resource:A,urls:O}}async function ie(e,t,i,r,a){let d={name:r.name.slice(0,Y),...t.checkpoint.rootCid?{ipfsRootCID:t.checkpoint.rootCid}:{}},s=t.checkpoint.commit;if(s){let n=await e.backend.findCommit({nonce:BigInt(s.nonce)});if(n)return n}t=u(e,t,{},"committing");let c=s;if(c||(e.progress?.({phase:"committing",message:"Signing the commit"}),c=await e.backend.signCommit({placement:i,pieceCid:r.pieceCid,metadata:P(t.input.kind??"file"),pieceMetadata:d}),t=u(e,t,{commit:c})),!t.checkpoint.statusUrl){e.progress?.({phase:"committing",message:c.created?"Creating data set and adding piece":"Adding piece"});let n=await e.backend.submitCommit({placement:i,pieceCid:r.pieceCid,commit:c,pieceMetadata:d});t=u(e,t,{statusUrl:n.statusUrl,transactionHash:n.transactionHash})}a?.();let{transactionHash:o}=t.checkpoint;e.progress?.({phase:"committing",message:o?`Waiting for confirmation of transaction ${o}`:"Waiting for on-chain confirmation",...o?{data:{transactionHash:o}}:{}});try{return await e.backend.waitForCommit({statusUrl:t.checkpoint.statusUrl,created:c.created})}catch(n){throw $(n)&&n.code===p.commitRejected&&u(e,t,{statusUrl:void 0,transactionHash:void 0}),n}}function re(e){return new m({code:p.insufficientFunds,message:e.needsApproval?"The payer must deposit USDFC and approve Warm Storage before uploading.":"The payer must deposit more USDFC before uploading.",details:{fundingUrl:e.fundingUrl,depositNeeded:e.depositNeeded.toString(),needsApproval:e.needsApproval},next:[{by:"user",description:`Fund the account at ${e.fundingUrl}`}]})}function ne(e){if(e.providerId&&e.serviceURL&&e.payee)return{providerId:BigInt(e.providerId),serviceURL:e.serviceURL,payee:e.payee,...e.dataSetId&&e.clientDataSetId?{dataSetId:BigInt(e.dataSetId),clientDataSetId:BigInt(e.clientDataSetId)}:{}}}async function we(e,t){let i=v(e.db,t,e);if(!i)throw l(`No managed resource ${t} for this account.`,{by:"agent",command:"filecoin ls",description:"List managed resources"});if(i.status!=="active")throw I(`${t} is already pending removal.`,"ref");let[r]=i.copies;if(!r)throw new Error(`Resource ${t} has no stored copies.`);let a=S(e.db,{action:"delete",resourceRef:t,chainId:e.chainId,payer:e.payer,input:{},checkpoint:{providerId:r.providerId,serviceURL:r.serviceURL,dataSetId:r.dataSetId,pieceId:r.pieceId}});return await N(e,a.id)}async function ae(e,t){let i=v(e.db,t.resourceRef);if(!i)throw l(`Resource ${t.resourceRef} no longer exists.`);let{serviceURL:r,dataSetId:a,pieceId:d}=t.checkpoint;if(!(r&&a&&d))throw new Error(`Operation ${t.id} is missing its removal target.`);if(!t.checkpoint.transactionHash){t=u(e,t,{},"removing"),e.progress?.({phase:"removing",message:`Scheduling removal of piece ${d}`});let{transactionHash:n}=await e.backend.schedulePieceRemoval({serviceURL:r,dataSetId:BigInt(a),pieceId:BigInt(d)});t=u(e,t,{transactionHash:n})}let s=t.checkpoint.transactionHash;if(e.progress?.({phase:"removing",message:`Waiting for confirmation of removal transaction ${s}`,data:{transactionHash:s}}),(await e.backend.waitForTransaction(s)).status!=="success")throw u(e,t,{transactionHash:void 0}),new m({code:p.removalReverted,message:`Removal transaction ${s} reverted; the piece is still stored.`});let o={...i,status:"removal_pending"};return W(e,t,o),Z(e,t,o)}export{ve as a,Se as b,N as c,x as d,we as e};
3
+ //# sourceMappingURL=chunk-GCPUMM4E.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/storage/jobs.ts"],
4
+ "sourcesContent": ["import { createReadStream } from 'node:fs'\nimport { rm, stat } from 'node:fs/promises'\nimport { basename, join, resolve } from 'node:path'\nimport type { DatabaseSync } from 'node:sqlite'\nimport * as Piece from '@filoz/synapse-core/piece'\nimport { SIZE_CONSTANTS } from '@filoz/synapse-core/utils'\nimport { CliError, isCliError } from 'clipact'\nimport {\n ErrorCodes,\n invalidInput,\n notFound,\n operationError,\n} from '../errors.ts'\nimport { transaction } from '../state/db.ts'\nimport { createId } from '../state/ids.ts'\nimport {\n acquireOperation,\n type Checkpoint,\n createOperation,\n getOperation,\n type Operation,\n releaseOperation,\n updateOperation,\n} from '../state/operations.ts'\nimport { getResource, type Resource, saveResource } from '../state/resources.ts'\nimport { packDirectory } from './pack.ts'\nimport type {\n CommittedPiece,\n Placement,\n StorageBackend,\n UploadQuote,\n} from './types.ts'\nimport { type RetrievalUrls, resourceUrls, retrievalUrls } from './urls.ts'\n\n/** Data-set metadata namespacing CLI uploads of raw files. */\nexport const FILE_DATA_SET_METADATA = { source: 'filecoin' }\n\n/**\n * Data-set metadata for folders. `withIPFSIndexing` asks Curio to index\n * the CAR so `/ipfs/<rootCid>` retrieval works.\n */\nexport const FOLDER_DATA_SET_METADATA = {\n source: 'filecoin',\n withIPFSIndexing: '',\n}\n\n/** Longest metadata value FWSS accepts. */\nconst MAX_METADATA_VALUE = 96\n\n/**\n * A step of a job, reported as progress. `link` is not a step: it reports\n * the retrieval link as soon as it works, before the commit confirms.\n */\nexport type JobPhase =\n | 'packing'\n | 'hashing'\n | 'placing'\n | 'uploading'\n | 'link'\n | 'committing'\n | 'removing'\n\n/** Everything a put or delete job needs besides its saved record. */\nexport type JobContext = {\n db: DatabaseSync\n backend: StorageBackend\n chainId: string\n payer: string\n /** filecoin-api origin for retrieval links. */\n apiUrl: string\n /** Staging directory for an operation. */\n stagingDir: (operationId: string) => string\n /** Aborted on SIGINT, SIGTERM, or SIGHUP; stops at the next step. */\n signal?: AbortSignal\n /** Progress for the caller to report on stderr. */\n progress?: (event: {\n phase: JobPhase\n message: string\n data?: Record<string, unknown>\n }) => void\n /** Called once the job's operation is saved and locked. */\n onOperation?: (operation: Operation) => void\n}\n\n/** Outcome of a put or delete, shaped for command output. */\nexport type JobResult = {\n operationId: string\n state: 'ready' | 'removal_pending'\n resource: Resource\n urls: RetrievalUrls\n}\n\n/** Options for {@link startPut}. */\nexport type StartPutOptions = {\n path: string\n name?: string | undefined\n providerId?: bigint | undefined\n}\n\n/** A file or directory checked for a put. */\ntype PutSource = {\n sourcePath: string\n kind: 'file' | 'folder'\n name: string\n /** Bytes of a file; directories are sized after packing. */\n size?: number\n}\n\n/** Check that `path` is a storable file or directory. */\nasync function inspectSource(options: StartPutOptions): Promise<PutSource> {\n const sourcePath = resolve(options.path)\n const stats = await stat(sourcePath).catch(() => undefined)\n if (!stats || !(stats.isFile() || stats.isDirectory())) {\n throw invalidInput(`No file or directory at ${options.path}.`, 'path')\n }\n const name = options.name ?? basename(sourcePath)\n if (stats.isDirectory()) return { sourcePath, kind: 'folder', name }\n assertPieceSize(stats.size)\n return { sourcePath, kind: 'file', name, size: stats.size }\n}\n\n/**\n * Validate the input, save a new put operation before any external mutation,\n * then run it.\n */\nexport async function startPut(\n ctx: JobContext,\n options: StartPutOptions\n): Promise<JobResult> {\n const source = await inspectSource(options)\n const op = createOperation(ctx.db, {\n action: 'put',\n resourceRef: createId('res'),\n chainId: ctx.chainId,\n payer: ctx.payer,\n input: {\n sourcePath: source.sourcePath,\n name: source.name,\n kind: source.kind,\n providerId: options.providerId?.toString(),\n },\n })\n return await runOperation(ctx, op.id)\n}\n\n/** What a put would do, from {@link estimatePut}. */\nexport type PutEstimate = {\n kind: 'file' | 'folder'\n name: string\n /** Bytes to store: the file, or the packed CAR. */\n size: number\n /** Files in a directory; 1 for a file. */\n files: number\n /** IPFS root CID of a directory. */\n rootCid?: string\n /** Chosen provider and quote, when a session key is available. */\n placement?: Placement\n quote?: UploadQuote\n}\n\n/** Options for {@link estimatePut}. */\nexport type EstimatePutOptions = StartPutOptions & {\n /** Prices the upload; omitted when not logged in. */\n backend?: StorageBackend | undefined\n}\n\n/**\n * Describe a put without side effects on providers or the chain: content\n * inventory, stored size, and, with a backend, the provider it would use and\n * what it would cost. Directories are packed only to measure the CAR;\n * nothing is written to disk.\n */\nexport async function estimatePut(\n options: EstimatePutOptions\n): Promise<PutEstimate> {\n const source = await inspectSource(options)\n let estimate: PutEstimate\n if (source.kind === 'file') {\n estimate = {\n kind: 'file',\n name: source.name,\n size: source.size ?? 0,\n files: 1,\n }\n } else {\n const packed = await packDirectory(source.sourcePath)\n assertPieceSize(packed.size)\n estimate = {\n kind: 'folder',\n name: source.name,\n size: packed.size,\n files: packed.files,\n rootCid: packed.rootCid.toString(),\n }\n }\n if (!options.backend) return estimate\n const placement = await options.backend.selectPlacement({\n metadata: metadataFor(estimate.kind),\n providerId: options.providerId,\n })\n const quote = await options.backend.quote({ size: estimate.size, placement })\n return { ...estimate, placement, quote }\n}\n\n/**\n * Run or resume an operation. A completed operation returns its saved\n * outcome. Otherwise this takes the execution lock, continues from the saved\n * checkpoint, and records failures so the job can be resumed with\n * `filecoin operations resume`.\n */\nexport async function runOperation(\n ctx: JobContext,\n operationId: string\n): Promise<JobResult> {\n const saved = getOperation(ctx.db, operationId)\n if (!saved) throw notFound(`Operation ${operationId} not found.`)\n if (saved.executionStatus === 'completed') return savedOutcome(ctx, saved)\n const op = acquireOperation(ctx.db, operationId)\n try {\n ctx.onOperation?.(op)\n return op.action === 'put'\n ? await runPut(ctx, op)\n : await runRemove(ctx, op)\n } catch (error) {\n updateOperation(ctx.db, op.id, {\n executionStatus: 'failed',\n pid: null,\n error: ctx.signal?.aborted\n ? 'Interrupted'\n : error instanceof Error\n ? error.message\n : String(error),\n })\n // clipact reports an interruption itself, with the checkpoint's steps.\n if (ctx.signal?.aborted) throw error\n throw operationError(error, op.id)\n } finally {\n releaseOperation(op.id)\n }\n}\n\n/** The saved outcome of a completed operation; nothing is re-run. */\nexport function savedOutcome(\n ctx: Pick<JobContext, 'db' | 'apiUrl'>,\n op: Operation\n): JobResult {\n const resource = getResource(ctx.db, op.resourceRef)\n if (!resource) {\n throw notFound(`Resource ${op.resourceRef} of ${op.id} no longer exists.`)\n }\n return jobResult(ctx, op, resource)\n}\n\n/** Shape a finished operation and its resource for command output. */\nfunction jobResult(\n ctx: Pick<JobContext, 'apiUrl'>,\n op: Operation,\n resource: Resource\n): JobResult {\n return {\n operationId: op.id,\n state: op.action === 'put' ? 'ready' : 'removal_pending',\n resource,\n urls: resourceUrls(resource, ctx.apiUrl),\n }\n}\n\n/**\n * Save the resource and mark the operation completed in one transaction, so\n * a stop at this point leaves a finished job, never a half-finished one.\n */\nfunction complete(\n ctx: JobContext,\n op: Operation,\n resource: Resource,\n checkpoint: Checkpoint = {}\n): void {\n transaction(ctx.db, () => {\n saveResource(ctx.db, resource)\n updateOperation(ctx.db, op.id, {\n executionStatus: 'completed',\n phase: 'done',\n pid: null,\n error: null,\n checkpoint,\n })\n })\n}\n\n/** Reject sizes outside the PDP piece limits. */\nfunction assertPieceSize(size: number): void {\n if (\n size < SIZE_CONSTANTS.MIN_UPLOAD_SIZE ||\n size > SIZE_CONSTANTS.MAX_UPLOAD_SIZE\n ) {\n throw invalidInput(\n `Content must be between ${SIZE_CONSTANTS.MIN_UPLOAD_SIZE} and ${SIZE_CONSTANTS.MAX_UPLOAD_SIZE} bytes; got ${size}.`,\n 'path'\n )\n }\n}\n\n/** Data-set metadata for a resource kind. */\nfunction metadataFor(kind: 'file' | 'folder') {\n return kind === 'folder' ? FOLDER_DATA_SET_METADATA : FILE_DATA_SET_METADATA\n}\n\n/**\n * Compute the PieceCID of a file by streaming it. Aborting `signal` destroys\n * the read stream, which stops the hashing.\n */\nasync function pieceCidOf(path: string, signal?: AbortSignal): Promise<string> {\n const stream = createReadStream(path, { signal })\n return (await Piece.calculate(stream)).toString()\n}\n\n/** Save checkpoint fields and return the updated operation. */\nfunction save(\n ctx: JobContext,\n op: Operation,\n checkpoint: Checkpoint,\n phase?: Operation['phase']\n): Operation {\n return updateOperation(ctx.db, op.id, {\n checkpoint,\n ...(phase ? { phase } : {}),\n })\n}\n\n/**\n * Put steps: pack (folders), identify, place, upload, commit, record. Each\n * step saves its result first, so a resumed job skips completed work and\n * never sends a second commit for the same content.\n */\nasync function runPut(ctx: JobContext, op: Operation): Promise<JobResult> {\n const { input } = op\n const kind = input.kind ?? 'file'\n const name = input.name ?? 'upload'\n const signal = ctx.signal\n if (!input.sourcePath) throw new Error(`Operation ${op.id} has no source.`)\n\n // Prepare the bytes to store.\n let uploadPath = input.sourcePath\n if (kind === 'folder') {\n uploadPath = join(ctx.stagingDir(op.id), 'folder.car')\n const staged = await stat(uploadPath).catch(() => undefined)\n if (!staged) {\n if (op.checkpoint.pieceCid) {\n throw new CliError({\n code: ErrorCodes.stagingMissing,\n message: `The staged CAR of ${op.id} is missing, so it cannot be resumed.`,\n next: [\n {\n by: 'agent',\n command: `filecoin put ${input.sourcePath}`,\n description: 'Start a new put of the same directory',\n },\n ],\n })\n }\n op = save(ctx, op, {}, 'packing')\n ctx.progress?.({\n phase: 'packing',\n message: `Packing ${input.sourcePath}`,\n })\n const packed = await packDirectory(input.sourcePath, uploadPath)\n op = save(ctx, op, {\n rootCid: packed.rootCid.toString(),\n size: packed.size,\n })\n }\n }\n\n signal?.throwIfAborted()\n const size = (await stat(uploadPath)).size\n assertPieceSize(size)\n ctx.progress?.({ phase: 'hashing', message: 'Computing PieceCID' })\n const pieceCid = await pieceCidOf(uploadPath, signal)\n if (op.checkpoint.pieceCid && op.checkpoint.pieceCid !== pieceCid) {\n throw new CliError({\n code: ErrorCodes.sourceChanged,\n message: `${uploadPath} changed since operation ${op.id} started.`,\n next: [\n {\n by: 'agent',\n command: `filecoin put ${input.sourcePath}`,\n description: 'Start a new put with the current content',\n },\n ],\n })\n }\n op = save(ctx, op, { pieceCid, size }, 'storing')\n\n // Choose a provider once; resumes reuse it.\n let placement = placementOf(op.checkpoint)\n if (!placement) {\n ctx.progress?.({\n phase: 'placing',\n message: 'Selecting a storage provider',\n })\n placement = await ctx.backend.selectPlacement({\n metadata: metadataFor(kind),\n providerId: input.providerId ? BigInt(input.providerId) : undefined,\n })\n const quote = await ctx.backend.quote({ size, placement })\n if (!quote.ready) throw insufficientFunds(quote)\n op = save(ctx, op, {\n providerId: placement.providerId.toString(),\n serviceURL: placement.serviceURL,\n payee: placement.payee,\n ...(placement.dataSetId == null\n ? {}\n : {\n dataSetId: placement.dataSetId.toString(),\n clientDataSetId: placement.clientDataSetId?.toString(),\n }),\n })\n }\n\n // Upload unless the provider already has the piece.\n if (!(op.checkpoint.commit || op.checkpoint.stored)) {\n const present = await ctx.backend.hasPiece({\n serviceURL: placement.serviceURL,\n pieceCid,\n })\n if (!present) {\n ctx.progress?.({\n phase: 'uploading',\n message: `Uploading ${size} bytes to provider ${placement.providerId}`,\n })\n await ctx.backend.upload({\n serviceURL: placement.serviceURL,\n path: uploadPath,\n size,\n pieceCid,\n })\n }\n op = save(ctx, op, { stored: true })\n }\n\n // Links that work before the commit confirms. The provider hint makes\n // filecoin-api redirect to the provider, which serves a parked piece at once.\n // A folder's browser link needs Curio's IPFS index, which Curio starts\n // building when it receives the commit, so it is reported after sending.\n const early = retrievalUrls({\n apiUrl: ctx.apiUrl,\n chainId: op.chainId,\n pieceCid,\n rootCid: op.checkpoint.rootCid,\n providerId: placement.providerId.toString(),\n })\n const reportLink = () =>\n ctx.progress?.({\n phase: 'link',\n message: early.browser,\n data: { pieceCid, urls: early },\n })\n if (kind === 'file') reportLink()\n\n const committed = await commit(\n ctx,\n op,\n placement,\n { pieceCid, name },\n kind === 'folder' ? reportLink : undefined\n )\n\n // Once committed, the indexer ranks the copies; the links need no hint.\n const urls = retrievalUrls({\n apiUrl: ctx.apiUrl,\n chainId: op.chainId,\n pieceCid,\n rootCid: op.checkpoint.rootCid,\n })\n\n const resource: Resource = {\n ref: op.resourceRef,\n kind,\n name,\n chainId: op.chainId,\n payer: op.payer,\n pieceCid,\n ...(op.checkpoint.rootCid ? { rootCid: op.checkpoint.rootCid } : {}),\n size,\n copies: [\n {\n providerId: placement.providerId.toString(),\n dataSetId: committed.dataSetId.toString(),\n pieceId: committed.pieceId.toString(),\n serviceURL: placement.serviceURL,\n },\n ],\n url: urls.browser,\n status: 'active',\n createdAt: new Date().toISOString(),\n }\n complete(ctx, op, resource, {\n dataSetId: committed.dataSetId.toString(),\n pieceId: committed.pieceId.toString(),\n })\n if (kind === 'folder') {\n await rm(ctx.stagingDir(op.id), { recursive: true, force: true }).catch(\n () => undefined\n )\n }\n return { operationId: op.id, state: 'ready', resource, urls }\n}\n\n/**\n * Commit the stored piece on chain exactly once. The commit is signed with a\n * fresh nonce and saved before it is sent. A resume first asks FWSS whether\n * that nonce was used; if so, the commit landed and nothing is sent. If not,\n * the same signature is sent again, and FWSS rejects any second use of its\n * nonce, so at most one commit takes effect.\n *\n * @see https://github.com/filecoin-project/agents/issues/1\n */\nasync function commit(\n ctx: JobContext,\n op: Operation,\n placement: Placement,\n piece: { pieceCid: string; name: string },\n onSent?: () => void\n): Promise<CommittedPiece> {\n const pieceMetadata: Record<string, string> = {\n name: piece.name.slice(0, MAX_METADATA_VALUE),\n ...(op.checkpoint.rootCid ? { ipfsRootCID: op.checkpoint.rootCid } : {}),\n }\n const saved = op.checkpoint.commit\n if (saved) {\n const landed = await ctx.backend.findCommit({ nonce: BigInt(saved.nonce) })\n if (landed) return landed\n }\n\n op = save(ctx, op, {}, 'committing')\n let signed = saved\n if (!signed) {\n ctx.progress?.({ phase: 'committing', message: 'Signing the commit' })\n signed = await ctx.backend.signCommit({\n placement,\n pieceCid: piece.pieceCid,\n metadata: metadataFor(op.input.kind ?? 'file'),\n pieceMetadata,\n })\n op = save(ctx, op, { commit: signed })\n }\n\n if (!op.checkpoint.statusUrl) {\n ctx.progress?.({\n phase: 'committing',\n message: signed.created\n ? 'Creating data set and adding piece'\n : 'Adding piece',\n })\n const submission = await ctx.backend.submitCommit({\n placement,\n pieceCid: piece.pieceCid,\n commit: signed,\n pieceMetadata,\n })\n op = save(ctx, op, {\n statusUrl: submission.statusUrl,\n transactionHash: submission.transactionHash,\n })\n }\n\n onSent?.()\n // clipact repeats this line with the elapsed time while the wait lasts, so\n // the user can look the transaction up meanwhile.\n const { transactionHash } = op.checkpoint\n ctx.progress?.({\n phase: 'committing',\n message: transactionHash\n ? `Waiting for confirmation of transaction ${transactionHash}`\n : 'Waiting for on-chain confirmation',\n ...(transactionHash ? { data: { transactionHash } } : {}),\n })\n try {\n return await ctx.backend.waitForCommit({\n statusUrl: op.checkpoint.statusUrl as string,\n created: signed.created,\n })\n } catch (error) {\n if (isCliError(error) && error.code === ErrorCodes.commitRejected) {\n // A failed transaction leaves the nonce unused; forget its status so a\n // resume sends the same signature again.\n save(ctx, op, { statusUrl: undefined, transactionHash: undefined })\n }\n throw error\n }\n}\n\n/** Error returned when the payer cannot cover an upload. */\nfunction insufficientFunds(quote: UploadQuote): CliError {\n return new CliError({\n code: ErrorCodes.insufficientFunds,\n message: quote.needsApproval\n ? 'The payer must deposit USDFC and approve Warm Storage before uploading.'\n : 'The payer must deposit more USDFC before uploading.',\n details: {\n fundingUrl: quote.fundingUrl,\n depositNeeded: quote.depositNeeded.toString(),\n needsApproval: quote.needsApproval,\n },\n next: [\n {\n by: 'user',\n description: `Fund the account at ${quote.fundingUrl}`,\n },\n ],\n })\n}\n\n/** Rebuild a saved placement from a checkpoint. */\nfunction placementOf(checkpoint: Checkpoint): Placement | undefined {\n if (!(checkpoint.providerId && checkpoint.serviceURL && checkpoint.payee)) {\n return undefined\n }\n return {\n providerId: BigInt(checkpoint.providerId),\n serviceURL: checkpoint.serviceURL,\n payee: checkpoint.payee as `0x${string}`,\n ...(checkpoint.dataSetId && checkpoint.clientDataSetId\n ? {\n dataSetId: BigInt(checkpoint.dataSetId),\n clientDataSetId: BigInt(checkpoint.clientDataSetId),\n }\n : {}),\n }\n}\n\n/**\n * Save a new delete operation for a managed resource, then run it.\n */\nexport async function startRemove(\n ctx: JobContext,\n ref: string\n): Promise<JobResult> {\n const resource = getResource(ctx.db, ref, ctx)\n if (!resource) {\n throw notFound(`No managed resource ${ref} for this account.`, {\n by: 'agent',\n command: 'filecoin ls',\n description: 'List managed resources',\n })\n }\n if (resource.status !== 'active') {\n throw invalidInput(`${ref} is already pending removal.`, 'ref')\n }\n const [copy] = resource.copies\n if (!copy) throw new Error(`Resource ${ref} has no stored copies.`)\n const op = createOperation(ctx.db, {\n action: 'delete',\n resourceRef: ref,\n chainId: ctx.chainId,\n payer: ctx.payer,\n input: {},\n checkpoint: {\n providerId: copy.providerId,\n serviceURL: copy.serviceURL,\n dataSetId: copy.dataSetId,\n pieceId: copy.pieceId,\n },\n })\n return await runOperation(ctx, op.id)\n}\n\n/**\n * Schedule removal of the resource's piece and wait for the transaction.\n * The provider deletes the data at its next proving boundary, so the result\n * is `removal_pending`. A reverted transaction leaves the resource active.\n */\nasync function runRemove(ctx: JobContext, op: Operation): Promise<JobResult> {\n const resource = getResource(ctx.db, op.resourceRef)\n if (!resource) throw notFound(`Resource ${op.resourceRef} no longer exists.`)\n const { serviceURL, dataSetId, pieceId } = op.checkpoint\n if (!(serviceURL && dataSetId && pieceId)) {\n throw new Error(`Operation ${op.id} is missing its removal target.`)\n }\n if (!op.checkpoint.transactionHash) {\n op = save(ctx, op, {}, 'removing')\n ctx.progress?.({\n phase: 'removing',\n message: `Scheduling removal of piece ${pieceId}`,\n })\n const { transactionHash } = await ctx.backend.schedulePieceRemoval({\n serviceURL,\n dataSetId: BigInt(dataSetId),\n pieceId: BigInt(pieceId),\n })\n op = save(ctx, op, { transactionHash })\n }\n const hash = op.checkpoint.transactionHash as `0x${string}`\n ctx.progress?.({\n phase: 'removing',\n message: `Waiting for confirmation of removal transaction ${hash}`,\n data: { transactionHash: hash },\n })\n const receipt = await ctx.backend.waitForTransaction(hash)\n if (receipt.status !== 'success') {\n // The reverted transaction had no effect; a resume signs a new one.\n save(ctx, op, { transactionHash: undefined })\n throw new CliError({\n code: ErrorCodes.removalReverted,\n message: `Removal transaction ${hash} reverted; the piece is still stored.`,\n })\n }\n const updated: Resource = { ...resource, status: 'removal_pending' }\n complete(ctx, op, updated)\n return jobResult(ctx, op, updated)\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["createReadStream", "rm", "stat", "basename", "join", "resolve", "FILE_DATA_SET_METADATA", "FOLDER_DATA_SET_METADATA", "MAX_METADATA_VALUE", "inspectSource", "options", "sourcePath", "resolve", "stats", "stat", "invalidInput", "name", "basename", "assertPieceSize", "startPut", "ctx", "source", "op", "createOperation", "createId", "runOperation", "estimatePut", "estimate", "packed", "packDirectory", "placement", "metadataFor", "quote", "operationId", "saved", "getOperation", "notFound", "savedOutcome", "acquireOperation", "runPut", "runRemove", "error", "updateOperation", "operationError", "releaseOperation", "resource", "getResource", "jobResult", "resourceUrls", "complete", "checkpoint", "transaction", "saveResource", "size", "SIZE_CONSTANTS", "kind", "pieceCidOf", "path", "signal", "stream", "createReadStream", "calculate", "save", "phase", "input", "uploadPath", "join", "CliError", "ErrorCodes", "pieceCid", "placementOf", "insufficientFunds", "early", "retrievalUrls", "reportLink", "committed", "commit", "urls", "rm", "piece", "onSent", "pieceMetadata", "landed", "signed", "submission", "transactionHash", "isCliError", "startRemove", "ref", "copy", "serviceURL", "dataSetId", "pieceId", "hash", "updated"]
7
+ }
@@ -0,0 +1,4 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{C as z,a as e,b as a,c as l,e as u,f as s,g as c,i as o,k as t,u as m,v as d,w as p}from"./chunk-JUFFOBKU.js";import{d as i}from"./chunk-3TJUKWFC.js";var v=i({name:"ls",description:"List managed resources, newest first",examples:["filecoin ls","filecoin ls --all --limit 50"],input:c({...p,all:l().default(!1).describe("Include resources pending removal"),...m}),env:d,secrets:["sessionKey"],output:s({network:e(),resources:u(s({ref:e(),kind:o(["file","folder"]),name:e(),size:a().int(),status:o(["active","removal_pending"]),url:e().describe("filecoin-api link a browser renders"),createdAt:e()})),nextCursor:e().optional()}),errors:[t.authRequired,t.loginPending],readOnly:!0,human:n=>n.resources.length===0?`No resources on ${n.network}.`:[...n.resources.map(r=>`${r.ref} ${r.kind.padEnd(8)} ${z(r.size).padStart(10)} ${r.name}${r.status==="active"?"":` (${r.status})`}`),...n.nextCursor?[`more: --cursor ${n.nextCursor}`]:[]].join(`
3
+ `),handler:()=>import("./ls-F546AXRG.js")});export{v as a};
4
+ //# sourceMappingURL=chunk-IAJFQYLN.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/ls.ts"],
4
+ "sourcesContent": ["import { defineCommand } from 'clipact'\nimport * as z from 'zod'\nimport { ErrorCodes } from '../errors.ts'\nimport { account, accountEnv, formatBytes, paging } from './shared.ts'\n\n/** `filecoin ls`: list managed resources, newest first, one page at a time. */\nexport const ls = defineCommand({\n name: 'ls',\n description: 'List managed resources, newest first',\n examples: ['filecoin ls', 'filecoin ls --all --limit 50'],\n input: z.strictObject({\n ...paging,\n all: z\n .boolean()\n .default(false)\n .describe('Include resources pending removal'),\n ...account,\n }),\n env: accountEnv,\n secrets: ['sessionKey'],\n output: z.object({\n network: z.string(),\n resources: z.array(\n z.object({\n ref: z.string(),\n kind: z.enum(['file', 'folder']),\n name: z.string(),\n size: z.number().int(),\n status: z.enum(['active', 'removal_pending']),\n url: z.string().describe('filecoin-api link a browser renders'),\n createdAt: z.string(),\n })\n ),\n nextCursor: z.string().optional(),\n }),\n errors: [ErrorCodes.authRequired, ErrorCodes.loginPending],\n readOnly: true,\n human: (data) =>\n data.resources.length === 0\n ? `No resources on ${data.network}.`\n : [\n ...data.resources.map(\n (r) =>\n `${r.ref} ${r.kind.padEnd(8)} ${formatBytes(r.size).padStart(10)} ${r.name}${r.status === 'active' ? '' : ` (${r.status})`}`\n ),\n ...(data.nextCursor ? [`more: --cursor ${data.nextCursor}`] : []),\n ].join('\\n'),\n handler: () => import('../handlers/ls.ts'),\n})\n"],
5
+ "mappings": ";6JAMO,IAAMA,EAAKC,EAAc,CAC9B,KAAM,KACN,YAAa,uCACb,SAAU,CAAC,cAAe,8BAA8B,EACxD,MAASC,EAAa,CACpB,GAAGC,EACH,IACGC,EAAQ,EACR,QAAQ,EAAK,EACb,SAAS,mCAAmC,EAC/C,GAAGC,CACL,CAAC,EACD,IAAKC,EACL,QAAS,CAAC,YAAY,EACtB,OAAUC,EAAO,CACf,QAAWC,EAAO,EAClB,UAAaC,EACTF,EAAO,CACP,IAAOC,EAAO,EACd,KAAQE,EAAK,CAAC,OAAQ,QAAQ,CAAC,EAC/B,KAAQF,EAAO,EACf,KAAQG,EAAO,EAAE,IAAI,EACrB,OAAUD,EAAK,CAAC,SAAU,iBAAiB,CAAC,EAC5C,IAAOF,EAAO,EAAE,SAAS,qCAAqC,EAC9D,UAAaA,EAAO,CACtB,CAAC,CACH,EACA,WAAcA,EAAO,EAAE,SAAS,CAClC,CAAC,EACD,OAAQ,CAACI,EAAW,aAAcA,EAAW,YAAY,EACzD,SAAU,GACV,MAAQC,GACNA,EAAK,UAAU,SAAW,EACtB,mBAAmBA,EAAK,OAAO,IAC/B,CACE,GAAGA,EAAK,UAAU,IACf,GACC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,OAAO,CAAC,CAAC,IAAIC,EAAY,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,SAAW,SAAW,GAAK,KAAK,EAAE,MAAM,GAAG,EAChI,EACA,GAAID,EAAK,WAAa,CAAC,kBAAkBA,EAAK,UAAU,EAAE,EAAI,CAAC,CACjE,EAAE,KAAK;AAAA,CAAI,EACjB,QAAS,IAAM,OAAO,kBAAmB,CAC3C,CAAC",
6
+ "names": ["ls", "defineCommand", "strictObject", "paging", "boolean", "account", "accountEnv", "object", "string", "array", "_enum", "number", "ErrorCodes", "data", "formatBytes"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a as o,f as s,g as t,m as c,u as m,v as i,z as n}from"./chunk-JUFFOBKU.js";import{d as r}from"./chunk-3TJUKWFC.js";var u=r({name:"delete",description:"Schedule removal of a managed resource",examples:["filecoin delete res_abc123","filecoin rm res_abc123 --yes"],input:t({ref:o().describe("Resource ref (res_\u2026)"),...m}),positionals:["ref"],env:i,secrets:["sessionKey"],output:s(n),errors:c,confirm:e=>`Schedules removal of ${e.ref}; the provider deletes the stored copy.`,human:e=>`Removal of ${e.resource.ref} (${e.resource.name}) scheduled.`,handler:()=>import("./delete-BO7K4456.js")});export{u as a};
3
+ //# sourceMappingURL=chunk-JFBUOLJ3.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/delete.ts"],
4
+ "sourcesContent": ["import { defineCommand } from 'clipact'\nimport * as z from 'zod'\nimport { JOB_ERRORS } from '../errors.ts'\nimport { account, accountEnv, jobResult } from './shared.ts'\n\n/**\n * `filecoin delete <ref>` (alias `rm`): schedule removal of a resource's stored\n * copy. Destructive, so it needs `--yes` when no human can confirm.\n */\nexport const remove = defineCommand({\n name: 'delete',\n description: 'Schedule removal of a managed resource',\n examples: ['filecoin delete res_abc123', 'filecoin rm res_abc123 --yes'],\n input: z.strictObject({\n ref: z.string().describe('Resource ref (res_\u2026)'),\n ...account,\n }),\n positionals: ['ref'],\n env: accountEnv,\n secrets: ['sessionKey'],\n output: z.object(jobResult),\n errors: JOB_ERRORS,\n confirm: (input) =>\n `Schedules removal of ${input.ref}; the provider deletes the stored copy.`,\n human: (data) =>\n `Removal of ${data.resource.ref} (${data.resource.name}) scheduled.`,\n handler: () => import('../handlers/delete.ts'),\n})\n"],
5
+ "mappings": ";0HASO,IAAMA,EAASC,EAAc,CAClC,KAAM,SACN,YAAa,yCACb,SAAU,CAAC,6BAA8B,8BAA8B,EACvE,MAASC,EAAa,CACpB,IAAOC,EAAO,EAAE,SAAS,2BAAsB,EAC/C,GAAGC,CACL,CAAC,EACD,YAAa,CAAC,KAAK,EACnB,IAAKC,EACL,QAAS,CAAC,YAAY,EACtB,OAAUC,EAAOC,CAAS,EAC1B,OAAQC,EACR,QAAUC,GACR,wBAAwBA,EAAM,GAAG,0CACnC,MAAQC,GACN,cAAcA,EAAK,SAAS,GAAG,KAAKA,EAAK,SAAS,IAAI,eACxD,QAAS,IAAM,OAAO,sBAAuB,CAC/C,CAAC",
6
+ "names": ["remove", "defineCommand", "strictObject", "string", "account", "accountEnv", "object", "jobResult", "JOB_ERRORS", "input", "data"]
7
+ }