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,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ var g=Object.create;var e=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var m=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(b,c)=>(typeof require<"u"?require:b)[c]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var n=(a,b)=>()=>{try{return b||a((b={exports:{}}).exports,b),b.exports}catch(c){throw b=0,c}},o=(a,b)=>{for(var c in b)e(a,c,{get:b[c],enumerable:!0})},l=(a,b,c,f)=>{if(b&&typeof b=="object"||typeof b=="function")for(let d of i(b))!k.call(a,d)&&d!==c&&e(a,d,{get:()=>b[d],enumerable:!(f=h(b,d))||f.enumerable});return a};var p=(a,b,c)=>(c=a!=null?g(j(a)):{},l(b||!a||!a.__esModule?e(c,"default",{value:a,enumerable:!0}):c,a));export{m as a,n as b,o as c,p as d};
3
+ //# sourceMappingURL=chunk-YIAP3JO3.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{d as n,e as o,n as s}from"./chunk-72RYXITT.js";function f(r){if(r===n.id.toString())return"mainnet";if(r===o.id.toString())return"calibration";throw new Error(`Unknown chain ID ${r}.`)}function c(r,e,d,a,t){let i=new URL(`get/${encodeURIComponent(d)}`,r.endsWith("/")?r:`${r}/`);return i.searchParams.set("network",e),a&&i.searchParams.set("browser","true"),t&&i.searchParams.set("provider",t),i.toString()}function p(r){let e=f(r.chainId);return{piece:c(r.apiUrl,e,r.pieceCid,!1,r.providerId),browser:c(r.apiUrl,e,r.rootCid??r.pieceCid,!0,r.rootCid?void 0:r.providerId)}}function l(r,e){return p({apiUrl:e,chainId:r.chainId,pieceCid:r.pieceCid,rootCid:r.rootCid})}function w(r){let[e]=r.copies;if(!e)throw new Error(`Resource ${r.ref} has no stored copies.`);return s({cid:r.pieceCid,serviceURL:e.serviceURL.endsWith("/")?e.serviceURL:`${e.serviceURL}/`})}export{p as a,l as b,w as c};
3
+ //# sourceMappingURL=chunk-YVRWI5E3.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/storage/urls.ts"],
4
+ "sourcesContent": ["import { calibration, mainnet } from '@filoz/synapse-core/chains'\nimport { createPieceUrlPDP } from '@filoz/synapse-core/piece'\nimport type { Network } from '../network.ts'\nimport type { Resource } from '../state/resources.ts'\n\n/**\n * filecoin-api retrieval URLs for stored content. Each redirects to where the\n * content can be fetched; filecoin-api never proxies the bytes.\n *\n * @see ../../../../apps/filecoin-api/README.md#retrieval\n */\nexport type RetrievalUrls = {\n /** Exact stored bytes: `/get/<pieceCid>` redirects to a provider's `/piece/<pieceCid>`. */\n piece: string\n /**\n * Content a browser renders: `/get/<rootCid>?browser=true` redirects a\n * folder to inbrowser.link, and `/get/<pieceCid>?browser=true` redirects a\n * file to a provider's `/piece/<pieceCid>`.\n */\n browser: string\n}\n\n/** Network of a chain ID saved in local state. */\nfunction networkOf(chainId: string): Network {\n if (chainId === mainnet.id.toString()) return 'mainnet'\n if (chainId === calibration.id.toString()) return 'calibration'\n throw new Error(`Unknown chain ID ${chainId}.`)\n}\n\n/** filecoin-api `/get/{cid}` URL on `network`. */\nfunction getUrl(\n apiUrl: string,\n network: Network,\n cid: string,\n browser: boolean,\n providerId: string | undefined\n): string {\n const url = new URL(\n `get/${encodeURIComponent(cid)}`,\n apiUrl.endsWith('/') ? apiUrl : `${apiUrl}/`\n )\n url.searchParams.set('network', network)\n if (browser) url.searchParams.set('browser', 'true')\n if (providerId) url.searchParams.set('provider', providerId)\n return url.toString()\n}\n\n/**\n * Build filecoin-api retrieval URLs for a piece and, for folders, its IPFS root.\n * The folder's browser URL names the root CID, so filecoin-api redirects it to\n * inbrowser.link without waiting for its indexer. `providerId` names the\n * provider holding the piece, which filecoin-api redirects to until its indexer\n * has a copy, so a `/piece` link works as soon as the provider has parked\n * the piece. `put` adds it only to the links it reports before the commit\n * confirms. A folder's browser URL leaves it out: filecoin-api never looks it up.\n *\n * @see ../../../../apps/filecoin-api/README.md#retrieval\n */\nexport function retrievalUrls(options: {\n apiUrl: string\n chainId: string\n pieceCid: string\n rootCid?: string | undefined\n providerId?: string | undefined\n}): RetrievalUrls {\n const network = networkOf(options.chainId)\n return {\n piece: getUrl(\n options.apiUrl,\n network,\n options.pieceCid,\n false,\n options.providerId\n ),\n browser: getUrl(\n options.apiUrl,\n network,\n options.rootCid ?? options.pieceCid,\n true,\n options.rootCid ? undefined : options.providerId\n ),\n }\n}\n\n/** filecoin-api retrieval URLs for a resource. */\nexport function resourceUrls(\n resource: Resource,\n apiUrl: string\n): RetrievalUrls {\n return retrievalUrls({\n apiUrl,\n chainId: resource.chainId,\n pieceCid: resource.pieceCid,\n rootCid: resource.rootCid,\n })\n}\n\n/**\n * Curio `/piece/<pieceCid>` URL of a resource's first copy. `filecoin get`\n * downloads from it directly, so a download never waits for filecoin-api's\n * indexer.\n *\n * @see https://github.com/filecoin-project/curio/blob/main/documentation/en/curio-market/retrievals.md\n */\nexport function providerPieceUrl(resource: Resource): string {\n const [copy] = resource.copies\n if (!copy) throw new Error(`Resource ${resource.ref} has no stored copies.`)\n return createPieceUrlPDP({\n cid: resource.pieceCid,\n serviceURL: copy.serviceURL.endsWith('/')\n ? copy.serviceURL\n : `${copy.serviceURL}/`,\n })\n}\n"],
5
+ "mappings": ";sDAuBA,SAASA,EAAUC,EAA0B,CAC3C,GAAIA,IAAYC,EAAQ,GAAG,SAAS,EAAG,MAAO,UAC9C,GAAID,IAAYE,EAAY,GAAG,SAAS,EAAG,MAAO,cAClD,MAAM,IAAI,MAAM,oBAAoBF,CAAO,GAAG,CAChD,CAGA,SAASG,EACPC,EACAC,EACAC,EACAC,EACAC,EACQ,CACR,IAAMC,EAAM,IAAI,IACd,OAAO,mBAAmBH,CAAG,CAAC,GAC9BF,EAAO,SAAS,GAAG,EAAIA,EAAS,GAAGA,CAAM,GAC3C,EACA,OAAAK,EAAI,aAAa,IAAI,UAAWJ,CAAO,EACnCE,GAASE,EAAI,aAAa,IAAI,UAAW,MAAM,EAC/CD,GAAYC,EAAI,aAAa,IAAI,WAAYD,CAAU,EACpDC,EAAI,SAAS,CACtB,CAaO,SAASC,EAAcC,EAMZ,CAChB,IAAMN,EAAUN,EAAUY,EAAQ,OAAO,EACzC,MAAO,CACL,MAAOR,EACLQ,EAAQ,OACRN,EACAM,EAAQ,SACR,GACAA,EAAQ,UACV,EACA,QAASR,EACPQ,EAAQ,OACRN,EACAM,EAAQ,SAAWA,EAAQ,SAC3B,GACAA,EAAQ,QAAU,OAAYA,EAAQ,UACxC,CACF,CACF,CAGO,SAASC,EACdC,EACAT,EACe,CACf,OAAOM,EAAc,CACnB,OAAAN,EACA,QAASS,EAAS,QAClB,SAAUA,EAAS,SACnB,QAASA,EAAS,OACpB,CAAC,CACH,CASO,SAASC,EAAiBD,EAA4B,CAC3D,GAAM,CAACE,CAAI,EAAIF,EAAS,OACxB,GAAI,CAACE,EAAM,MAAM,IAAI,MAAM,YAAYF,EAAS,GAAG,wBAAwB,EAC3E,OAAOG,EAAkB,CACvB,IAAKH,EAAS,SACd,WAAYE,EAAK,WAAW,SAAS,GAAG,EACpCA,EAAK,WACL,GAAGA,EAAK,UAAU,GACxB,CAAC,CACH",
6
+ "names": ["networkOf", "chainId", "mainnet", "calibration", "getUrl", "apiUrl", "network", "cid", "browser", "providerId", "url", "retrievalUrls", "options", "resourceUrls", "resource", "providerPieceUrl", "copy", "createPieceUrlPDP"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a as e,c as t,f as r,g as s,u as i,v as m}from"./chunk-JUFFOBKU.js";import{d as n}from"./chunk-3TJUKWFC.js";var d=n({name:"logout",description:"Forget the local session key (revoke it on-chain in the console)",examples:["filecoin logout","filecoin logout --network mainnet"],input:s({network:i.network}),env:{network:m.network},output:r({network:e(),removed:t(),address:e().optional().describe("Forgotten session key address")}),idempotent:!0,human:o=>o.removed?`Forgot session key ${o.address} on ${o.network}.`:`No session key on ${o.network}.`,handler:()=>import("./logout-3RWZFH2E.js")});export{d as a};
3
+ //# sourceMappingURL=chunk-Z6O5SHUU.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/logout.ts"],
4
+ "sourcesContent": ["import { defineCommand } from 'clipact'\nimport * as z from 'zod'\nimport { account, accountEnv } from './shared.ts'\n\n/** `filecoin logout`: forget the local session key for a network. */\nexport const logout = defineCommand({\n name: 'logout',\n description:\n 'Forget the local session key (revoke it on-chain in the console)',\n examples: ['filecoin logout', 'filecoin logout --network mainnet'],\n input: z.strictObject({ network: account.network }),\n env: { network: accountEnv.network },\n output: z.object({\n network: z.string(),\n removed: z.boolean(),\n address: z.string().optional().describe('Forgotten session key address'),\n }),\n idempotent: true,\n human: (data) =>\n data.removed\n ? `Forgot session key ${data.address} on ${data.network}.`\n : `No session key on ${data.network}.`,\n handler: () => import('../handlers/logout.ts'),\n})\n"],
5
+ "mappings": ";mHAKO,IAAMA,EAASC,EAAc,CAClC,KAAM,SACN,YACE,mEACF,SAAU,CAAC,kBAAmB,mCAAmC,EACjE,MAASC,EAAa,CAAE,QAASC,EAAQ,OAAQ,CAAC,EAClD,IAAK,CAAE,QAASC,EAAW,OAAQ,EACnC,OAAUC,EAAO,CACf,QAAWC,EAAO,EAClB,QAAWC,EAAQ,EACnB,QAAWD,EAAO,EAAE,SAAS,EAAE,SAAS,+BAA+B,CACzE,CAAC,EACD,WAAY,GACZ,MAAQE,GACNA,EAAK,QACD,sBAAsBA,EAAK,OAAO,OAAOA,EAAK,OAAO,IACrD,qBAAqBA,EAAK,OAAO,IACvC,QAAS,IAAM,OAAO,sBAAuB,CAC/C,CAAC",
6
+ "names": ["logout", "defineCommand", "strictObject", "account", "accountEnv", "object", "string", "boolean", "data"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{e}from"./chunk-GCPUMM4E.js";import"./chunk-AKXAQJ6H.js";import"./chunk-YVRWI5E3.js";import{a}from"./chunk-JFBUOLJ3.js";import{l as t,ma as m,oa as p}from"./chunk-72RYXITT.js";import"./chunk-JUFFOBKU.js";import"./chunk-35V77X3C.js";import"./chunk-RK6JJQZL.js";import"./chunk-7MEK5RQ7.js";import"./chunk-2VZELE36.js";import{k as r}from"./chunk-3TJUKWFC.js";import"./chunk-YIAP3JO3.js";var j=r(a,async o=>{let i=m(o),n=await p(i,t,o),f=await e(n,o.input.ref);return o.ok(f)});export{j as default};
3
+ //# sourceMappingURL=delete-BO7K4456.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/handlers/delete.ts"],
4
+ "sourcesContent": ["import { defineHandler } from 'clipact'\nimport { RM_SCOPES } from '../auth/scopes.ts'\nimport { remove } from '../commands/delete.ts'\nimport { startRemove } from '../storage/jobs.ts'\nimport { appFor, jobContext } from './context.ts'\n\n/** Schedule removal of a managed resource's stored copy. */\nexport default defineHandler(remove, async (ctx) => {\n const app = appFor(ctx)\n const job = await jobContext(app, RM_SCOPES, ctx)\n const result = await startRemove(job, ctx.input.ref)\n return ctx.ok(result)\n})\n"],
5
+ "mappings": ";sYAOA,IAAOA,EAAQC,EAAcC,EAAQ,MAAOC,GAAQ,CAClD,IAAMC,EAAMC,EAAOF,CAAG,EAChBG,EAAM,MAAMC,EAAWH,EAAKI,EAAWL,CAAG,EAC1CM,EAAS,MAAMC,EAAYJ,EAAKH,EAAI,MAAM,GAAG,EACnD,OAAOA,EAAI,GAAGM,CAAM,CACtB,CAAC",
6
+ "names": ["delete_default", "defineHandler", "remove", "ctx", "app", "appFor", "job", "jobContext", "RM_SCOPES", "result", "startRemove"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a as g}from"./chunk-MWVOEA6K.js";import{K as m,b as l,ba as p,ma as u}from"./chunk-72RYXITT.js";import{r as c}from"./chunk-JUFFOBKU.js";import"./chunk-35V77X3C.js";import"./chunk-RK6JJQZL.js";import"./chunk-7MEK5RQ7.js";import{a as f}from"./chunk-FCVBKUS5.js";import"./chunk-2VZELE36.js";import{k as s,q as i}from"./chunk-3TJUKWFC.js";import"./chunk-YIAP3JO3.js";var d=1e4,b=s(g,async t=>{let r=u(t),o=r.env,n=[],a="none";try{a=p(r)?.source??"none"}catch(e){if(!i(e))throw e;a=e.code==="invalid_input"?"env":"pending",n.push({name:"credentials",ok:!1,message:e.message})}try{r.db(),n.push({name:"state",ok:!0,message:"Database opened and migrated"})}catch(e){n.push({name:"state",ok:!1,message:e instanceof Error?e.message:String(e)})}try{let e=await c(l(r.client,{cacheTime:0}),AbortSignal.timeout(d));n.push({name:"rpc",ok:!0,message:`Chain ${r.chain.id} at block ${e}`})}catch(e){if(t.signal.aborted)throw e;n.push({name:"rpc",ok:!1,message:e instanceof DOMException&&e.name==="TimeoutError"?`No answer within ${d/1e3} s`:e instanceof Error?f(e):String(e)})}let h=o.FILECOIN_RPC_URL??r.chain.rpcUrls.default.http[0]??"";return t.ok({network:{value:r.network,source:t.input.network?"input":r.config.get("network")?"config":"default"},rpcUrl:{value:h,source:o.FILECOIN_RPC_URL?"env":"default"},consoleUrl:{value:r.consoleUrl,source:o.FILECOIN_CONSOLE_URL?"env":"default"},apiUrl:{value:r.apiUrl,source:o.FILECOIN_API_URL?"env":"default"},configFile:r.config.path,stateDir:{value:m(o),source:o.FILECOIN_STATE_DIR?"env":"default"},credentials:a,checks:n})});export{b as default};
3
+ //# sourceMappingURL=doctor-NF75MDBO.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/handlers/doctor.ts"],
4
+ "sourcesContent": ["import { defineHandler, isCliError } from 'clipact'\nimport { getBlockNumber } from 'viem/actions'\nimport { resolveCredentials } from '../auth/session.ts'\nimport { doctor } from '../commands/doctor.ts'\nimport { abortable } from '../errors.ts'\nimport { firstLine } from '../map-error.ts'\nimport { stateDir } from '../state/db.ts'\nimport { appFor } from './context.ts'\n\n/** Milliseconds to wait for the RPC check. */\nconst RPC_TIMEOUT = 10_000\n\n/**\n * Report resolved settings with their sources, then check that the state\n * database opens and the RPC endpoint answers on the expected chain. Never\n * prints the session key.\n */\nexport default defineHandler(doctor, async (ctx) => {\n const app = appFor(ctx)\n const env = app.env\n const checks: { name: string; ok: boolean; message: string }[] = []\n\n let credentials: 'env' | 'config' | 'pending' | 'none' = 'none'\n try {\n credentials = resolveCredentials(app)?.source ?? 'none'\n } catch (error) {\n if (!isCliError(error)) throw error\n credentials = error.code === 'invalid_input' ? 'env' : 'pending'\n checks.push({ name: 'credentials', ok: false, message: error.message })\n }\n\n try {\n app.db()\n checks.push({\n name: 'state',\n ok: true,\n message: 'Database opened and migrated',\n })\n } catch (error) {\n checks.push({\n name: 'state',\n ok: false,\n message: error instanceof Error ? error.message : String(error),\n })\n }\n\n try {\n // The app's transport already stops on ctx.signal; this adds a deadline.\n const block = await abortable(\n getBlockNumber(app.client, { cacheTime: 0 }),\n AbortSignal.timeout(RPC_TIMEOUT)\n )\n checks.push({\n name: 'rpc',\n ok: true,\n message: `Chain ${app.chain.id} at block ${block}`,\n })\n } catch (error) {\n if (ctx.signal.aborted) throw error\n checks.push({\n name: 'rpc',\n ok: false,\n message:\n error instanceof DOMException && error.name === 'TimeoutError'\n ? `No answer within ${RPC_TIMEOUT / 1000} s`\n : error instanceof Error\n ? firstLine(error)\n : String(error),\n })\n }\n\n const rpcUrl = env.FILECOIN_RPC_URL ?? app.chain.rpcUrls.default.http[0] ?? ''\n return ctx.ok({\n network: {\n value: app.network,\n source: ctx.input.network\n ? 'input'\n : app.config.get('network')\n ? 'config'\n : 'default',\n },\n rpcUrl: { value: rpcUrl, source: env.FILECOIN_RPC_URL ? 'env' : 'default' },\n consoleUrl: {\n value: app.consoleUrl,\n source: env.FILECOIN_CONSOLE_URL ? 'env' : 'default',\n },\n apiUrl: {\n value: app.apiUrl,\n source: env.FILECOIN_API_URL ? 'env' : 'default',\n },\n configFile: app.config.path,\n stateDir: {\n value: stateDir(env),\n source: env.FILECOIN_STATE_DIR ? 'env' : 'default',\n },\n credentials,\n checks,\n })\n})\n"],
5
+ "mappings": ";kXAUA,IAAMA,EAAc,IAObC,EAAQC,EAAcC,EAAQ,MAAOC,GAAQ,CAClD,IAAMC,EAAMC,EAAOF,CAAG,EAChBG,EAAMF,EAAI,IACVG,EAA2D,CAAC,EAE9DC,EAAqD,OACzD,GAAI,CACFA,EAAcC,EAAmBL,CAAG,GAAG,QAAU,MACnD,OAASM,EAAO,CACd,GAAI,CAACC,EAAWD,CAAK,EAAG,MAAMA,EAC9BF,EAAcE,EAAM,OAAS,gBAAkB,MAAQ,UACvDH,EAAO,KAAK,CAAE,KAAM,cAAe,GAAI,GAAO,QAASG,EAAM,OAAQ,CAAC,CACxE,CAEA,GAAI,CACFN,EAAI,GAAG,EACPG,EAAO,KAAK,CACV,KAAM,QACN,GAAI,GACJ,QAAS,8BACX,CAAC,CACH,OAASG,EAAO,CACdH,EAAO,KAAK,CACV,KAAM,QACN,GAAI,GACJ,QAASG,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,CAChE,CAAC,CACH,CAEA,GAAI,CAEF,IAAME,EAAQ,MAAMC,EAClBC,EAAeV,EAAI,OAAQ,CAAE,UAAW,CAAE,CAAC,EAC3C,YAAY,QAAQL,CAAW,CACjC,EACAQ,EAAO,KAAK,CACV,KAAM,MACN,GAAI,GACJ,QAAS,SAASH,EAAI,MAAM,EAAE,aAAaQ,CAAK,EAClD,CAAC,CACH,OAASF,EAAO,CACd,GAAIP,EAAI,OAAO,QAAS,MAAMO,EAC9BH,EAAO,KAAK,CACV,KAAM,MACN,GAAI,GACJ,QACEG,aAAiB,cAAgBA,EAAM,OAAS,eAC5C,oBAAoBX,EAAc,GAAI,KACtCW,aAAiB,MACfK,EAAUL,CAAK,EACf,OAAOA,CAAK,CACtB,CAAC,CACH,CAEA,IAAMM,EAASV,EAAI,kBAAoBF,EAAI,MAAM,QAAQ,QAAQ,KAAK,CAAC,GAAK,GAC5E,OAAOD,EAAI,GAAG,CACZ,QAAS,CACP,MAAOC,EAAI,QACX,OAAQD,EAAI,MAAM,QACd,QACAC,EAAI,OAAO,IAAI,SAAS,EACtB,SACA,SACR,EACA,OAAQ,CAAE,MAAOY,EAAQ,OAAQV,EAAI,iBAAmB,MAAQ,SAAU,EAC1E,WAAY,CACV,MAAOF,EAAI,WACX,OAAQE,EAAI,qBAAuB,MAAQ,SAC7C,EACA,OAAQ,CACN,MAAOF,EAAI,OACX,OAAQE,EAAI,iBAAmB,MAAQ,SACzC,EACA,WAAYF,EAAI,OAAO,KACvB,SAAU,CACR,MAAOa,EAASX,CAAG,EACnB,OAAQA,EAAI,mBAAqB,MAAQ,SAC3C,EACA,YAAAE,EACA,OAAAD,CACF,CAAC,CACH,CAAC",
6
+ "names": ["RPC_TIMEOUT", "doctor_default", "defineHandler", "doctor", "ctx", "app", "appFor", "env", "checks", "credentials", "resolveCredentials", "error", "isCliError", "block", "abortable", "getBlockNumber", "firstLine", "rpcUrl", "stateDir"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a as R}from"./chunk-BFBNDHQG.js";import{b as k}from"./chunk-AKXAQJ6H.js";import{c as F}from"./chunk-YVRWI5E3.js";import{D as y,G as v,J as P,V as $,ma as x,na as g,pa as z}from"./chunk-72RYXITT.js";import{k as f,q as u}from"./chunk-JUFFOBKU.js";import"./chunk-35V77X3C.js";import"./chunk-RK6JJQZL.js";import"./chunk-7MEK5RQ7.js";import"./chunk-2VZELE36.js";import{k as b,p as d}from"./chunk-3TJUKWFC.js";import"./chunk-YIAP3JO3.js";import{stat as q}from"node:fs/promises";import{resolve as A}from"node:path";import{createWriteStream as N}from"node:fs";import{mkdir as U,rename as S,rm as p,stat as B}from"node:fs/promises";import{dirname as T,join as H,resolve as D}from"node:path";import{Readable as j,Transform as I}from"node:stream";import{pipeline as L}from"node:stream/promises";async function m(e){let r=await(e.fetch??globalThis.fetch)(e.url,{signal:e.signal}).catch(o=>{throw e.signal?.aborted?o:new d({code:"service_unavailable",message:`Could not reach ${e.url}.`,cause:o})});if(r.status===404)throw await r.body?.cancel(),u(`The provider does not have ${e.pieceCid}.`);if(!(r.ok&&r.body))throw await r.body?.cancel(),new d({code:"service_unavailable",message:`Retrieval from ${e.url} failed with HTTP ${r.status}.`});let t=D(e.output);await U(T(t),{recursive:!0});let i=`${t}.filecoin-partial`,n=y(),s=new I({transform(o,l,c){n.write(o),c(null,o)}});try{await L(j.fromWeb(r.body),s,N(i));let o=n.finalize().toString();if(o!==e.pieceCid)throw new d({code:f.verificationFailed,message:`Downloaded bytes hash to ${o}, expected ${e.pieceCid}.`});return await S(i,t),{size:Number(n.count())}}catch(o){throw await p(i,{force:!0}),o}}async function E(e){let a=D(e.output);if(await B(a).catch(()=>{}))throw h(e.output);let t=H(T(a),`.${e.pieceCid}.car`);try{let{size:i}=await m({...e,output:t}),n=`${a}.filecoin-partial`;await p(n,{recursive:!0,force:!0});let{rootCid:s,files:o}=await k(t,n,{verifyBlocks:!1});if(s.toString()!==e.rootCid)throw await p(n,{recursive:!0,force:!0}),new d({code:f.verificationFailed,message:`CAR root is ${s}, expected ${e.rootCid}.`});return await S(n,a),{size:i,files:o}}finally{await p(t,{force:!0})}}function h(e){return new d({code:f.outputExists,message:`${e} already exists.`,next:[{by:"agent",description:"Choose another path with --output, or pass --force for a file"}]})}async function O(e,a){if(!a&&await q(e).catch(()=>{}))throw h(e)}var de=b(R,async e=>{let{input:a}=e,r=x(e),{target:t}=a,i;if(t.startsWith("res_")?i=z(r,t):i=$(r.db(),g(r),t)[0],!i){let l=v(t);if(!l)throw u(`No managed resource or PieceCID ${t}.`,{by:"agent",command:"filecoin ls",description:"List managed resources"});let c=await P({client:r.client,address:g(r).payer,pieceCid:l,signal:e.signal}).catch(C=>{throw e.signal.aborted?C:u(`No provider serves ${t}: ${String(C)}`)}),w=A(a.output??t);await O(w,a.force);let{size:W}=await m({url:c,pieceCid:t,output:w,signal:e.signal});return e.ok({kind:"file",pieceCid:t,output:w,size:W,url:c})}let n=F(i),s=A(a.output??i.name);if(i.kind==="folder"&&i.rootCid){let{size:l,files:c}=await E({url:n,pieceCid:i.pieceCid,rootCid:i.rootCid,output:s,signal:e.signal});return e.ok({kind:i.kind,ref:i.ref,pieceCid:i.pieceCid,output:s,size:l,files:c,url:n})}await O(s,a.force);let{size:o}=await m({url:n,pieceCid:i.pieceCid,output:s,signal:e.signal});return e.ok({kind:i.kind,ref:i.ref,pieceCid:i.pieceCid,output:s,size:o,url:n})});export{de as default};
3
+ //# sourceMappingURL=get-3EC2XCFH.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/handlers/get.ts", "../../src/storage/get.ts"],
4
+ "sourcesContent": ["import { stat } from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport * as Piece from '@filoz/synapse-core/piece'\nimport { defineHandler } from 'clipact'\nimport { get } from '../commands/get.ts'\nimport { notFound } from '../errors.ts'\nimport { findResourcesByCid, type Resource } from '../state/resources.ts'\nimport { downloadFolder, downloadPiece, outputExists } from '../storage/get.ts'\nimport { providerPieceUrl } from '../storage/urls.ts'\nimport { accountScope, appFor, findResource } from './context.ts'\n\n/** Refuse to overwrite an existing file unless forced. */\nasync function assertWritable(path: string, force: boolean): Promise<void> {\n if (force) return\n if (await stat(path).catch(() => undefined)) throw outputExists(path)\n}\n\n/**\n * Retrieve a managed resource by ref (or a PieceCID or root CID) from Curio\n * and verify it. Files are written as-is; folders are extracted to a\n * directory. An unmanaged PieceCID is located through the payer's data sets.\n */\nexport default defineHandler(get, async (ctx) => {\n const { input } = ctx\n const app = appFor(ctx)\n const { target } = input\n let resource: Resource | undefined\n if (target.startsWith('res_')) {\n resource = findResource(app, target)\n } else {\n resource = findResourcesByCid(app.db(), accountScope(app), target)[0]\n }\n\n if (!resource) {\n const pieceCid = Piece.tryFrom(target)\n if (!pieceCid) {\n throw notFound(`No managed resource or PieceCID ${target}.`, {\n by: 'agent',\n command: 'filecoin ls',\n description: 'List managed resources',\n })\n }\n const url = await Piece.resolvePieceUrl({\n client: app.client,\n address: accountScope(app).payer as `0x${string}`,\n pieceCid,\n signal: ctx.signal,\n }).catch((error: unknown) => {\n if (ctx.signal.aborted) throw error\n throw notFound(`No provider serves ${target}: ${String(error)}`)\n })\n const output = resolve(input.output ?? target)\n await assertWritable(output, input.force)\n const { size } = await downloadPiece({\n url,\n pieceCid: target,\n output,\n signal: ctx.signal,\n })\n return ctx.ok({ kind: 'file', pieceCid: target, output, size, url })\n }\n\n const url = providerPieceUrl(resource)\n const output = resolve(input.output ?? resource.name)\n if (resource.kind === 'folder' && resource.rootCid) {\n const { size, files } = await downloadFolder({\n url,\n pieceCid: resource.pieceCid,\n rootCid: resource.rootCid,\n output,\n signal: ctx.signal,\n })\n return ctx.ok({\n kind: resource.kind,\n ref: resource.ref,\n pieceCid: resource.pieceCid,\n output,\n size,\n files,\n url,\n })\n }\n await assertWritable(output, input.force)\n const { size } = await downloadPiece({\n url,\n pieceCid: resource.pieceCid,\n output,\n signal: ctx.signal,\n })\n return ctx.ok({\n kind: resource.kind,\n ref: resource.ref,\n pieceCid: resource.pieceCid,\n output,\n size,\n url,\n })\n})\n", "import { createWriteStream } from 'node:fs'\nimport { mkdir, rename, rm, stat } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\nimport { Readable, Transform } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport * as Piece from '@filoz/synapse-core/piece'\nimport { CliError } from 'clipact'\nimport { ErrorCodes, notFound } from '../errors.ts'\nimport { extractCar } from './pack.ts'\n\n/** Options for {@link downloadPiece}. */\nexport type DownloadPieceOptions = {\n url: string\n pieceCid: string\n /** Final file path; written only after the PieceCID matches. */\n output: string\n fetch?: typeof globalThis.fetch\n signal?: AbortSignal\n}\n\n/**\n * Stream a piece to `output` while hashing it, and keep the file only when\n * the bytes match the expected PieceCID. Unlike synapse-core's\n * `downloadAndValidate`, this never buffers the whole piece in memory.\n */\nexport async function downloadPiece(\n options: DownloadPieceOptions\n): Promise<{ size: number }> {\n const fetchFn = options.fetch ?? globalThis.fetch\n const response = await fetchFn(options.url, { signal: options.signal }).catch(\n (error: unknown) => {\n if (options.signal?.aborted) throw error\n throw new CliError({\n code: 'service_unavailable',\n message: `Could not reach ${options.url}.`,\n cause: error,\n })\n }\n )\n if (response.status === 404) {\n await response.body?.cancel()\n throw notFound(`The provider does not have ${options.pieceCid}.`)\n }\n if (!(response.ok && response.body)) {\n await response.body?.cancel()\n throw new CliError({\n code: 'service_unavailable',\n message: `Retrieval from ${options.url} failed with HTTP ${response.status}.`,\n })\n }\n const output = resolve(options.output)\n await mkdir(dirname(output), { recursive: true })\n const tmp = `${output}.filecoin-partial`\n const hasher = Piece.hasher()\n const hash = new Transform({\n transform(chunk: Uint8Array, _encoding, callback) {\n hasher.write(chunk)\n callback(null, chunk)\n },\n })\n try {\n await pipeline(\n Readable.fromWeb(response.body as never),\n hash,\n createWriteStream(tmp)\n )\n const actual = hasher.finalize().toString()\n if (actual !== options.pieceCid) {\n throw new CliError({\n code: ErrorCodes.verificationFailed,\n message: `Downloaded bytes hash to ${actual}, expected ${options.pieceCid}.`,\n })\n }\n await rename(tmp, output)\n return { size: Number(hasher.count()) }\n } catch (error) {\n await rm(tmp, { force: true })\n throw error\n }\n}\n\n/** Options for {@link downloadFolder}. */\nexport type DownloadFolderOptions = {\n url: string\n pieceCid: string\n rootCid: string\n /** Directory to extract into; must be empty or absent. */\n output: string\n fetch?: typeof globalThis.fetch\n signal?: AbortSignal\n}\n\n/**\n * Download a folder's CAR through its exact piece, verify it against the\n * PieceCID and root CID, and extract the file tree into `output`. The\n * PieceCID check covers every byte, so blocks are not hashed again.\n */\nexport async function downloadFolder(\n options: DownloadFolderOptions\n): Promise<{ size: number; files: number }> {\n const output = resolve(options.output)\n const existing = await stat(output).catch(() => undefined)\n if (existing) throw outputExists(options.output)\n const carPath = join(dirname(output), `.${options.pieceCid}.car`)\n try {\n const { size } = await downloadPiece({ ...options, output: carPath })\n const tmp = `${output}.filecoin-partial`\n await rm(tmp, { recursive: true, force: true })\n const { rootCid, files } = await extractCar(carPath, tmp, {\n verifyBlocks: false,\n })\n if (rootCid.toString() !== options.rootCid) {\n await rm(tmp, { recursive: true, force: true })\n throw new CliError({\n code: ErrorCodes.verificationFailed,\n message: `CAR root is ${rootCid}, expected ${options.rootCid}.`,\n })\n }\n await rename(tmp, output)\n return { size, files }\n } finally {\n await rm(carPath, { force: true })\n }\n}\n\n/** Error returned when `get` would overwrite an existing path. */\nexport function outputExists(path: string): CliError {\n return new CliError({\n code: ErrorCodes.outputExists,\n message: `${path} already exists.`,\n next: [\n {\n by: 'agent',\n description:\n 'Choose another path with --output, or pass --force for a file',\n },\n ],\n })\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["stat", "resolve", "createWriteStream", "mkdir", "rename", "rm", "stat", "dirname", "join", "resolve", "Readable", "Transform", "pipeline", "downloadPiece", "options", "response", "error", "CliError", "notFound", "output", "resolve", "mkdir", "dirname", "tmp", "hasher", "hash", "Transform", "chunk", "_encoding", "callback", "pipeline", "Readable", "createWriteStream", "actual", "ErrorCodes", "rename", "rm", "downloadFolder", "stat", "outputExists", "carPath", "join", "size", "rootCid", "files", "extractCar", "path", "assertWritable", "path", "force", "stat", "outputExists", "get_default", "defineHandler", "get", "ctx", "input", "app", "appFor", "target", "resource", "findResource", "findResourcesByCid", "accountScope", "pieceCid", "tryFrom", "notFound", "url", "resolvePieceUrl", "error", "output", "resolve", "size", "downloadPiece", "providerPieceUrl", "files", "downloadFolder"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a as p}from"./chunk-QRFSFJOZ.js";import{ma as c,qa as i}from"./chunk-72RYXITT.js";import"./chunk-JUFFOBKU.js";import"./chunk-35V77X3C.js";import"./chunk-RK6JJQZL.js";import"./chunk-7MEK5RQ7.js";import"./chunk-2VZELE36.js";import{k as n}from"./chunk-3TJUKWFC.js";import"./chunk-YIAP3JO3.js";var l=n(p,e=>{let r=c(e),o=i(r,e.input.id),{commit:t,...a}=o.checkpoint;return e.ok({...o,checkpoint:{...a,...t?{commit:{created:t.created,nonce:t.nonce,...t.clientDataSetId?{clientDataSetId:t.clientDataSetId}:{}}}:{}}})});export{l as default};
3
+ //# sourceMappingURL=inspect-FDI442BE.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/handlers/operations/inspect.ts"],
4
+ "sourcesContent": ["import { defineHandler } from 'clipact'\nimport { inspect } from '../../commands/operations/inspect.ts'\nimport { appFor, findOperation } from '../context.ts'\n\n/**\n * Show a saved operation with its input and checkpoint. The signed commit's\n * `extraData` is left out: it is long and only useful to `resume`.\n */\nexport default defineHandler(inspect, (ctx) => {\n const app = appFor(ctx)\n const op = findOperation(app, ctx.input.id)\n const { commit, ...checkpoint } = op.checkpoint\n return ctx.ok({\n ...op,\n checkpoint: {\n ...checkpoint,\n ...(commit\n ? {\n commit: {\n created: commit.created,\n nonce: commit.nonce,\n ...(commit.clientDataSetId\n ? { clientDataSetId: commit.clientDataSetId }\n : {}),\n },\n }\n : {}),\n },\n })\n})\n"],
5
+ "mappings": ";ySAQA,IAAOA,EAAQC,EAAcC,EAAUC,GAAQ,CAC7C,IAAMC,EAAMC,EAAOF,CAAG,EAChBG,EAAKC,EAAcH,EAAKD,EAAI,MAAM,EAAE,EACpC,CAAE,OAAAK,EAAQ,GAAGC,CAAW,EAAIH,EAAG,WACrC,OAAOH,EAAI,GAAG,CACZ,GAAGG,EACH,WAAY,CACV,GAAGG,EACH,GAAID,EACA,CACE,OAAQ,CACN,QAASA,EAAO,QAChB,MAAOA,EAAO,MACd,GAAIA,EAAO,gBACP,CAAE,gBAAiBA,EAAO,eAAgB,EAC1C,CAAC,CACP,CACF,EACA,CAAC,CACP,CACF,CAAC,CACH,CAAC",
6
+ "names": ["inspect_default", "defineHandler", "inspect", "ctx", "app", "appFor", "op", "findOperation", "commit", "checkpoint"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a as l}from"./chunk-DHTPICN4.js";import{b as s}from"./chunk-YVRWI5E3.js";import{ma as u,pa as p}from"./chunk-72RYXITT.js";import"./chunk-JUFFOBKU.js";import"./chunk-35V77X3C.js";import"./chunk-RK6JJQZL.js";import"./chunk-7MEK5RQ7.js";import"./chunk-2VZELE36.js";import{k as i}from"./chunk-3TJUKWFC.js";import"./chunk-YIAP3JO3.js";var f=15e3,k=i(l,async e=>{let o=u(e),r=p(o,e.input.ref),t=s(r,o.apiUrl);if(!e.input.check)return e.ok({resource:r,urls:t});let n=t.piece,a=await fetch(n,{method:"HEAD",signal:AbortSignal.any([e.signal,AbortSignal.timeout(f)])}).catch(c=>{if(e.signal.aborted)throw c});return e.ok({resource:r,urls:t,retrieval:{url:n,state:a?.ok?"ready":"unavailable",status:a?.status??0,checkedAt:new Date().toISOString()}})});export{k as default};
3
+ //# sourceMappingURL=inspect-RJCGSGKG.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/handlers/inspect.ts"],
4
+ "sourcesContent": ["import { defineHandler } from 'clipact'\nimport { inspect } from '../commands/inspect.ts'\nimport { resourceUrls } from '../storage/urls.ts'\nimport { appFor, findResource } from './context.ts'\n\n/** Milliseconds to wait for the retrieval probe. */\nconst PROBE_TIMEOUT = 15_000\n\n/**\n * Show a managed resource with its filecoin-api URLs. With `--check`, send a HEAD\n * request to the piece URL and follow filecoin-api's redirect to the provider, so\n * the check fails until filecoin-api's indexer has the piece. The browser URL of\n * a folder always redirects to inbrowser.link, so probing it proves nothing.\n */\nexport default defineHandler(inspect, async (ctx) => {\n const app = appFor(ctx)\n const resource = findResource(app, ctx.input.ref)\n const urls = resourceUrls(resource, app.apiUrl)\n if (!ctx.input.check) return ctx.ok({ resource, urls })\n const probe = urls.piece\n const response = await fetch(probe, {\n method: 'HEAD',\n signal: AbortSignal.any([ctx.signal, AbortSignal.timeout(PROBE_TIMEOUT)]),\n }).catch((error: unknown) => {\n if (ctx.signal.aborted) throw error\n return undefined\n })\n return ctx.ok({\n resource,\n urls,\n retrieval: {\n url: probe,\n state: response?.ok ? 'ready' : 'unavailable',\n status: response?.status ?? 0,\n checkedAt: new Date().toISOString(),\n },\n })\n})\n"],
5
+ "mappings": ";iVAMA,IAAMA,EAAgB,KAQfC,EAAQC,EAAcC,EAAS,MAAOC,GAAQ,CACnD,IAAMC,EAAMC,EAAOF,CAAG,EAChBG,EAAWC,EAAaH,EAAKD,EAAI,MAAM,GAAG,EAC1CK,EAAOC,EAAaH,EAAUF,EAAI,MAAM,EAC9C,GAAI,CAACD,EAAI,MAAM,MAAO,OAAOA,EAAI,GAAG,CAAE,SAAAG,EAAU,KAAAE,CAAK,CAAC,EACtD,IAAME,EAAQF,EAAK,MACbG,EAAW,MAAM,MAAMD,EAAO,CAClC,OAAQ,OACR,OAAQ,YAAY,IAAI,CAACP,EAAI,OAAQ,YAAY,QAAQJ,CAAa,CAAC,CAAC,CAC1E,CAAC,EAAE,MAAOa,GAAmB,CAC3B,GAAIT,EAAI,OAAO,QAAS,MAAMS,CAEhC,CAAC,EACD,OAAOT,EAAI,GAAG,CACZ,SAAAG,EACA,KAAAE,EACA,UAAW,CACT,IAAKE,EACL,MAAOC,GAAU,GAAK,QAAU,cAChC,OAAQA,GAAU,QAAU,EAC5B,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,CACF,CAAC,CACH,CAAC",
6
+ "names": ["PROBE_TIMEOUT", "inspect_default", "defineHandler", "inspect", "ctx", "app", "appFor", "resource", "findResource", "urls", "resourceUrls", "probe", "response", "error"]
7
+ }
@@ -0,0 +1,4 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a as _}from"./chunk-BZITZ3BI.js";import{$ as v,Y as T,_ as A,aa as U,b as K,ca as I,da as z,ea as D,h as L,i as x,m as O,ma as N}from"./chunk-72RYXITT.js";import{E as k,F,k as h,p as y}from"./chunk-JUFFOBKU.js";import"./chunk-35V77X3C.js";import{H as m}from"./chunk-RK6JJQZL.js";import"./chunk-7MEK5RQ7.js";import"./chunk-2VZELE36.js";import{k as C,p as u}from"./chunk-3TJUKWFC.js";import"./chunk-YIAP3JO3.js";import{spawn as H}from"node:child_process";function P(o){let[e,s]=process.platform==="darwin"?["open",[o]]:process.platform==="win32"?["rundll32",["url.dll,FileProtocolHandler",o]]:["xdg-open",[o]];try{let t=H(e,s,{detached:!0,stdio:"ignore"});t.on("error",()=>{}),t.unref()}catch{}}function p(o){let e=o.scopes.filter(O);return e.length>0?e:k}function j(o,e){return T({consoleUrl:o.consoleUrl,address:e.address,scopes:p(e),network:o.network,name:e.name,days:e.days})}function G(o,e,s){let t=s.expiresAt?.toString(),i={...e,rootAddress:s.root,...t?{expiresAt:t}:{}};return o.config.set(`sessions.${o.network}`,i),i}function E(o,e,s){if(G(o,e,s),s.missing.length>0)throw new u({code:h.permissionDenied,message:`The wallet owner did not grant: ${s.missing.join(", ")}.`,details:{missing:s.missing},next:[{by:"user",command:"filecoin login --fresh",description:"Start a new login and approve every requested scope"}]});return{network:o.network,address:e.address,rootAddress:s.root,scopes:s.granted,...s.expiresAt?{expiresAt:new Date(Number(s.expiresAt)*1e3).toISOString()}:{}}}function R(o,e,s){let t=p(e),i=e.rootAddress?"approved":"pending",a=i==="pending"?j(o,e):void 0;return new u({code:h.sessionConflict,message:`A ${i} session key for ${t.join(", ")} is saved for ${o.network}. Replacing it takes --fresh.`,details:{address:e.address,state:i,scopes:t,...a?{url:a}:{}},next:[...a?[{by:"user",description:`Open ${a} and approve the saved key with your wallet`}]:[],{by:"agent",command:"filecoin login --check",description:"Keep the saved key and its scopes"},{by:"user",command:z({fresh:!0,scopes:s}),description:"Replace the saved key; the wallet owner approves the new one"}]})}function M(o){return new u({code:h.sessionExpired,message:`The saved session key expired for: ${o.join(", ")}.`,details:{missing:o},next:[{by:"user",command:"filecoin login",description:"Authorize a new session key with the same scopes"}]})}var de=C(_,async o=>{let{input:e}=o;if(e.sessionKey)throw y("FILECOIN_SESSION_KEY is set; unset it to log in with filecoin-app.","sessionKey");if(e.check){for(let n of["scopes","name","days","fresh"])if(e[n]!==void 0&&e[n]!==!1)throw y(`--check confirms the saved key as it is; drop --${n}.`,n)}let s=N(o),t=o.mode.interactive&&o.mode.agent===!1,i=e.wait??t,a=`sessions.${s.network}`,r=s.config.get(a),l=e.scopes??(r?p(r):k),f;if(r&&!e.fresh){let n=r,w=e.scopes==null||e.scopes.every(d=>p(r).includes(d));if(!n.rootAddress)if(w)f=n;else{let d=await v({client:s.client,signer:m(n.address),scopes:p(n),fromBlock:BigInt(n.fromBlock)});if(d.status==="pending")throw R(s,n,l);n=G(s,n,d)}if(n.rootAddress){let d=m(n.rootAddress),b=m(n.address),S=await A({client:s.client,root:d,signer:b,scopes:l});if(S.missing.length===0||e.scopes==null&&S.granted.length>0)return o.ok(E(s,n,{root:d,...S}));if(e.scopes!=null&&(await A({client:s.client,root:d,signer:b,scopes:p(n)})).granted.length>0)throw R(s,n,l);if(e.check)throw M(l)}}if(!f){if(e.check)throw D();let n=L(),w=await K(s.client,{cacheTime:0});f={privateKey:n,address:x(n).address,scopes:l,...r?.name?{name:r.name}:{},...r?.days==null?{}:{days:r.days},fromBlock:w.toString(),createdAt:new Date().toISOString()}}let c={...f,name:e.name??f.name??F,...e.days==null?{}:{days:e.days}};s.config.set(a,c);let g=j(s,c),B={client:s.client,signer:m(c.address),scopes:p(c),fromBlock:BigInt(c.fromBlock)};if(!i){let n=await v(B);if(n.status==="pending")throw I(g);return o.ok(E(s,c,n))}o.log(`Approve the session key in your browser:
3
+ ${g}`),e.open&&t&&P(g),o.progress({phase:"login",message:"Waiting for approval on chain"});let $=await U({...B,timeoutMs:e.timeout*1e3,signal:o.signal});if($.status==="pending")throw I(g);return o.ok(E(s,c,$))});export{de as default};
4
+ //# sourceMappingURL=login-NNTYQ37I.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/auth/open-browser.ts", "../../src/handlers/login.ts"],
4
+ "sourcesContent": ["import { spawn } from 'node:child_process'\n\n/**\n * Open `url` in the default browser without waiting for it. Opening is best\n * effort; callers always print the URL as well.\n */\nexport function openBrowser(url: string): void {\n const [command, args] =\n process.platform === 'darwin'\n ? ['open', [url]]\n : process.platform === 'win32'\n ? ['rundll32', ['url.dll,FileProtocolHandler', url]]\n : ['xdg-open', [url]]\n try {\n const child = spawn(command, args, { detached: true, stdio: 'ignore' })\n child.on('error', () => {\n // Opening is best effort; the URL is always printed as well.\n })\n child.unref()\n } catch {\n // Same as a failed spawn: the printed URL is the fallback.\n }\n}\n", "import { CliError, defineHandler } from 'clipact'\nimport { type Address, getAddress } from 'viem'\nimport { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'\nimport { getBlockNumber } from 'viem/actions'\nimport type { App } from '../app.ts'\nimport {\n buildAuthorizeUrl,\n checkAuthorization,\n readScopes,\n type ScopeGrants,\n waitForAuthorization,\n} from '../auth/login.ts'\nimport { openBrowser } from '../auth/open-browser.ts'\nimport { DEFAULT_KEY_NAME } from '../auth/scope-ids.ts'\nimport { DEFAULT_SCOPES, isScopeId, type ScopeId } from '../auth/scopes.ts'\nimport { loginCommand, loginPending, notLoggedIn } from '../auth/session.ts'\nimport { login } from '../commands/login.ts'\nimport type { StoredSession } from '../config.ts'\nimport { ErrorCodes, invalidInput } from '../errors.ts'\nimport { appFor } from './context.ts'\n\n/** Result of a completed login. */\ntype LoginResult = {\n network: string\n address: string\n rootAddress: string\n scopes: ScopeId[]\n expiresAt?: string\n}\n\n/** Known scopes of a saved session; the defaults if it lists none. */\nfunction savedScopes(session: StoredSession): ScopeId[] {\n const scopes = session.scopes.filter(isScopeId)\n return scopes.length > 0 ? scopes : DEFAULT_SCOPES\n}\n\n/** The approval link of a saved session. */\nfunction authorizeUrl(app: App, session: StoredSession): string {\n return buildAuthorizeUrl({\n consoleUrl: app.consoleUrl,\n address: session.address as Address,\n scopes: savedScopes(session),\n network: app.network,\n name: session.name,\n days: session.days,\n })\n}\n\n/** Save the owner and expiry of an approved session and return it. */\nfunction saveApproval(\n app: App,\n session: StoredSession,\n grants: ScopeGrants & { root: Address }\n): StoredSession {\n const expiresAt = grants.expiresAt?.toString()\n const approved: StoredSession = {\n ...session,\n rootAddress: grants.root,\n ...(expiresAt ? { expiresAt } : {}),\n }\n app.config.set(`sessions.${app.network}`, approved)\n return approved\n}\n\n/**\n * Save an approved session. Returns the result when every requested scope\n * was granted; throws `permission_denied` with the missing scopes when some\n * were not.\n */\nfunction finishLogin(\n app: App,\n session: StoredSession,\n grants: ScopeGrants & { root: Address }\n): LoginResult {\n saveApproval(app, session, grants)\n if (grants.missing.length > 0) {\n throw new CliError({\n code: ErrorCodes.permissionDenied,\n message: `The wallet owner did not grant: ${grants.missing.join(', ')}.`,\n details: { missing: grants.missing },\n next: [\n {\n by: 'user',\n command: 'filecoin login --fresh',\n description: 'Start a new login and approve every requested scope',\n },\n ],\n })\n }\n return {\n network: app.network,\n address: session.address,\n rootAddress: grants.root,\n scopes: grants.granted,\n ...(grants.expiresAt\n ? { expiresAt: new Date(Number(grants.expiresAt) * 1000).toISOString() }\n : {}),\n }\n}\n\n/**\n * Error returned when `--scopes` asks for more than a saved key that is\n * pending or still valid. Replacing it would discard an approval the owner\n * may have signed, so that takes `--fresh`.\n */\nfunction sessionConflict(\n app: App,\n session: StoredSession,\n requested: readonly ScopeId[]\n): CliError {\n const scopes = savedScopes(session)\n const state = session.rootAddress ? 'approved' : 'pending'\n const url = state === 'pending' ? authorizeUrl(app, session) : undefined\n return new CliError({\n code: ErrorCodes.sessionConflict,\n message: `A ${state} session key for ${scopes.join(', ')} is saved for ${app.network}. Replacing it takes --fresh.`,\n details: {\n address: session.address,\n state,\n scopes,\n ...(url ? { url } : {}),\n },\n next: [\n ...(url\n ? [\n {\n by: 'user' as const,\n description: `Open ${url} and approve the saved key with your wallet`,\n },\n ]\n : []),\n {\n by: 'agent',\n command: 'filecoin login --check',\n description: 'Keep the saved key and its scopes',\n },\n {\n by: 'user',\n command: loginCommand({ fresh: true, scopes: requested }),\n description:\n 'Replace the saved key; the wallet owner approves the new one',\n },\n ],\n })\n}\n\n/** Error returned by `--check` when the saved key has expired. */\nfunction sessionExpired(scopes: readonly ScopeId[]): CliError {\n return new CliError({\n code: ErrorCodes.sessionExpired,\n message: `The saved session key expired for: ${scopes.join(', ')}.`,\n details: { missing: scopes },\n next: [\n {\n by: 'user',\n command: 'filecoin login',\n description: 'Authorize a new session key with the same scopes',\n },\n ],\n })\n}\n\n/**\n * Authorize a session key through the filecoin-app dashboard.\n *\n * The key is generated and saved locally before anything is opened, so an\n * interrupted login resumes with the same key. Only its address leaves this\n * machine: the owner reviews a prefilled setup page and signs the approval\n * with their wallet. The CLI finds the approval on chain, so nothing is\n * copied back. Agents and pipes never wait or open a browser: they get the\n * approval link as a `login_pending` error and run `filecoin login --check` to\n * confirm.\n *\n * Flags left out keep the saved key's scopes, name, and expiry, so running\n * `filecoin login` again never changes the request. A new key replaces the saved\n * one only with `--fresh`, or when the saved key has expired.\n *\n * @see ../../../../apps/filecoin-app/src/routes/dashboard/setup.tsx\n */\nexport default defineHandler(login, async (ctx) => {\n const { input } = ctx\n if (input.sessionKey) {\n throw invalidInput(\n 'FILECOIN_SESSION_KEY is set; unset it to log in with filecoin-app.',\n 'sessionKey'\n )\n }\n if (input.check) {\n for (const field of ['scopes', 'name', 'days', 'fresh'] as const) {\n if (input[field] !== undefined && input[field] !== false) {\n throw invalidInput(\n `--check confirms the saved key as it is; drop --${field}.`,\n field\n )\n }\n }\n }\n const app = appFor(ctx)\n const human = ctx.mode.interactive && ctx.mode.agent === false\n const wait = input.wait ?? human\n const key = `sessions.${app.network}` as const\n const saved = app.config.get(key)\n const scopes = input.scopes ?? (saved ? savedScopes(saved) : DEFAULT_SCOPES)\n let session: StoredSession | undefined\n\n if (saved && !input.fresh) {\n let current = saved\n const covered =\n input.scopes == null ||\n input.scopes.every((scope) => savedScopes(saved).includes(scope))\n\n // Resume a pending login that covers the request. Before replacing one\n // that doesn't, check whether the owner approved it in the meantime.\n if (!current.rootAddress) {\n if (covered) {\n session = current\n } else {\n const state = await checkAuthorization({\n client: app.client,\n signer: getAddress(current.address),\n scopes: savedScopes(current),\n fromBlock: BigInt(current.fromBlock),\n })\n if (state.status === 'pending') {\n throw sessionConflict(app, current, scopes)\n }\n current = saveApproval(app, current, state)\n }\n }\n\n // Reuse an approved key that has the requested scopes. A key the owner\n // approved with fewer scopes is permission_denied. Only an expired key,\n // with every scope gone, is replaced without --fresh.\n if (current.rootAddress) {\n const root = getAddress(current.rootAddress)\n const signer = getAddress(current.address)\n const grants = await readScopes({\n client: app.client,\n root,\n signer,\n scopes,\n })\n if (\n grants.missing.length === 0 ||\n (input.scopes == null && grants.granted.length > 0)\n ) {\n return ctx.ok(finishLogin(app, current, { root, ...grants }))\n }\n if (input.scopes != null) {\n const held = await readScopes({\n client: app.client,\n root,\n signer,\n scopes: savedScopes(current),\n })\n if (held.granted.length > 0) {\n throw sessionConflict(app, current, scopes)\n }\n }\n if (input.check) throw sessionExpired(scopes)\n }\n }\n\n if (!session) {\n if (input.check) throw notLoggedIn()\n const privateKey = generatePrivateKey()\n const fromBlock = await getBlockNumber(app.client, { cacheTime: 0 })\n session = {\n privateKey,\n address: privateKeyToAccount(privateKey).address,\n scopes,\n ...(saved?.name ? { name: saved.name } : {}),\n ...(saved?.days == null ? {} : { days: saved.days }),\n fromBlock: fromBlock.toString(),\n createdAt: new Date().toISOString(),\n }\n }\n\n // Flags given now change the name and expiry; the rest stay as saved.\n const pending: StoredSession = {\n ...session,\n name: input.name ?? session.name ?? DEFAULT_KEY_NAME,\n ...(input.days == null ? {} : { days: input.days }),\n }\n app.config.set(key, pending)\n const url = authorizeUrl(app, pending)\n const check = {\n client: app.client,\n signer: getAddress(pending.address),\n scopes: savedScopes(pending),\n fromBlock: BigInt(pending.fromBlock),\n }\n\n if (!wait) {\n const state = await checkAuthorization(check)\n if (state.status === 'pending') throw loginPending(url)\n return ctx.ok(finishLogin(app, pending, state))\n }\n\n ctx.log(`Approve the session key in your browser:\\n ${url}`)\n if (input.open && human) openBrowser(url)\n ctx.progress({ phase: 'login', message: 'Waiting for approval on chain' })\n const state = await waitForAuthorization({\n ...check,\n timeoutMs: input.timeout * 1000,\n signal: ctx.signal,\n })\n if (state.status === 'pending') throw loginPending(url)\n return ctx.ok(finishLogin(app, pending, state))\n})\n"],
5
+ "mappings": "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",
6
+ "names": ["spawn", "openBrowser", "url", "command", "args", "child", "savedScopes", "session", "scopes", "isScopeId", "DEFAULT_SCOPES", "authorizeUrl", "app", "buildAuthorizeUrl", "saveApproval", "grants", "expiresAt", "approved", "finishLogin", "CliError", "ErrorCodes", "sessionConflict", "requested", "state", "url", "loginCommand", "sessionExpired", "login_default", "defineHandler", "login", "ctx", "input", "invalidInput", "field", "appFor", "human", "wait", "key", "saved", "current", "covered", "scope", "checkAuthorization", "getAddress", "root", "signer", "readScopes", "notLoggedIn", "privateKey", "generatePrivateKey", "fromBlock", "getBlockNumber", "privateKeyToAccount", "pending", "DEFAULT_KEY_NAME", "check", "loginPending", "openBrowser", "waitForAuthorization"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a as d}from"./chunk-Z6O5SHUU.js";import{ma as t}from"./chunk-72RYXITT.js";import"./chunk-JUFFOBKU.js";import"./chunk-35V77X3C.js";import"./chunk-RK6JJQZL.js";import"./chunk-7MEK5RQ7.js";import"./chunk-2VZELE36.js";import{k as n}from"./chunk-3TJUKWFC.js";import"./chunk-YIAP3JO3.js";var a=n(d,r=>{let o=t(r),s=`sessions.${o.network}`,e=o.config.get(s);return e&&o.config.delete(s),r.ok({network:o.network,removed:e!=null,...e?{address:e.address}:{}})});export{a as default};
3
+ //# sourceMappingURL=logout-3RWZFH2E.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/handlers/logout.ts"],
4
+ "sourcesContent": ["import { defineHandler } from 'clipact'\nimport { logout } from '../commands/logout.ts'\nimport { appFor } from './context.ts'\n\n/** Forget the saved session key for the network. */\nexport default defineHandler(logout, (ctx) => {\n const app = appFor(ctx)\n const key = `sessions.${app.network}` as const\n const session = app.config.get(key)\n if (session) app.config.delete(key)\n return ctx.ok({\n network: app.network,\n removed: session != null,\n ...(session ? { address: session.address } : {}),\n })\n})\n"],
5
+ "mappings": ";iSAKA,IAAOA,EAAQC,EAAcC,EAASC,GAAQ,CAC5C,IAAMC,EAAMC,EAAOF,CAAG,EAChBG,EAAM,YAAYF,EAAI,OAAO,GAC7BG,EAAUH,EAAI,OAAO,IAAIE,CAAG,EAClC,OAAIC,GAASH,EAAI,OAAO,OAAOE,CAAG,EAC3BH,EAAI,GAAG,CACZ,QAASC,EAAI,QACb,QAASG,GAAW,KACpB,GAAIA,EAAU,CAAE,QAASA,EAAQ,OAAQ,EAAI,CAAC,CAChD,CAAC,CACH,CAAC",
6
+ "names": ["logout_default", "defineHandler", "logout", "ctx", "app", "appFor", "key", "session"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a as m}from"./chunk-IAJFQYLN.js";import{b as p}from"./chunk-YVRWI5E3.js";import{W as n,ma as s,na as a}from"./chunk-72RYXITT.js";import"./chunk-JUFFOBKU.js";import"./chunk-35V77X3C.js";import"./chunk-RK6JJQZL.js";import"./chunk-7MEK5RQ7.js";import"./chunk-2VZELE36.js";import{k as e}from"./chunk-3TJUKWFC.js";import"./chunk-YIAP3JO3.js";var w=e(m,t=>{let o=s(t),i=n(o.db(),{...a(o),limit:t.input.limit,cursor:t.input.cursor,all:t.input.all});return t.ok({network:o.network,resources:i.items.map(r=>({ref:r.ref,kind:r.kind,name:r.name,size:r.size,status:r.status,url:p(r,o.apiUrl).browser,createdAt:r.createdAt})),...i.nextCursor?{nextCursor:i.nextCursor}:{}})});export{w as default};
3
+ //# sourceMappingURL=ls-F546AXRG.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/handlers/ls.ts"],
4
+ "sourcesContent": ["import { defineHandler } from 'clipact'\nimport { ls } from '../commands/ls.ts'\nimport { listResources } from '../state/resources.ts'\nimport { resourceUrls } from '../storage/urls.ts'\nimport { accountScope, appFor } from './context.ts'\n\n/** List managed resources, newest first, one page at a time. */\nexport default defineHandler(ls, (ctx) => {\n const app = appFor(ctx)\n const page = listResources(app.db(), {\n ...accountScope(app),\n limit: ctx.input.limit,\n cursor: ctx.input.cursor,\n all: ctx.input.all,\n })\n return ctx.ok({\n network: app.network,\n resources: page.items.map((resource) => ({\n ref: resource.ref,\n kind: resource.kind,\n name: resource.name,\n size: resource.size,\n status: resource.status,\n url: resourceUrls(resource, app.apiUrl).browser,\n createdAt: resource.createdAt,\n })),\n ...(page.nextCursor ? { nextCursor: page.nextCursor } : {}),\n })\n})\n"],
5
+ "mappings": ";wVAOA,IAAOA,EAAQC,EAAcC,EAAKC,GAAQ,CACxC,IAAMC,EAAMC,EAAOF,CAAG,EAChBG,EAAOC,EAAcH,EAAI,GAAG,EAAG,CACnC,GAAGI,EAAaJ,CAAG,EACnB,MAAOD,EAAI,MAAM,MACjB,OAAQA,EAAI,MAAM,OAClB,IAAKA,EAAI,MAAM,GACjB,CAAC,EACD,OAAOA,EAAI,GAAG,CACZ,QAASC,EAAI,QACb,UAAWE,EAAK,MAAM,IAAKG,IAAc,CACvC,IAAKA,EAAS,IACd,KAAMA,EAAS,KACf,KAAMA,EAAS,KACf,KAAMA,EAAS,KACf,OAAQA,EAAS,OACjB,IAAKC,EAAaD,EAAUL,EAAI,MAAM,EAAE,QACxC,UAAWK,EAAS,SACtB,EAAE,EACF,GAAIH,EAAK,WAAa,CAAE,WAAYA,EAAK,UAAW,EAAI,CAAC,CAC3D,CAAC,CACH,CAAC",
6
+ "names": ["ls_default", "defineHandler", "ls", "ctx", "app", "appFor", "page", "listResources", "accountScope", "resource", "resourceUrls"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a}from"./chunk-ASZ5KTWE.js";import{P as n,ma as u,na as s}from"./chunk-72RYXITT.js";import"./chunk-JUFFOBKU.js";import"./chunk-35V77X3C.js";import"./chunk-RK6JJQZL.js";import"./chunk-7MEK5RQ7.js";import"./chunk-2VZELE36.js";import{k as i}from"./chunk-3TJUKWFC.js";import"./chunk-YIAP3JO3.js";var f=i(a,e=>{let t=u(e),o=n(t.db(),{...s(t),limit:e.input.limit,cursor:e.input.cursor,incomplete:e.input.incomplete});return e.ok({network:t.network,operations:o.items.map(r=>({id:r.id,action:r.action,resourceRef:r.resourceRef,phase:r.phase,executionStatus:r.executionStatus,updatedAt:r.updatedAt,...r.error?{error:r.error}:{}})),...o.nextCursor?{nextCursor:o.nextCursor}:{}})});export{f as default};
3
+ //# sourceMappingURL=ls-GNEVBKRP.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/handlers/operations/ls.ts"],
4
+ "sourcesContent": ["import { defineHandler } from 'clipact'\nimport { ls } from '../../commands/operations/ls.ts'\nimport { listOperations } from '../../state/operations.ts'\nimport { accountScope, appFor } from '../context.ts'\n\n/** List operations, most recently updated first, one page at a time. */\nexport default defineHandler(ls, (ctx) => {\n const app = appFor(ctx)\n const page = listOperations(app.db(), {\n ...accountScope(app),\n limit: ctx.input.limit,\n cursor: ctx.input.cursor,\n incomplete: ctx.input.incomplete,\n })\n return ctx.ok({\n network: app.network,\n operations: page.items.map((op) => ({\n id: op.id,\n action: op.action,\n resourceRef: op.resourceRef,\n phase: op.phase,\n executionStatus: op.executionStatus,\n updatedAt: op.updatedAt,\n ...(op.error ? { error: op.error } : {}),\n })),\n ...(page.nextCursor ? { nextCursor: page.nextCursor } : {}),\n })\n})\n"],
5
+ "mappings": ";2SAMA,IAAOA,EAAQC,EAAcC,EAAKC,GAAQ,CACxC,IAAMC,EAAMC,EAAOF,CAAG,EAChBG,EAAOC,EAAeH,EAAI,GAAG,EAAG,CACpC,GAAGI,EAAaJ,CAAG,EACnB,MAAOD,EAAI,MAAM,MACjB,OAAQA,EAAI,MAAM,OAClB,WAAYA,EAAI,MAAM,UACxB,CAAC,EACD,OAAOA,EAAI,GAAG,CACZ,QAASC,EAAI,QACb,WAAYE,EAAK,MAAM,IAAKG,IAAQ,CAClC,GAAIA,EAAG,GACP,OAAQA,EAAG,OACX,YAAaA,EAAG,YAChB,MAAOA,EAAG,MACV,gBAAiBA,EAAG,gBACpB,UAAWA,EAAG,UACd,GAAIA,EAAG,MAAQ,CAAE,MAAOA,EAAG,KAAM,EAAI,CAAC,CACxC,EAAE,EACF,GAAIH,EAAK,WAAa,CAAE,WAAYA,EAAK,UAAW,EAAI,CAAC,CAC3D,CAAC,CACH,CAAC",
6
+ "names": ["ls_default", "defineHandler", "ls", "ctx", "app", "appFor", "page", "listOperations", "accountScope", "op"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a,b}from"./chunk-FCVBKUS5.js";import"./chunk-2VZELE36.js";import"./chunk-3TJUKWFC.js";import"./chunk-YIAP3JO3.js";export{b as default,a as firstLine};
3
+ //# sourceMappingURL=map-error-QLS3CQMO.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a as I}from"./chunk-CIVQHT3F.js";import{a as y,b as k}from"./chunk-GCPUMM4E.js";import"./chunk-AKXAQJ6H.js";import"./chunk-YVRWI5E3.js";import{X as p,fa as S,ga as w,k as l,la as v,ma as C,oa as U}from"./chunk-72RYXITT.js";import{k as m}from"./chunk-JUFFOBKU.js";import"./chunk-35V77X3C.js";import"./chunk-RK6JJQZL.js";import"./chunk-7MEK5RQ7.js";import"./chunk-2VZELE36.js";import{k as g,q as h}from"./chunk-3TJUKWFC.js";import"./chunk-YIAP3JO3.js";var L=g(I,async r=>{let{input:n}=r,d=C(r),f={path:n.path,name:n.name,providerId:n.provider==null?void 0:BigInt(n.provider)};if(r.dryRun){let u,s="ready",a;try{let t=S(d);a=await w(t,l),a.length>0&&(s="scopes_missing"),u=v(d,t)}catch(t){if(!h(t))throw t;if(t.code===m.authRequired)s="login_required";else if(t.code===m.loginPending)s="login_pending";else throw t}let o=await k({...f,backend:u}),{placement:i,quote:e}=o;return r.ok({dryRun:!0,estimate:{kind:o.kind,name:o.name,size:o.size,files:o.files,...o.rootCid?{rootCid:o.rootCid}:{},network:d.network,authorization:s,...a?.length?{missingScopes:a}:{},...i?{provider:{id:i.providerId.toString(),serviceURL:i.serviceURL,...i.dataSetId==null?{}:{dataSetId:i.dataSetId.toString()}}}:{},...e?{cost:{token:"USDFC",ready:e.ready,depositNeeded:p(e.depositNeeded),needsApproval:e.needsApproval,ratePerMonth:p(e.ratePerMonth),lockup:p(e.lockup),...e.ready?{}:{fundingUrl:e.fundingUrl}}}:{},checkedAt:new Date().toISOString()}})}let P=await U(d,l,r),c=await y(P,f);return r.ok({dryRun:!1,...c,state:"ready"},{next:[{by:"agent",command:`filecoin get ${c.resource.ref}`,description:"Download and verify the stored content"},{by:"agent",command:`filecoin inspect ${c.resource.ref} --check`,description:"Check that the piece URL answers"}]})});export{L as default};
3
+ //# sourceMappingURL=put-FXMGPSU6.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/handlers/put.ts"],
4
+ "sourcesContent": ["import { defineHandler, isCliError } from 'clipact'\nimport { PUT_SCOPES } from '../auth/scopes.ts'\nimport { missingScopes, openSession } from '../auth/session.ts'\nimport { put } from '../commands/put.ts'\nimport { ErrorCodes } from '../errors.ts'\nimport { estimatePut, startPut } from '../storage/jobs.ts'\nimport { createSynapseBackend } from '../storage/synapse.ts'\nimport type { StorageBackend } from '../storage/types.ts'\nimport { formatUsdfc } from '../usdfc.ts'\nimport { appFor, jobContext } from './context.ts'\n\n/** How ready the session key is to sign a put. */\ntype Authorization =\n | 'ready'\n | 'login_required'\n | 'login_pending'\n | 'scopes_missing'\n\n/**\n * Store a file as a raw piece, or a directory as a UnixFS CAR, with one copy\n * on one provider. With `--dry-run`, report what would be stored, where, and\n * at what cost, without signing, uploading, or creating anything.\n */\nexport default defineHandler(put, async (ctx) => {\n const { input } = ctx\n const app = appFor(ctx)\n const options = {\n path: input.path,\n name: input.name,\n providerId: input.provider == null ? undefined : BigInt(input.provider),\n }\n\n if (ctx.dryRun) {\n let backend: StorageBackend | undefined\n let authorization: Authorization = 'ready'\n let missing: string[] | undefined\n try {\n const sessionKey = openSession(app)\n missing = await missingScopes(sessionKey, PUT_SCOPES)\n if (missing.length > 0) authorization = 'scopes_missing'\n backend = createSynapseBackend(app, sessionKey)\n } catch (error) {\n if (!isCliError(error)) throw error\n if (error.code === ErrorCodes.authRequired)\n authorization = 'login_required'\n else if (error.code === ErrorCodes.loginPending)\n authorization = 'login_pending'\n else throw error\n }\n const estimate = await estimatePut({ ...options, backend })\n const { placement, quote } = estimate\n return ctx.ok({\n dryRun: true,\n estimate: {\n kind: estimate.kind,\n name: estimate.name,\n size: estimate.size,\n files: estimate.files,\n ...(estimate.rootCid ? { rootCid: estimate.rootCid } : {}),\n network: app.network,\n authorization,\n ...(missing?.length ? { missingScopes: missing } : {}),\n ...(placement\n ? {\n provider: {\n id: placement.providerId.toString(),\n serviceURL: placement.serviceURL,\n ...(placement.dataSetId == null\n ? {}\n : { dataSetId: placement.dataSetId.toString() }),\n },\n }\n : {}),\n ...(quote\n ? {\n cost: {\n token: 'USDFC' as const,\n ready: quote.ready,\n depositNeeded: formatUsdfc(quote.depositNeeded),\n needsApproval: quote.needsApproval,\n ratePerMonth: formatUsdfc(quote.ratePerMonth),\n lockup: formatUsdfc(quote.lockup),\n ...(quote.ready ? {} : { fundingUrl: quote.fundingUrl }),\n },\n }\n : {}),\n checkedAt: new Date().toISOString(),\n },\n })\n }\n\n const job = await jobContext(app, PUT_SCOPES, ctx)\n const result = await startPut(job, options)\n return ctx.ok(\n { dryRun: false, ...result, state: 'ready' },\n {\n next: [\n {\n by: 'agent',\n command: `filecoin get ${result.resource.ref}`,\n description: 'Download and verify the stored content',\n },\n {\n by: 'agent',\n command: `filecoin inspect ${result.resource.ref} --check`,\n description: 'Check that the piece URL answers',\n },\n ],\n }\n )\n})\n"],
5
+ "mappings": ";ycAuBA,IAAOA,EAAQC,EAAcC,EAAK,MAAOC,GAAQ,CAC/C,GAAM,CAAE,MAAAC,CAAM,EAAID,EACZE,EAAMC,EAAOH,CAAG,EAChBI,EAAU,CACd,KAAMH,EAAM,KACZ,KAAMA,EAAM,KACZ,WAAYA,EAAM,UAAY,KAAO,OAAY,OAAOA,EAAM,QAAQ,CACxE,EAEA,GAAID,EAAI,OAAQ,CACd,IAAIK,EACAC,EAA+B,QAC/BC,EACJ,GAAI,CACF,IAAMC,EAAaC,EAAYP,CAAG,EAClCK,EAAU,MAAMG,EAAcF,EAAYG,CAAU,EAChDJ,EAAQ,OAAS,IAAGD,EAAgB,kBACxCD,EAAUO,EAAqBV,EAAKM,CAAU,CAChD,OAASK,EAAO,CACd,GAAI,CAACC,EAAWD,CAAK,EAAG,MAAMA,EAC9B,GAAIA,EAAM,OAASE,EAAW,aAC5BT,EAAgB,yBACTO,EAAM,OAASE,EAAW,aACjCT,EAAgB,oBACb,OAAMO,CACb,CACA,IAAMG,EAAW,MAAMC,EAAY,CAAE,GAAGb,EAAS,QAAAC,CAAQ,CAAC,EACpD,CAAE,UAAAa,EAAW,MAAAC,CAAM,EAAIH,EAC7B,OAAOhB,EAAI,GAAG,CACZ,OAAQ,GACR,SAAU,CACR,KAAMgB,EAAS,KACf,KAAMA,EAAS,KACf,KAAMA,EAAS,KACf,MAAOA,EAAS,MAChB,GAAIA,EAAS,QAAU,CAAE,QAASA,EAAS,OAAQ,EAAI,CAAC,EACxD,QAASd,EAAI,QACb,cAAAI,EACA,GAAIC,GAAS,OAAS,CAAE,cAAeA,CAAQ,EAAI,CAAC,EACpD,GAAIW,EACA,CACE,SAAU,CACR,GAAIA,EAAU,WAAW,SAAS,EAClC,WAAYA,EAAU,WACtB,GAAIA,EAAU,WAAa,KACvB,CAAC,EACD,CAAE,UAAWA,EAAU,UAAU,SAAS,CAAE,CAClD,CACF,EACA,CAAC,EACL,GAAIC,EACA,CACE,KAAM,CACJ,MAAO,QACP,MAAOA,EAAM,MACb,cAAeC,EAAYD,EAAM,aAAa,EAC9C,cAAeA,EAAM,cACrB,aAAcC,EAAYD,EAAM,YAAY,EAC5C,OAAQC,EAAYD,EAAM,MAAM,EAChC,GAAIA,EAAM,MAAQ,CAAC,EAAI,CAAE,WAAYA,EAAM,UAAW,CACxD,CACF,EACA,CAAC,EACL,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,CACF,CAAC,CACH,CAEA,IAAME,EAAM,MAAMC,EAAWpB,EAAKS,EAAYX,CAAG,EAC3CuB,EAAS,MAAMC,EAASH,EAAKjB,CAAO,EAC1C,OAAOJ,EAAI,GACT,CAAE,OAAQ,GAAO,GAAGuB,EAAQ,MAAO,OAAQ,EAC3C,CACE,KAAM,CACJ,CACE,GAAI,QACJ,QAAS,gBAAgBA,EAAO,SAAS,GAAG,GAC5C,YAAa,wCACf,EACA,CACE,GAAI,QACJ,QAAS,oBAAoBA,EAAO,SAAS,GAAG,WAChD,YAAa,kCACf,CACF,CACF,CACF,CACF,CAAC",
6
+ "names": ["put_default", "defineHandler", "put", "ctx", "input", "app", "appFor", "options", "backend", "authorization", "missing", "sessionKey", "openSession", "missingScopes", "PUT_SCOPES", "createSynapseBackend", "error", "isCliError", "ErrorCodes", "estimate", "estimatePut", "placement", "quote", "formatUsdfc", "job", "jobContext", "result", "startPut"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a as u}from"./chunk-K63EJUGU.js";import{c as n,d as a}from"./chunk-GCPUMM4E.js";import"./chunk-AKXAQJ6H.js";import"./chunk-YVRWI5E3.js";import{k as i,l as p,ma as m,oa as d,qa as s}from"./chunk-72RYXITT.js";import"./chunk-JUFFOBKU.js";import"./chunk-35V77X3C.js";import"./chunk-RK6JJQZL.js";import"./chunk-7MEK5RQ7.js";import"./chunk-2VZELE36.js";import{k as e}from"./chunk-3TJUKWFC.js";import"./chunk-YIAP3JO3.js";var P=e(u,async o=>{let r=m(o),t=s(r,o.input.id);if(t.executionStatus==="completed")return o.ok(a({db:r.db(),apiUrl:r.apiUrl},t));let f=t.action==="put"?i:p,c=await d(r,f,o);return o.ok(await n(c,t.id))});export{P as default};
3
+ //# sourceMappingURL=resume-G5PS246S.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/handlers/operations/resume.ts"],
4
+ "sourcesContent": ["import { defineHandler } from 'clipact'\nimport { PUT_SCOPES, RM_SCOPES } from '../../auth/scopes.ts'\nimport { resume } from '../../commands/operations/resume.ts'\nimport { runOperation, savedOutcome } from '../../storage/jobs.ts'\nimport { appFor, findOperation, jobContext } from '../context.ts'\n\n/**\n * Continue an unfinished operation with its saved input. A completed one\n * returns its saved outcome without loading the session key.\n */\nexport default defineHandler(resume, async (ctx) => {\n const app = appFor(ctx)\n const op = findOperation(app, ctx.input.id)\n if (op.executionStatus === 'completed') {\n return ctx.ok(savedOutcome({ db: app.db(), apiUrl: app.apiUrl }, op))\n }\n const scopes = op.action === 'put' ? PUT_SCOPES : RM_SCOPES\n const job = await jobContext(app, scopes, ctx)\n return ctx.ok(await runOperation(job, op.id))\n})\n"],
5
+ "mappings": ";saAUA,IAAOA,EAAQC,EAAcC,EAAQ,MAAOC,GAAQ,CAClD,IAAMC,EAAMC,EAAOF,CAAG,EAChBG,EAAKC,EAAcH,EAAKD,EAAI,MAAM,EAAE,EAC1C,GAAIG,EAAG,kBAAoB,YACzB,OAAOH,EAAI,GAAGK,EAAa,CAAE,GAAIJ,EAAI,GAAG,EAAG,OAAQA,EAAI,MAAO,EAAGE,CAAE,CAAC,EAEtE,IAAMG,EAASH,EAAG,SAAW,MAAQI,EAAaC,EAC5CC,EAAM,MAAMC,EAAWT,EAAKK,EAAQN,CAAG,EAC7C,OAAOA,EAAI,GAAG,MAAMW,EAAaF,EAAKN,EAAG,EAAE,CAAC,CAC9C,CAAC",
6
+ "names": ["resume_default", "defineHandler", "resume", "ctx", "app", "appFor", "op", "findOperation", "savedOutcome", "scopes", "PUT_SCOPES", "RM_SCOPES", "job", "jobContext", "runOperation"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{b as a,c as b,d as c,e as d,f as e}from"./chunk-35V77X3C.js";import"./chunk-7MEK5RQ7.js";import"./chunk-YIAP3JO3.js";export{e as encodeToCurve,d as hashToCurve,b as schnorr,a as secp256k1,c as secp256k1_hasher};
3
+ //# sourceMappingURL=secp256k1-2OHXXNYZ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,5 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{k as y,p as L,s as p}from"./chunk-3TJUKWFC.js";import"./chunk-YIAP3JO3.js";import{access as Q,chmod as V,mkdir as X,readdir as T,readFile as M,realpath as N,rm as O,rmdir as A,stat as Y,writeFile as R}from"node:fs/promises";import{homedir as Z}from"node:os";import{basename as ee,dirname as v,join as m,relative as te,sep as S}from"node:path";var g=".clipact.json";function E(e){return e==="global"?Z():process.cwd()}function ne(e){return e==="global"?"home directory":"current directory"}function P(e,t){return m(E(e),`.${t}`,"skills")}function B(e){return e.code==="ENOENT"}function $(e){return t=>{if(B(t))return e;throw t}}function F(e){return{name:e.name,target:e.target,path:e.path}}function x(e){let{createHash:t}=process.getBuiltinModule("node:crypto");return t("sha256").update(e).digest("hex")}function C(e){return M(e).then(x,$(void 0))}async function z(e){let t=await T(e,{recursive:!0,withFileTypes:!0}).catch($([])),s=n=>t.filter(n).map(i=>te(e,m(i.parentPath,i.name)).split(S).join("/")).sort();return{files:s(n=>n.isFile()),links:s(n=>n.isSymbolicLink())}}async function H(e){try{return await N(e)}catch(t){if(!B(t))throw t;let s=v(e);return s===e?e:m(await H(s),ee(e))}}function se(e,t){return t===e||t.startsWith(`${e}${S}`)}function ie(e){return e!==g&&!/[\\\0]/.test(e)&&e.split("/").every(t=>t!==""&&t!=="."&&t!=="..")}async function I(e){let t=await T(e,{withFileTypes:!0});return(await Promise.all(t.filter(n=>n.isDirectory()).map(({name:n})=>Q(m(e,n,"SKILL.md")).then(()=>n,()=>{})))).filter(n=>n!==void 0).sort()}async function J(e){let t=await I(e);if(t.length===0)throw new Error(`No skills with a SKILL.md found in ${e}`);return await Promise.all(t.map(async s=>{let n=m(e,s),i=(await z(n)).files.filter(a=>a!==g),r=await Promise.all(i.map(async a=>{let[l,c]=await Promise.all([M(m(n,a)),Y(m(n,a))]);return[a,{content:l,mode:c.mode&511,hash:x(l)}]}));return{name:s,files:new Map(r)}}))}async function K(e,t){let s=await M(m(e,g),"utf8").catch($(void 0));if(s!==void 0)try{let n=JSON.parse(s),i=n?.files;return n.cli===t&&typeof n.version=="string"&&typeof i=="object"&&i!==null&&!Array.isArray(i)&&Object.entries(i).every(([r,a])=>ie(r)&&typeof a=="string")?n:void 0}catch{return}}async function W(e,t){let[s,n]=await Promise.all([z(t),H(t)]);return{files:s.files,links:s.links.map(i=>m(t,i)),resolvesTo:se(e,n)?void 0:n}}function j(e){return e.links.length>0||e.resolvesTo!==void 0}async function ae(e,t,s,n,i){let r=m(P(t,n),i),a=await W(s,r),l=j(a)?void 0:await K(r,e.name),c=Object.entries(l?.files??{}),o=await Promise.all(c.map(([u])=>C(m(r,u)))),d=c.filter(([,u],f)=>o[f]!==u).map(([u])=>u);return{name:i,target:n,path:r,...a,manifest:l,edited:d}}async function D(e,t,s,n){let i=await N(E(t));return await Promise.all(p.filter(r=>s.includes(r)).flatMap(r=>n.map(a=>ae(e,t,i,r,a))))}async function G(e,t,s,n){let i=new Map(n.map(a=>[a.name,a]));return(await D(e,t,s,[...i.keys()])).map(a=>({bundle:i.get(a.name),copy:a}))}function U(e,t,s){if(j(t))return"symlink";if(!t.manifest)return t.files.length>0?"unmanaged":"missing";if(t.edited.length>0)return"edited";let n=t.manifest.files;return t.manifest.version===e.version&&Object.keys(n).length===s.files.size&&[...s.files].every(([r,{hash:a}])=>n[r]===a)?"current":"stale"}async function re(e,t){let s=e.manifest?.files??{},n=e.files.filter(r=>!(r in s)&&t.files.has(r)),i=await Promise.all(n.map(r=>C(m(e.path,r))));return n.filter((r,a)=>i[a]!==t.files.get(r)?.hash)}async function oe(e,t,s,n){let i=F(e);if(s==="symlink")return{...i,reason:"symlink",...e.resolvesTo?{files:[e.path,...e.links],resolvesTo:e.resolvesTo}:{files:e.links}};if(n||s==="missing")return;if(s==="unmanaged")return{...i,reason:"unmanaged"};let r=[...e.edited,...await re(e,t)].sort();return r.length>0?{...i,reason:"edited",files:r}:void 0}async function _(e,t){await O(m(e,t),{force:!0});let s=v(m(e,t));for(;s.startsWith(`${e}${S}`);){try{await A(s)}catch{return}s=v(s)}}async function le(e,t,s){let n=[...s.files.keys()].map(a=>m(t.path,a));await Promise.all([...new Set(n.map(a=>v(a)))].map(a=>X(a,{recursive:!0}))),await Promise.all([...s.files.values()].map(async({content:a,mode:l},c)=>{let o=n[c];await O(o,{force:!0}),await R(o,a),await V(o,l)}));let i=Object.fromEntries([...s.files].map(([a,{hash:l}])=>[a,l]));for(let a of Object.keys(t.manifest?.files??{}))s.files.has(a)||t.edited.includes(a)||await _(t.path,a);let r={cli:e.name,version:e.version,files:i};await R(m(t.path,g),`${JSON.stringify(r,null,2)}
3
+ `)}function b(e,t,s){let n=[...t==="global"?["--scope global"]:[],...s.length===p.length?[]:s.map(i=>`--target ${i}`)];return[e.name,"skills","install",...n].join(" ")}function pe(e,t,s){return y(s,async n=>{let{scope:i,target:r,force:a}=n.input,l=await J(t),c=(await G(e,i,r,l)).map(({bundle:u,copy:f})=>({bundle:u,copy:f,state:U(e,f,u)})),o=(await Promise.all(c.map(({bundle:u,copy:f,state:w})=>oe(f,u,w,a)))).filter(u=>u!==void 0);if(o.length>0){let u=[],f=o.filter(h=>h.resolvesTo),w=ne(i);if(c.some(({copy:h})=>h.links.length>0)&&u.push({by:"user",description:"Remove the symbolic links inside these skill directories; install never writes through them"}),f.length>0){let h=i==="global"?"project":"global";u.push({by:"user",description:`Copy the skills by hand from ${t}, or replace the linked directory with a real one; install never writes outside the ${w}`},{by:"user",command:b(e,h,r),description:`Install into the ${h} scope instead`})}o.some(h=>h.reason!=="symlink")&&u.push({by:"user",command:`${b(e,i,r)} --force`,description:"Replace them, discarding local changes"});let k=o.map(h=>h.path).join(", "),q=f.map(h=>` ${h.path} resolves to ${h.resolvesTo}, outside the ${w}.`).join("");throw new L({code:"skill_conflict",message:`Not replacing skill directories with local changes, symbolic links, or files not installed by ${e.name}: ${k}.${q}`,retryable:!1,details:o,next:u})}let d=[];for(let{bundle:u,copy:f,state:w}of c){let k=w==="missing"?"installed":w==="current"?"unchanged":"updated";k!=="unchanged"&&!n.dryRun&&await le(e,f,u),d.push({...F(f),action:k})}return n.ok({scope:i,skills:d})})}function we(e,t,s){return y(s,async n=>{let{scope:i,target:r}=n.input,a=await I(t),l=[];for(let c of await D(e,i,r,a)){let o=F(c);if(!c.manifest){let f="unmanaged";c.files.length===0&&c.links.length===0?f="missing":j(c)&&(f="symlink"),l.push({...o,action:f});continue}let d=Object.keys(c.manifest.files).filter(f=>!c.edited.includes(f)),u=c.files.filter(f=>f!==g&&!d.includes(f));if(!n.dryRun){for(let f of d)await _(c.path,f);await O(m(c.path,g),{force:!0}),await A(c.path).catch(()=>{})}l.push({...o,action:"removed",...u.length>0?{kept:u}:{}})}return n.ok({scope:i,skills:l})})}function ge(e,t,s){return y(s,async n=>{let i=n.input.scope?[n.input.scope]:["project","global"],r=await J(t),a=await Promise.all(i.map(o=>G(e,o,p,r))),l=i.flatMap((o,d)=>(a[d]??[]).map(({bundle:u,copy:f})=>({name:f.name,scope:o,target:f.target,path:f.path,status:U(e,f,u),...f.manifest?{version:f.manifest.version}:{}}))),c=[];for(let o of i)l.some(d=>d.scope===o&&d.status==="stale")&&c.push({by:"agent",command:b(e,o,p),description:`Update the ${o} skills to this version`});if(l.every(o=>o.status==="missing")){let o=n.input.scope??"project";c.push({by:"agent",command:b(e,o,p),description:o==="global"?"Install the skills for every project":"Install the skills for this project"})}return n.ok({version:e.version,skills:l},{next:c})})}async function ke(e,t){let s=await Promise.all(p.map(l=>T(P("project",l)).catch($([]))));if(s.every(l=>l.length===0))return;let[n,i]=await Promise.all([I(t).then(l=>new Set(l)),N(E("project"))]),r=await Promise.all(p.flatMap((l,c)=>(s[c]??[]).filter(o=>n.has(o)).map(async o=>{let d=m(P("project",l),o),u=await K(d,e.name);if(!(!u||u.version===e.version||j(await W(i,d))))return[o,u.version]}))),a=new Map(r.filter(l=>l!==void 0));if(a.size!==0)return[...a].map(([l,c])=>`${e.name}: the installed "${l}" skill is from version ${c}; run "${e.name} skills install" to update it.`).join(`
4
+ `)}export{g as MANIFEST,pe as install,ke as staleNotice,ge as status,we as uninstall};
5
+ //# sourceMappingURL=skills.run-E7FJPXEM.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../node_modules/.pnpm/clipact@0.4.0/node_modules/clipact/src/skills.run.ts"],
4
+ "sourcesContent": [null],
5
+ "mappings": "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",
6
+ "names": ["access", "chmod", "mkdir", "readdir", "readFile", "realpath", "rm", "rmdir", "stat", "writeFile", "homedir", "basename", "dirname", "join", "relative", "sep", "MANIFEST", "scopeBase", "scope", "homedir", "scopeBaseName", "skillsRoot", "target", "join", "isMissing", "error", "unlessMissing", "fallback", "where", "copy", "hash", "content", "createHash", "hashFile", "path", "readFile", "scan", "dir", "entries", "readdir", "paths", "keep", "entry", "relative", "sep", "resolveExisting", "realpath", "parent", "dirname", "basename", "isInside", "root", "isSafePath", "file", "part", "bundleNames", "source", "name", "access", "readBundles", "names", "files", "info", "stat", "readManifest", "cli", "text", "manifest", "digest", "locate", "base", "found", "real", "link", "isLinked", "location", "inspect", "listed", "hashes", "edited", "expected", "index", "inspectAll", "targets", "TARGETS", "inspectBundles", "bundles", "byName", "bundle", "stateOf", "installed", "overwrites", "local", "conflictOf", "state", "force", "removeFile", "rm", "rmdir", "write", "mkdir", "mode", "writeFile", "chmod", "installCommand", "flags", "install", "command", "defineHandler", "ctx", "copies", "conflicts", "conflict", "next", "outside", "other", "resolved", "CliError", "skills", "action", "uninstall", "remove", "kept", "status", "scopes", "inspected", "staleNotice", "shipped", "stale", "version"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a as D}from"./chunk-63JLHZEK.js";import{E as F,H as S,I as E,X as u,Z as v,a as P,b as C,ba as I,c as R,f,g as b,ha as T,i as x,ia as N,j as y,ja as L,ka as O,ma as U}from"./chunk-72RYXITT.js";import{k as w}from"./chunk-JUFFOBKU.js";import"./chunk-35V77X3C.js";import"./chunk-RK6JJQZL.js";import"./chunk-7MEK5RQ7.js";import"./chunk-2VZELE36.js";import{k as A,q as h}from"./chunk-3TJUKWFC.js";import"./chunk-YIAP3JO3.js";function H(t){let e=f(t.chain);return{abi:e.contracts.filecoinPay.abi,address:t.contractAddress??e.contracts.filecoinPay.address,functionName:"getRail",args:[t.railId]}}async function M(t,e){let{cursor:o,limit:a}=S(e,100n),s=await P(t,W({chain:t.chain,payer:e.payer,token:e.token,offset:o,limit:a,contractAddress:e.contractAddress}));return z(s)}function W(t){let e=f(t.chain),o=t.token??e.contracts.usdfc.address;return{abi:e.contracts.filecoinPay.abi,address:t.contractAddress??e.contracts.filecoinPay.address,functionName:"getRailsForPayerAndToken",args:[t.payer,o,t.offset,t.limit]}}function z(t){return{items:t[0].map(e=>({railId:e.railId,isTerminated:e.isTerminated,endEpoch:e.endEpoch})),...t[1]<t[2]?{nextCursor:t[1]}:{},total:t[2]}}async function B(t,e){let o=0n,a=[],s=async()=>{if(a.length>0){let c=await R(t,{allowFailure:!1,contracts:a.map(r=>H({chain:t.chain,railId:r.railId,contractAddress:e.contractAddress}))});for(let r of c)o+=r.lockupFixed}a=[]};for await(let c of E(({cursor:r})=>M(t,{payer:e.address,token:e.token,contractAddress:e.contractAddress,cursor:r,limit:100n})))a.push(c),a.length===100&&await s();return await s(),{totalFixedLockup:o}}async function _(t,e){let{address:o,token:a,epoch:s,contractAddress:c}=e,[r,i,m]=await Promise.all([N(t,{address:o,token:a,contractAddress:c,blockNumber:s}),B(t,{address:o,token:a,contractAddress:c}),s??C(t,{cacheTime:0})]),p={funds:r.funds,lockupCurrent:r.lockupCurrent,lockupRate:r.lockupRate,lockupLastSettledAt:r.lockupLastSettledAt,currentEpoch:m},{availableFunds:n,runwayInEpochs:l,grossCoverageInEpochs:d}=L(p),j=T(p),k=r.funds>n?r.funds-n:0n,{totalFixedLockup:g}=i,K=k>g?k-g:0n;return{funds:r.funds,availableFunds:n,debt:j,lockupRatePerEpoch:r.lockupRate,lockupRatePerMonth:r.lockupRate*F.EPOCHS_PER_MONTH,totalLockup:k,totalFixedLockup:g,totalRateBasedLockup:K,runwayInEpochs:l,grossCoverageInEpochs:d,epoch:m}}var G=1n<<20n,Ce=A(D,async t=>{let e=U(t),o;try{o=I(e)}catch(n){if(h(n)&&n.code===w.loginPending){let l=e.config.get(`sessions.${e.network}`),{url:d}=n.details;return t.ok({network:e.network,session:{state:"pending",...l?{address:l.address}:{},url:d}})}throw n}if(!o)return t.ok({network:e.network,session:{state:"none"}});let a=o.rootAddress,s=x(o.privateKey).address,[c,r,i]=await Promise.all([b(e.client,{address:a,sessionKeyAddress:s,permissions:Object.values(y)}),_(e.client,{address:a}),O(e.client,{clientAddress:a,pieceSizes:[G],isNewDataSet:!0})]),m=BigInt(Math.floor(Date.now()/1e3)),p=Object.fromEntries(Object.entries(y).map(([n,l])=>{let d=c[l]??0n;return[n,d>m?new Date(Number(d)*1e3).toISOString():d>0n?"expired":"not granted"]}));return t.ok({network:e.network,session:{state:"active",source:o.source,address:s,rootAddress:a,scopes:p},account:{token:"USDFC",funds:u(r.funds),availableFunds:u(r.availableFunds),debt:u(r.debt),ready:i.ready,needsApproval:i.needsFwssMaxApproval,depositNeeded:u(i.depositNeeded),...i.ready?{}:{fundingUrl:v({consoleUrl:e.consoleUrl,network:e.network,deposit:i.depositNeeded})}}})});export{Ce as default};
3
+ //# sourceMappingURL=status-HOLDXKMR.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../node_modules/.pnpm/@filoz+synapse-core@0.10.1_typescript@7.0.2_viem@2.57.2_typescript@7.0.2_zod@4.6.5_/node_modules/@filoz/synapse-core/src/pay/get-rail.ts", "../../../../node_modules/.pnpm/@filoz+synapse-core@0.10.1_typescript@7.0.2_viem@2.57.2_typescript@7.0.2_zod@4.6.5_/node_modules/@filoz/synapse-core/src/pay/get-rails-for-payer-and-token.ts", "../../../../node_modules/.pnpm/@filoz+synapse-core@0.10.1_typescript@7.0.2_viem@2.57.2_typescript@7.0.2_zod@4.6.5_/node_modules/@filoz/synapse-core/src/pay/total-account-fixed-lockup.ts", "../../../../node_modules/.pnpm/@filoz+synapse-core@0.10.1_typescript@7.0.2_viem@2.57.2_typescript@7.0.2_zod@4.6.5_/node_modules/@filoz/synapse-core/src/pay/get-account-summary.ts", "../../src/handlers/status.ts"],
4
+ "sourcesContent": ["import type { Simplify } from 'type-fest'\nimport type {\n Address,\n Chain,\n Client,\n ContractFunctionParameters,\n ContractFunctionReturnType,\n ReadContractErrorType,\n Transport,\n} from 'viem'\nimport { readContract } from 'viem/actions'\nimport type { filecoinPay as paymentsAbi } from '../abis/index.ts'\nimport { asChain } from '../chains.ts'\nimport type { ActionCallChain } from '../types.ts'\n\nexport namespace getRail {\n export type OptionsType = {\n /** The rail ID to query */\n railId: bigint\n /** Payments contract address. If not provided, the default is the payments contract address for the chain. */\n contractAddress?: Address\n }\n\n export type ContractOutputType = ContractFunctionReturnType<typeof paymentsAbi, 'pure' | 'view', 'getRail'>\n\n /**\n * The rail information from the payments contract.\n */\n export type OutputType = {\n /** The address of the ERC20 token used for payments */\n token: Address\n /** The address of the payer */\n from: Address\n /** The address of the payee */\n to: Address\n /** The address of the operator */\n operator: Address\n /** The address of the validator */\n validator: Address\n /** Payment rate per epoch (in token base units) */\n paymentRate: bigint\n /** Lockup period in epochs */\n lockupPeriod: bigint\n /** Fixed lockup amount (in token base units) */\n lockupFixed: bigint\n /** Epoch up to which the rail has been settled */\n settledUpTo: bigint\n /** End epoch (0 for active rails, > 0 for terminated rails) */\n endEpoch: bigint\n /** Commission rate in basis points (e.g., 500 = 5%) */\n commissionRateBps: bigint\n /** Address that receives service fees */\n serviceFeeRecipient: Address\n }\n\n export type ErrorType = getRailCall.ErrorType | ReadContractErrorType\n}\n\n/**\n * Get rail information from the Filecoin Pay contract\n *\n * Returns detailed information about a payment rail including payer, payee, payment rate,\n * lockup details, settlement status, and termination status.\n *\n * @param client - The client to use to get the rail info.\n * @param options - {@link getRail.OptionsType}\n * @returns The rail information {@link getRail.OutputType}\n * @throws Errors {@link getRail.ErrorType}\n *\n * @example\n * ```ts\n * import { getRail } from '@filoz/synapse-core/pay'\n * import { createPublicClient, http } from 'viem'\n * import { calibration } from '@filoz/synapse-core/chains'\n *\n * const client = createPublicClient({\n * chain: calibration,\n * transport: http(),\n * })\n *\n * const rail = await getRail(client, {\n * railId: 1n,\n * })\n *\n * console.log('Payer:', rail.from)\n * console.log('Payee:', rail.to)\n * console.log('Payment rate:', rail.paymentRate)\n * console.log('Is terminated:', rail.endEpoch > 0n)\n * ```\n */\nexport async function getRail(\n client: Client<Transport, Chain>,\n options: getRail.OptionsType\n): Promise<getRail.OutputType> {\n return readContract(\n client,\n getRailCall({\n chain: client.chain,\n railId: options.railId,\n contractAddress: options.contractAddress,\n })\n )\n}\n\nexport namespace getRailCall {\n export type OptionsType = Simplify<getRail.OptionsType & ActionCallChain>\n export type ErrorType = asChain.ErrorType\n export type OutputType = ContractFunctionParameters<typeof paymentsAbi, 'pure' | 'view', 'getRail'>\n}\n\n/**\n * Create a call to the getRail function\n *\n * This function is used to create a call to the getRail function for use with the multicall or readContract function.\n *\n * @param options - {@link getRailCall.OptionsType}\n * @returns The call to the getRail function {@link getRailCall.OutputType}\n * @throws Errors {@link getRailCall.ErrorType}\n *\n * @example\n * ```ts\n * import { getRailCall } from '@filoz/synapse-core/pay'\n * import { createPublicClient, http } from 'viem'\n * import { multicall } from 'viem/actions'\n * import { calibration } from '@filoz/synapse-core/chains'\n *\n * const client = createPublicClient({\n * chain: calibration,\n * transport: http(),\n * })\n *\n * const results = await multicall(client, {\n * contracts: [\n * getRailCall({\n * chain: calibration,\n * railId: 1n,\n * }),\n * ],\n * })\n *\n * console.log(results[0])\n * ```\n */\nexport function getRailCall(options: getRailCall.OptionsType) {\n const chain = asChain(options.chain)\n\n return {\n abi: chain.contracts.filecoinPay.abi,\n address: options.contractAddress ?? chain.contracts.filecoinPay.address,\n functionName: 'getRail',\n args: [options.railId],\n } satisfies getRailCall.OutputType\n}\n", "import type {\n Address,\n Chain,\n Client,\n ContractFunctionParameters,\n ContractFunctionReturnType,\n ReadContractErrorType,\n Transport,\n} from 'viem'\nimport { readContract } from 'viem/actions'\nimport type { filecoinPay as paymentsAbi } from '../abis/index.ts'\nimport { asChain } from '../chains.ts'\nimport { type PageWithTotal, type PaginationOptions, type paginate, resolvePagination } from '../pagination.ts'\nimport type { PaginatedActionCallOptions } from '../types.ts'\nimport type { RailInfo } from './types.ts'\n\nexport namespace getRailsForPayerAndToken {\n export type OptionsType = PaginationOptions & {\n /** The address of the payer to query */\n payer: Address\n /** The address of the ERC20 token to filter by. If not provided, the USDFC token address will be used. */\n token?: Address\n /** Payments contract address. If not provided, the default is the payments contract address for the chain. */\n contractAddress?: Address\n }\n\n export type ContractOutputType = ContractFunctionReturnType<\n typeof paymentsAbi,\n 'pure' | 'view',\n 'getRailsForPayerAndToken'\n >\n\n /**\n * Paginated rail results for a payer and token.\n */\n /** A rail page. `total` is the contract's underlying rail-slot count, including skipped or finalized slots. */\n export type OutputType = PageWithTotal<RailInfo>\n\n export type ErrorType = getRailsForPayerAndTokenCall.ErrorType | ReadContractErrorType | resolvePagination.ErrorType\n}\n\n/**\n * Get one bounded page of rails for a payer and token.\n *\n * Pass the returned `nextCursor` back as `cursor`; treat it as opaque. Use\n * {@link paginate} to traverse every page. `total` is the contract's underlying\n * rail-slot count, including slots skipped because their rails were finalized.\n *\n * @param client - The client to use to get the rails.\n * @param options - {@link getRailsForPayerAndToken.OptionsType}\n * @returns Paginated rail results {@link getRailsForPayerAndToken.OutputType}\n * @throws Errors {@link getRailsForPayerAndToken.ErrorType}\n *\n * @example Read the first page\n * ```ts\n * import { getRailsForPayerAndToken } from '@filoz/synapse-core/pay'\n * import { createPublicClient, http } from 'viem'\n * import { calibration } from '@filoz/synapse-core/chains'\n *\n * const client = createPublicClient({\n * chain: calibration,\n * transport: http(),\n * })\n *\n * const payer = '0x1234567890123456789012345678901234567890'\n * const page = await getRailsForPayerAndToken(client, { payer })\n * console.log(page.items, page.nextCursor, page.total)\n * ```\n *\n * @example Iterate over every page\n * ```ts\n * import { paginate } from '@filoz/synapse-core'\n * import { getRailsForPayerAndToken } from '@filoz/synapse-core/pay'\n *\n * for await (const rail of paginate(({ cursor }) =>\n * getRailsForPayerAndToken(client, { payer, cursor })\n * )) {\n * console.log(`Rail ${rail.railId}: ${rail.isTerminated ? 'Terminated' : 'Active'}`)\n * }\n * ```\n */\nexport async function getRailsForPayerAndToken(\n client: Client<Transport, Chain>,\n options: getRailsForPayerAndToken.OptionsType\n): Promise<getRailsForPayerAndToken.OutputType> {\n const { cursor, limit } = resolvePagination(options, 100n)\n const data = await readContract(\n client,\n getRailsForPayerAndTokenCall({\n chain: client.chain,\n payer: options.payer,\n token: options.token,\n offset: cursor,\n limit,\n contractAddress: options.contractAddress,\n })\n )\n\n return parseGetRailsForPayerAndToken(data)\n}\n\nexport namespace getRailsForPayerAndTokenCall {\n export type OptionsType = PaginatedActionCallOptions<getRailsForPayerAndToken.OptionsType, 'offset'>\n export type ErrorType = asChain.ErrorType\n export type OutputType = ContractFunctionParameters<typeof paymentsAbi, 'pure' | 'view', 'getRailsForPayerAndToken'>\n}\n\n/**\n * Create a call to the getRailsForPayerAndToken function\n *\n * This function is used to create a call to the getRailsForPayerAndToken function for use with the multicall or readContract function.\n *\n * To get the same output type as the action, use {@link parseGetRailsForPayerAndToken} to transform the contract output.\n *\n * @param options - {@link getRailsForPayerAndTokenCall.OptionsType}\n * @returns The call to the getRailsForPayerAndToken function {@link getRailsForPayerAndTokenCall.OutputType}\n * @throws Errors {@link getRailsForPayerAndTokenCall.ErrorType}\n *\n * @example\n * ```ts\n * import { getRailsForPayerAndTokenCall } from '@filoz/synapse-core/pay'\n * import { createPublicClient, http } from 'viem'\n * import { multicall } from 'viem/actions'\n * import { calibration } from '@filoz/synapse-core/chains'\n *\n * const client = createPublicClient({\n * chain: calibration,\n * transport: http(),\n * })\n *\n * const results = await multicall(client, {\n * contracts: [\n * getRailsForPayerAndTokenCall({\n * chain: calibration,\n * payer: '0x1234567890123456789012345678901234567890',\n * token: calibration.contracts.usdfc.address,\n * offset: 0n,\n * limit: 10n,\n * }),\n * ],\n * })\n *\n * console.log(results[0])\n * ```\n */\nexport function getRailsForPayerAndTokenCall(options: getRailsForPayerAndTokenCall.OptionsType) {\n const chain = asChain(options.chain)\n const token = options.token ?? chain.contracts.usdfc.address\n\n return {\n abi: chain.contracts.filecoinPay.abi,\n address: options.contractAddress ?? chain.contracts.filecoinPay.address,\n functionName: 'getRailsForPayerAndToken',\n args: [options.payer, token, options.offset, options.limit],\n } satisfies getRailsForPayerAndTokenCall.OutputType\n}\n\n/**\n * Parse raw payer-rail contract output into a normalized page with a total.\n *\n * The contract's `results` tuple is mapped to `items`, including finalized and\n * skipped rail slots. `nextOffset` becomes `nextCursor` only when it is less\n * than `total`; `total` is the underlying rail-slot count.\n *\n * @param data - Raw contract output {@link getRailsForPayerAndToken.ContractOutputType}\n * @returns A normalized rail page {@link getRailsForPayerAndToken.OutputType}\n */\nexport function parseGetRailsForPayerAndToken(\n data: getRailsForPayerAndToken.ContractOutputType\n): getRailsForPayerAndToken.OutputType {\n return {\n items: data[0].map((rail) => ({\n railId: rail.railId,\n isTerminated: rail.isTerminated,\n endEpoch: rail.endEpoch,\n })),\n ...(data[1] < data[2] ? { nextCursor: data[1] } : {}),\n total: data[2],\n }\n}\n", "import type { Address, Chain, Client, MulticallErrorType, Transport } from 'viem'\nimport { multicall } from 'viem/actions'\nimport { paginate } from '../pagination.ts'\nimport { getRailCall } from './get-rail.ts'\nimport { getRailsForPayerAndToken } from './get-rails-for-payer-and-token.ts'\n\nexport namespace totalAccountFixedLockup {\n export type OptionsType = {\n /** The address of the account to query. */\n address: Address\n /** The address of the ERC20 token to query. If not provided, the USDFC token address will be used. */\n token?: Address\n /** Payments contract address. If not provided, the default is the payments contract address for the chain. */\n contractAddress?: Address\n }\n\n export type OutputType = {\n /** Sum of lockupFixed across all rails (including terminated but not yet finalized) */\n totalFixedLockup: bigint\n }\n\n export type ErrorType = getRailsForPayerAndToken.ErrorType | MulticallErrorType\n}\n\n/**\n * Get the total fixed lockup across all rails for an account.\n *\n * Fetches all rails for the payer, then batches `getRail` calls via multicall\n * to sum `lockupFixed`. Includes terminated-but-not-finalized rails since they\n * still hold locked funds until finalization.\n *\n * @param client - The client to use to get the total account fixed lockup.\n * @param options - {@link totalAccountFixedLockup.OptionsType}\n * @returns The total fixed lockup and active rail count {@link totalAccountFixedLockup.OutputType}\n * @throws Errors {@link totalAccountFixedLockup.ErrorType}\n *\n * @example\n * ```ts\n * import { totalAccountFixedLockup } from '@filoz/synapse-core/pay'\n * import { createPublicClient, http } from 'viem'\n * import { calibration } from '@filoz/synapse-core/chains'\n *\n * const client = createPublicClient({\n * chain: calibration,\n * transport: http(),\n * })\n *\n * const lockup = await totalAccountFixedLockup(client, {\n * address: '0x1234567890123456789012345678901234567890',\n * })\n *\n * console.log('Total fixed lockup:', lockup.totalFixedLockup)\n * ```\n */\nexport async function totalAccountFixedLockup(\n client: Client<Transport, Chain>,\n options: totalAccountFixedLockup.OptionsType\n): Promise<totalAccountFixedLockup.OutputType> {\n let totalFixedLockup = 0n\n let rails: Array<getRailsForPayerAndToken.OutputType['items'][number]> = []\n\n const processPage = async () => {\n if (rails.length > 0) {\n const railDetails = await multicall(client, {\n allowFailure: false,\n contracts: rails.map((rail) =>\n getRailCall({\n chain: client.chain,\n railId: rail.railId,\n contractAddress: options.contractAddress,\n })\n ),\n })\n for (const rail of railDetails) {\n totalFixedLockup += rail.lockupFixed\n }\n }\n rails = []\n }\n\n for await (const rail of paginate(({ cursor }) =>\n getRailsForPayerAndToken(client, {\n payer: options.address,\n token: options.token,\n contractAddress: options.contractAddress,\n cursor,\n limit: 100n,\n })\n )) {\n rails.push(rail)\n if (rails.length === 100) {\n await processPage()\n }\n }\n await processPage()\n return { totalFixedLockup }\n}\n", "import type { Address, Chain, Client, Transport } from 'viem'\nimport { getBlockNumber } from 'viem/actions'\nimport { TIME_CONSTANTS } from '../utils/constants.ts'\nimport { calculateAccountDebt } from './account-debt.ts'\nimport { accounts } from './accounts.ts'\nimport { resolveAccountState } from './resolve-account-state.ts'\nimport { totalAccountFixedLockup } from './total-account-fixed-lockup.ts'\n\nexport namespace getAccountSummary {\n export type OptionsType = {\n /** The address of the account to query. */\n address: Address\n /** The address of the ERC20 token to query. If not provided, the USDFC token address will be used. */\n token?: Address\n /** Epoch to evaluate at. If not provided, current block number is fetched. */\n epoch?: bigint\n /** Payments contract address. If not provided, the default is the payments contract address for the chain. */\n contractAddress?: Address\n }\n\n export type OutputType = {\n /** Total deposited funds in the contract. */\n funds: bigint\n /**\n * Funds available for withdrawal or new rail commitments at `epoch`.\n * Equal to `funds - totalLockup`, the *unreserved* portion described on\n * {@link runwayInEpochs}. Active payments draw from this; once it reaches\n * zero, settlement halts.\n */\n availableFunds: bigint\n /**\n * Outstanding payment obligation that couldn't be moved into\n * `lockupCurrent` because `funds` was insufficient. `0n` when the account\n * is healthy; positive when in deficit. Effectively the gap between the\n * lockup the account should be holding and what it actually holds.\n */\n debt: bigint\n\n /** Per-epoch lockup rate (aggregate across all rails). */\n lockupRatePerEpoch: bigint\n /** Per-month lockup rate (`lockupRatePerEpoch * EPOCHS_PER_MONTH`). */\n lockupRatePerMonth: bigint\n\n /** Total effective lockup at `epoch` (fixed + rate-based). */\n totalLockup: bigint\n /**\n * Sum of `lockupFixed` across all rails. Reserved for one-time payments,\n * for example, FWSS CDN egress and cache miss credits, rather than\n * streaming rate.\n */\n totalFixedLockup: bigint\n /** Rate-based portion of lockup (`totalLockup - totalFixedLockup`). */\n totalRateBasedLockup: bigint\n\n /**\n * Epochs from `epoch` until this account enters deficit and the standard\n * payment flow to providers halts. Treat as \"when must the user act?\".\n *\n * The account holds a reserve in `totalLockup` that each rail has set\n * aside under its terms. The funds are locked at the contract level: the\n * user can't withdraw them while the rail is active. Active payments\n * draw from `availableFunds` (`funds - totalLockup`). Once\n * `availableFunds` reaches zero, the account is in deficit: standard\n * settlement of active rails halts even though `funds` is still\n * positive. A provider can then terminate the rail to claim against the\n * reserve for a final payment window of up to one `lockupPeriod`.\n * Termination is one-way: once a rail has an `endEpoch` it's heading to\n * finalization and topping up the account won't revive it. Top up\n * before deficit to keep existing rails open.\n *\n * - `maxUint256` when `lockupRatePerEpoch` is 0n (nothing is being spent).\n * - `0n` when the account is already past this point (in deficit).\n *\n * To get the absolute epoch form, add `epoch` (skip when this is\n * `maxUint256`).\n */\n runwayInEpochs: bigint\n /**\n * Total spend the account's `funds` would cover at `lockupRatePerEpoch`,\n * calculated as `funds / lockupRatePerEpoch`. Treat as \"how much\n * coverage has the user prepaid in total?\".\n *\n * Always >= {@link runwayInEpochs}, typically by roughly the size of\n * the reserve held in `totalLockup`. `runwayInEpochs` accounts for the\n * reserve as a floor that halts settlement; `grossCoverageInEpochs`\n * treats `funds` as a single bucket without modeling whether the\n * reserve is actually flowing as ongoing payment.\n *\n * Useful as a complement to `runwayInEpochs` in user-facing displays,\n * e.g. \"your deposit covers ~X days of storage in total; you have ~Y\n * days of runway before your account enters deficit\".\n *\n * - `maxUint256` when `lockupRatePerEpoch` is 0n (nothing is being\n * spent; takes precedence over `funds === 0n`).\n * - `0n` when `funds` is 0n and `lockupRatePerEpoch` is positive.\n */\n grossCoverageInEpochs: bigint\n /** The epoch used for all calculations. */\n epoch: bigint\n }\n\n export type ErrorType = accounts.ErrorType | totalAccountFixedLockup.ErrorType\n}\n\n/**\n * Get a comprehensive account summary from the Payments contract.\n *\n * Fetches account state, fixed lockup totals, and (optionally) current epoch\n * in parallel, then derives debt, available funds, lockup breakdown, runway,\n * and gross coverage client-side.\n *\n * @param client - The client to use to get the account summary.\n * @param options - {@link getAccountSummary.OptionsType}\n * @returns Full account summary {@link getAccountSummary.OutputType}\n * @throws Errors {@link getAccountSummary.ErrorType}\n *\n * @example\n * ```ts\n * import { getAccountSummary } from '@filoz/synapse-core/pay'\n * import { createPublicClient, http } from 'viem'\n * import { calibration } from '@filoz/synapse-core/chains'\n *\n * const client = createPublicClient({\n * chain: calibration,\n * transport: http(),\n * })\n *\n * const summary = await getAccountSummary(client, {\n * address: '0x1234567890123456789012345678901234567890',\n * })\n *\n * console.log('Available:', summary.availableFunds)\n * console.log('Runway in epochs:', summary.runwayInEpochs)\n * console.log('Gross coverage in epochs:', summary.grossCoverageInEpochs)\n * ```\n */\nexport async function getAccountSummary(\n client: Client<Transport, Chain>,\n options: getAccountSummary.OptionsType\n): Promise<getAccountSummary.OutputType> {\n const { address, token, epoch, contractAddress } = options\n\n // Parallel RPC: accounts + fixedLockup + (optionally) blockNumber\n const [accountInfo, fixedLockupResult, resolvedEpoch] = await Promise.all([\n accounts(client, { address, token, contractAddress, blockNumber: epoch }),\n totalAccountFixedLockup(client, { address, token, contractAddress }),\n epoch ?? getBlockNumber(client, { cacheTime: 0 }),\n ])\n\n const params = {\n funds: accountInfo.funds,\n lockupCurrent: accountInfo.lockupCurrent,\n lockupRate: accountInfo.lockupRate,\n lockupLastSettledAt: accountInfo.lockupLastSettledAt,\n currentEpoch: resolvedEpoch,\n }\n\n const { availableFunds, runwayInEpochs, grossCoverageInEpochs } = resolveAccountState(params)\n const debt = calculateAccountDebt(params)\n\n const totalLockup = accountInfo.funds > availableFunds ? accountInfo.funds - availableFunds : 0n\n const { totalFixedLockup } = fixedLockupResult\n const totalRateBasedLockup = totalLockup > totalFixedLockup ? totalLockup - totalFixedLockup : 0n\n\n return {\n funds: accountInfo.funds,\n availableFunds,\n debt,\n\n lockupRatePerEpoch: accountInfo.lockupRate,\n lockupRatePerMonth: accountInfo.lockupRate * TIME_CONSTANTS.EPOCHS_PER_MONTH,\n\n totalLockup,\n totalFixedLockup,\n totalRateBasedLockup,\n\n runwayInEpochs,\n grossCoverageInEpochs,\n epoch: resolvedEpoch,\n }\n}\n", "import * as Pay from '@filoz/synapse-core/pay'\nimport { getExpirations } from '@filoz/synapse-core/session-key'\nimport * as WarmStorage from '@filoz/synapse-core/warm-storage'\nimport { defineHandler, isCliError } from 'clipact'\nimport type { Hex } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { buildFundingUrl } from '../auth/login.ts'\nimport { SCOPES } from '../auth/scopes.ts'\nimport { resolveCredentials } from '../auth/session.ts'\nimport { status } from '../commands/status.ts'\nimport { ErrorCodes } from '../errors.ts'\nimport { formatUsdfc } from '../usdfc.ts'\nimport { appFor } from './context.ts'\n\n/** Nominal upload size used to check readiness: 1 MiB. */\nconst PROBE_SIZE = 1n << 20n\n\n/**\n * Report the session, its scope expiries, and whether the payer can upload.\n * A missing or pending session is a state to report, not an error.\n */\nexport default defineHandler(status, async (ctx) => {\n const app = appFor(ctx)\n let credentials: ReturnType<typeof resolveCredentials>\n try {\n credentials = resolveCredentials(app)\n } catch (error) {\n if (isCliError(error) && error.code === ErrorCodes.loginPending) {\n const session = app.config.get(`sessions.${app.network}`)\n const { url } = error.details as { url: string }\n return ctx.ok({\n network: app.network,\n session: {\n state: 'pending',\n ...(session ? { address: session.address } : {}),\n url,\n },\n })\n }\n throw error\n }\n if (!credentials) {\n return ctx.ok({ network: app.network, session: { state: 'none' } })\n }\n const root = credentials.rootAddress\n const signer = privateKeyToAccount(credentials.privateKey as Hex).address\n const [expirations, summary, costs] = await Promise.all([\n getExpirations(app.client, {\n address: root,\n sessionKeyAddress: signer,\n permissions: Object.values(SCOPES),\n }),\n Pay.getAccountSummary(app.client, { address: root }),\n WarmStorage.getUploadCosts(app.client, {\n clientAddress: root,\n pieceSizes: [PROBE_SIZE],\n isNewDataSet: true,\n }),\n ])\n const now = BigInt(Math.floor(Date.now() / 1000))\n const scopes = Object.fromEntries(\n Object.entries(SCOPES).map(([id, permission]) => {\n const expiry = expirations[permission] ?? 0n\n return [\n id,\n expiry > now\n ? new Date(Number(expiry) * 1000).toISOString()\n : expiry > 0n\n ? 'expired'\n : 'not granted',\n ]\n })\n )\n return ctx.ok({\n network: app.network,\n session: {\n state: 'active',\n source: credentials.source,\n address: signer,\n rootAddress: root,\n scopes,\n },\n account: {\n token: 'USDFC',\n funds: formatUsdfc(summary.funds),\n availableFunds: formatUsdfc(summary.availableFunds),\n debt: formatUsdfc(summary.debt),\n ready: costs.ready,\n needsApproval: costs.needsFwssMaxApproval,\n depositNeeded: formatUsdfc(costs.depositNeeded),\n ...(costs.ready\n ? {}\n : {\n fundingUrl: buildFundingUrl({\n consoleUrl: app.consoleUrl,\n network: app.network,\n deposit: costs.depositNeeded,\n }),\n }),\n },\n })\n})\n"],
5
+ "mappings": "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",
6
+ "names": ["getRailCall", "options", "chain", "asChain", "getRailsForPayerAndToken", "client", "options", "cursor", "limit", "resolvePagination", "data", "readContract", "getRailsForPayerAndTokenCall", "parseGetRailsForPayerAndToken", "chain", "asChain", "token", "rail", "totalAccountFixedLockup", "client", "options", "totalFixedLockup", "rails", "processPage", "railDetails", "multicall", "rail", "getRailCall", "paginate", "cursor", "getRailsForPayerAndToken", "getAccountSummary", "client", "options", "address", "token", "epoch", "contractAddress", "accountInfo", "fixedLockupResult", "resolvedEpoch", "accounts", "totalAccountFixedLockup", "getBlockNumber", "params", "availableFunds", "runwayInEpochs", "grossCoverageInEpochs", "resolveAccountState", "debt", "calculateAccountDebt", "totalLockup", "totalFixedLockup", "totalRateBasedLockup", "TIME_CONSTANTS", "PROBE_SIZE", "status_default", "defineHandler", "status", "ctx", "app", "appFor", "credentials", "resolveCredentials", "error", "isCliError", "ErrorCodes", "session", "url", "root", "signer", "privateKeyToAccount", "expirations", "summary", "costs", "getExpirations", "SCOPES", "getAccountSummary", "getUploadCosts", "now", "scopes", "id", "permission", "expiry", "formatUsdfc", "buildFundingUrl"]
7
+ }
package/dist/main.js ADDED
@@ -0,0 +1,3 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import{a as d}from"./chunks/chunk-CIVQHT3F.js";import{a as u}from"./chunks/chunk-63JLHZEK.js";import{a as s}from"./chunks/chunk-BFBNDHQG.js";import{a as n}from"./chunks/chunk-DHTPICN4.js";import{a as p}from"./chunks/chunk-BZITZ3BI.js";import{a as m}from"./chunks/chunk-Z6O5SHUU.js";import{a as c}from"./chunks/chunk-IAJFQYLN.js";import{a as l}from"./chunks/chunk-QRFSFJOZ.js";import{a}from"./chunks/chunk-ASZ5KTWE.js";import{a as f}from"./chunks/chunk-K63EJUGU.js";import{a as t}from"./chunks/chunk-JFBUOLJ3.js";import{a as r}from"./chunks/chunk-MWVOEA6K.js";import{l as o}from"./chunks/chunk-JUFFOBKU.js";import{a as e}from"./chunks/chunk-2VZELE36.js";import{j as i}from"./chunks/chunk-3TJUKWFC.js";import"./chunks/chunk-YIAP3JO3.js";var g={name:"filecoin",version:"0.5.0",description:"Command-line interface for Filecoin storage",license:"MIT",author:"Hugo Dias <hugomrdias@gmail.com>",homepage:"https://github.com/filecoin-project/agents/tree/main/packages/filecoin-cli#readme",repository:{type:"git",url:"git+https://github.com/filecoin-project/agents.git",directory:"packages/filecoin-cli"},bugs:{url:"https://github.com/filecoin-project/agents/issues"},type:"module",bin:{filecoin:"./bin/filecoin.js"},files:["bin","dist","skills","README.md"],scripts:{clean:"rm -rf dist skills",build:"node scripts/build.ts",typecheck:"tsc -p tsconfig.json",test:"node --test 'test/**/*.test.ts'",lint:"biome check .",check:"pnpm typecheck && pnpm test && pnpm lint"},devDependencies:{"@filoz/synapse-core":"^0.10.1","@ipld/car":"^5.4.7","@types/node":"catalog:",clipact:"0.4.0","env-paths":"^4.0.0",esbuild:"0.28.2","ipfs-unixfs-exporter":"^16.2.3","ipfs-unixfs-importer":"^16.1.5","iso-conf":"^0.4.2",multiformats:"^14.0.5",typescript:"catalog:",viem:"^2.56.9",zod:"4.6.5"},engines:{node:">=24"},publishConfig:{access:"public"}};var y=i({name:"operations",description:"Find, inspect, and resume saved put and delete jobs",commands:[a,l,f]}),h=[p,m,u,r,d,s,c,n,t,y];var b=e({name:"filecoin",version:g.version,description:"Store files and folders on Filecoin and get retrieval links",envPrefix:"FIL",commands:h,aliases:{publish:"put",rm:"delete"},skills:new URL("../skills/",import.meta.url),mapError:()=>import("./chunks/map-error-QLS3CQMO.js"),errors:o});await b.run();
3
+ //# sourceMappingURL=main.js.map