@nosana/kit 2.0.18 → 2.0.23

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 (80) hide show
  1. package/README.md +96 -24
  2. package/dist/NosanaClient.d.ts +5 -5
  3. package/dist/NosanaClient.js +6 -5
  4. package/dist/NosanaClient.js.map +1 -1
  5. package/dist/index.d.ts +9 -9
  6. package/dist/index.js +5 -5
  7. package/dist/index.js.map +1 -1
  8. package/dist/services/programs/jobs/JobsProgram.d.ts +152 -0
  9. package/dist/services/programs/{JobsProgram.js → jobs/JobsProgram.js} +133 -224
  10. package/dist/services/programs/jobs/JobsProgram.js.map +1 -0
  11. package/dist/services/programs/jobs/index.d.ts +1 -0
  12. package/dist/services/programs/jobs/index.js +2 -0
  13. package/dist/services/programs/jobs/index.js.map +1 -0
  14. package/dist/services/programs/jobs/instructions/delist.d.ts +9 -0
  15. package/dist/services/programs/jobs/instructions/delist.js +29 -0
  16. package/dist/services/programs/jobs/instructions/delist.js.map +1 -0
  17. package/dist/services/programs/jobs/instructions/end.d.ts +9 -0
  18. package/dist/services/programs/jobs/instructions/end.js +36 -0
  19. package/dist/services/programs/jobs/instructions/end.js.map +1 -0
  20. package/dist/services/programs/jobs/instructions/extend.d.ts +11 -0
  21. package/dist/services/programs/jobs/instructions/extend.js +27 -0
  22. package/dist/services/programs/jobs/instructions/extend.js.map +1 -0
  23. package/dist/services/programs/jobs/instructions/index.d.ts +4 -0
  24. package/dist/services/programs/jobs/instructions/index.js +5 -0
  25. package/dist/services/programs/jobs/instructions/index.js.map +1 -0
  26. package/dist/services/programs/jobs/instructions/post.d.ts +13 -0
  27. package/dist/services/programs/jobs/instructions/post.js +36 -0
  28. package/dist/services/programs/jobs/instructions/post.js.map +1 -0
  29. package/dist/services/programs/jobs/instructions/types.d.ts +16 -0
  30. package/dist/services/programs/jobs/instructions/types.js +2 -0
  31. package/dist/services/programs/jobs/instructions/types.js.map +1 -0
  32. package/dist/services/programs/jobs/monitor/index.d.ts +3 -0
  33. package/dist/services/programs/jobs/monitor/index.js +3 -0
  34. package/dist/services/programs/jobs/monitor/index.js.map +1 -0
  35. package/dist/services/programs/jobs/monitor/monitor.d.ts +22 -0
  36. package/dist/services/programs/jobs/monitor/monitor.js +180 -0
  37. package/dist/services/programs/jobs/monitor/monitor.js.map +1 -0
  38. package/dist/services/programs/jobs/monitor/types.d.ts +27 -0
  39. package/dist/services/programs/jobs/monitor/types.js +9 -0
  40. package/dist/services/programs/jobs/monitor/types.js.map +1 -0
  41. package/dist/services/programs/{MerkleDistributorProgram.d.ts → merkleDistributor/MerkleDistributorProgram.d.ts} +4 -4
  42. package/dist/services/programs/{MerkleDistributorProgram.js → merkleDistributor/MerkleDistributorProgram.js} +3 -3
  43. package/dist/services/programs/merkleDistributor/MerkleDistributorProgram.js.map +1 -0
  44. package/dist/services/programs/merkleDistributor/index.d.ts +1 -0
  45. package/dist/services/programs/merkleDistributor/index.js +2 -0
  46. package/dist/services/programs/merkleDistributor/index.js.map +1 -0
  47. package/dist/services/programs/{StakeProgram.d.ts → stake/StakeProgram.d.ts} +4 -4
  48. package/dist/services/programs/{StakeProgram.js → stake/StakeProgram.js} +2 -2
  49. package/dist/services/programs/stake/StakeProgram.js.map +1 -0
  50. package/dist/services/programs/stake/index.d.ts +1 -0
  51. package/dist/services/programs/stake/index.js +2 -0
  52. package/dist/services/programs/stake/index.js.map +1 -0
  53. package/dist/services/{SolanaService.d.ts → solana/SolanaService.d.ts} +31 -3
  54. package/dist/services/{SolanaService.js → solana/SolanaService.js} +84 -3
  55. package/dist/services/solana/SolanaService.js.map +1 -0
  56. package/dist/services/solana/index.d.ts +1 -0
  57. package/dist/services/solana/index.js +2 -0
  58. package/dist/services/solana/index.js.map +1 -0
  59. package/dist/services/token/TokenService.d.ts +63 -0
  60. package/dist/services/{TokenService.js → token/TokenService.js} +69 -2
  61. package/dist/services/token/TokenService.js.map +1 -0
  62. package/dist/services/token/index.d.ts +1 -0
  63. package/dist/services/token/index.js +2 -0
  64. package/dist/services/token/index.js.map +1 -0
  65. package/dist/types.d.ts +3 -1
  66. package/dist/utils/convertHttpToWebSocketUrl.d.ts +28 -0
  67. package/dist/utils/convertHttpToWebSocketUrl.js +37 -0
  68. package/dist/utils/convertHttpToWebSocketUrl.js.map +1 -0
  69. package/dist/utils/getStaticAccounts.d.ts +1 -1
  70. package/dist/utils/index.d.ts +1 -0
  71. package/dist/utils/index.js +1 -0
  72. package/dist/utils/index.js.map +1 -1
  73. package/package.json +4 -4
  74. package/dist/services/SolanaService.js.map +0 -1
  75. package/dist/services/TokenService.d.ts +0 -41
  76. package/dist/services/TokenService.js.map +0 -1
  77. package/dist/services/programs/JobsProgram.d.ts +0 -106
  78. package/dist/services/programs/JobsProgram.js.map +0 -1
  79. package/dist/services/programs/MerkleDistributorProgram.js.map +0 -1
  80. package/dist/services/programs/StakeProgram.js.map +0 -1
package/README.md CHANGED
@@ -340,41 +340,71 @@ await client.solana.buildSignAndSend(instruction);
340
340
 
341
341
  #### Monitor Account Updates
342
342
 
343
+ The SDK provides two monitoring methods using async iterators for real-time account updates via WebSocket:
344
+
345
+ **Simple Monitoring** (`monitor()`) - Automatically merges run account data into job events:
346
+
343
347
  ```typescript
344
- async monitor(options?: {
345
- onJobAccount?: (job: Job) => void | Promise<void>,
346
- onMarketAccount?: (market: Market) => void | Promise<void>,
347
- onRunAccount?: (run: Run) => void | Promise<void>,
348
- onError?: (error: Error, accountType?: string) => void | Promise<void>
349
- }): Promise<() => void>
348
+ async monitor(): Promise<[AsyncIterable<SimpleMonitorEvent>, () => void]>
350
349
  ```
351
350
 
352
- Subscribe to real-time account updates via WebSocket. Includes automatic reconnection on failure.
353
-
354
351
  ```typescript
355
- // Start monitoring
356
- const stopMonitoring = await client.jobs.monitor({
357
- onJobAccount: async (job) => {
358
- console.log('Job update:', job.address, job.state);
352
+ import { MonitorEventType } from '@nosana/kit';
359
353
 
354
+ // Start monitoring
355
+ const [eventStream, stop] = await client.jobs.monitor();
356
+
357
+ // Process events using async iteration
358
+ for await (const event of eventStream) {
359
+ if (event.type === MonitorEventType.JOB) {
360
+ console.log('Job update:', event.data.address, event.data.state);
361
+ // event.data will have state, node, and timeStart from run account if it exists
362
+
360
363
  // Process updates - save to database, trigger workflows, etc.
361
- if (job.state === JobState.COMPLETED) {
362
- await processCompletedJob(job);
364
+ if (event.data.state === JobState.COMPLETED) {
365
+ await processCompletedJob(event.data);
363
366
  }
364
- },
365
- onRunAccount: async (run) => {
366
- console.log('Run started:', run.job, 'on node', run.node);
367
- },
368
- onError: (error) => {
369
- console.error('Monitor error:', error);
370
- },
371
- });
367
+ } else if (event.type === MonitorEventType.MARKET) {
368
+ console.log('Market update:', event.data.address);
369
+ }
370
+ }
371
+
372
+ // Stop monitoring when done
373
+ stop();
374
+ ```
375
+
376
+ **Detailed Monitoring** (`monitorDetailed()`) - Provides separate events for job, market, and run accounts:
377
+
378
+ ```typescript
379
+ async monitorDetailed(): Promise<[AsyncIterable<MonitorEvent>, () => void]>
380
+ ```
381
+
382
+ ```typescript
383
+ import { MonitorEventType } from '@nosana/kit';
384
+
385
+ // Start detailed monitoring
386
+ const [eventStream, stop] = await client.jobs.monitorDetailed();
387
+
388
+ // Process events using async iteration
389
+ for await (const event of eventStream) {
390
+ switch (event.type) {
391
+ case MonitorEventType.JOB:
392
+ console.log('Job update:', event.data.address);
393
+ break;
394
+ case MonitorEventType.MARKET:
395
+ console.log('Market update:', event.data.address);
396
+ break;
397
+ case MonitorEventType.RUN:
398
+ console.log('Run started:', event.data.job, 'on node', event.data.node);
399
+ break;
400
+ }
401
+ }
372
402
 
373
403
  // Stop monitoring when done
374
- stopMonitoring();
404
+ stop();
375
405
  ```
376
406
 
377
- The monitor handles WebSocket reconnection automatically and continues processing updates until explicitly stopped.
407
+ Both methods handle WebSocket reconnection automatically and continue processing updates until explicitly stopped. The simple `monitor()` method is recommended for most use cases as it automatically merges run account data into job updates, eliminating the need to manually track run accounts.
378
408
 
379
409
  ## Account Types
380
410
 
@@ -473,6 +503,13 @@ getBalance(address?: Address | string): Promise<bigint>
473
503
 
474
504
  // Derive program derived address
475
505
  pda(seeds: Array<Address | string>, programId: Address): Promise<Address>
506
+
507
+ // Get instruction to transfer SOL
508
+ transfer(params: {
509
+ to: Address | string;
510
+ amount: number | bigint;
511
+ from?: TransactionSigner;
512
+ }): Promise<Instruction> // Returns TransferSolInstruction
476
513
  ```
477
514
 
478
515
  ### Examples
@@ -495,6 +532,16 @@ console.log(`Balance: ${balance} lamports`);
495
532
 
496
533
  // Derive PDA
497
534
  const pda = await client.solana.pda(['seed1', 'seed2'], programAddress);
535
+
536
+ // Get instruction to transfer SOL
537
+ const transferSolIx = await client.solana.transfer({
538
+ to: 'recipient-address',
539
+ amount: 1000000, // lamports (can be number or bigint)
540
+ // from is optional - uses wallet if not provided
541
+ });
542
+
543
+ // Execute the transfer
544
+ await client.solana.buildSignAndSend(transferSolIx);
498
545
  ```
499
546
 
500
547
  ## IPFS Service
@@ -1010,6 +1057,31 @@ console.log(`Balance: ${balance} NOS`);
1010
1057
  // Returns 0 if no token account exists
1011
1058
  ```
1012
1059
 
1060
+ ### Transfer Tokens
1061
+
1062
+ Get instruction(s) to transfer SPL tokens. Returns either 1 or 2 instructions depending on whether the recipient's associated token account needs to be created:
1063
+
1064
+ ```typescript
1065
+ // Get transfer instruction(s)
1066
+ const instructions = await client.nos.transfer({
1067
+ to: 'recipient-address',
1068
+ amount: 1000000, // token base units (can be number or bigint)
1069
+ // from is optional - uses wallet if not provided
1070
+ });
1071
+
1072
+ // Execute the transfer
1073
+ // instructions is a tuple:
1074
+ // - [TransferInstruction] when recipient ATA exists (1 instruction)
1075
+ // - [CreateAssociatedTokenIdempotentInstruction, TransferInstruction] when ATA needs creation (2 instructions)
1076
+ await client.solana.buildSignAndSend(instructions);
1077
+ ```
1078
+
1079
+ The function automatically:
1080
+ - Finds the sender's associated token account
1081
+ - Finds the recipient's associated token account
1082
+ - Creates the recipient's ATA if it doesn't exist (returns 2 instructions: create ATA + transfer)
1083
+ - Returns only the transfer instruction if the recipient's ATA already exists (returns 1 instruction)
1084
+
1013
1085
  ### Type Definitions
1014
1086
 
1015
1087
  ```typescript
@@ -4,11 +4,11 @@ import { type NosanaApi } from '@nosana/api';
4
4
  import { type NosanaAuthorization } from '@nosana/authorization';
5
5
  import { Logger } from './logger/Logger.js';
6
6
  import { ClientConfig, PartialClientConfig } from './config/index.js';
7
- import { type JobsProgram } from './services/programs/JobsProgram.js';
8
- import { type StakeProgram } from './services/programs/StakeProgram.js';
9
- import { type MerkleDistributorProgram } from './services/programs/MerkleDistributorProgram.js';
10
- import { type SolanaService } from './services/SolanaService.js';
11
- import { type TokenService } from './services/TokenService.js';
7
+ import { type JobsProgram } from './services/programs/jobs/index.js';
8
+ import { type StakeProgram } from './services/programs/stake/index.js';
9
+ import { type MerkleDistributorProgram } from './services/programs/merkleDistributor/index.js';
10
+ import { type SolanaService } from './services/solana/index.js';
11
+ import { type TokenService } from './services/token/index.js';
12
12
  import type { Wallet } from './types.js';
13
13
  /**
14
14
  * The Nosana client interface. Contains all the services and programs
@@ -4,11 +4,11 @@ import { createNosanaApi } from '@nosana/api';
4
4
  import { createNosanaAuthorization } from '@nosana/authorization';
5
5
  import { Logger } from './logger/Logger.js';
6
6
  import { getNosanaConfig } from './config/index.js';
7
- import { createJobsProgram } from './services/programs/JobsProgram.js';
8
- import { createStakeProgram } from './services/programs/StakeProgram.js';
9
- import { createMerkleDistributorProgram, } from './services/programs/MerkleDistributorProgram.js';
10
- import { createSolanaService } from './services/SolanaService.js';
11
- import { createTokenService } from './services/TokenService.js';
7
+ import { createJobsProgram } from './services/programs/jobs/index.js';
8
+ import { createStakeProgram } from './services/programs/stake/index.js';
9
+ import { createMerkleDistributorProgram, } from './services/programs/merkleDistributor/index.js';
10
+ import { createSolanaService } from './services/solana/index.js';
11
+ import { createTokenService } from './services/token/index.js';
12
12
  import { walletToAuthorizationSigner } from './utils/walletToAuthorizationSigner.js';
13
13
  /**
14
14
  * Creates a new Nosana client instance.
@@ -48,6 +48,7 @@ export function createNosanaClient(network = NosanaNetwork.MAINNET, customConfig
48
48
  const programDeps = {
49
49
  logger,
50
50
  solana,
51
+ nos,
51
52
  getWallet,
52
53
  };
53
54
  // Initialize programs
@@ -1 +1 @@
1
- {"version":3,"file":"NosanaClient.js","sourceRoot":"","sources":["../src/NosanaClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NosanaClient.js","sourceRoot":"","sources":["../src/NosanaClient.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -7,16 +7,16 @@ export type { Wallet } from './types.js';
7
7
  export * from './config/index.js';
8
8
  export * from './errors/NosanaError.js';
9
9
  export * from './logger/Logger.js';
10
- export { createJobsProgram, type JobsProgram, JobState, MarketQueueType, } from './services/programs/JobsProgram.js';
11
- export type { Job, Market, Run } from './services/programs/JobsProgram.js';
12
- export { createStakeProgram, type StakeProgram } from './services/programs/StakeProgram.js';
13
- export type { Stake } from './services/programs/StakeProgram.js';
14
- export { createMerkleDistributorProgram, type MerkleDistributorProgram, ClaimTarget, } from './services/programs/MerkleDistributorProgram.js';
15
- export type { MerkleDistributor, ClaimStatus, } from './services/programs/MerkleDistributorProgram.js';
16
- export { ClaimStatusNotFoundError } from './services/programs/MerkleDistributorProgram.js';
10
+ export { createJobsProgram, type JobsProgram, JobState, MarketQueueType, } from './services/programs/jobs/index.js';
11
+ export type { Job, Market, Run } from './services/programs/jobs/index.js';
12
+ export { createStakeProgram, type StakeProgram } from './services/programs/stake/index.js';
13
+ export type { Stake } from './services/programs/stake/index.js';
14
+ export { createMerkleDistributorProgram, type MerkleDistributorProgram, ClaimTarget, } from './services/programs/merkleDistributor/index.js';
15
+ export type { MerkleDistributor, ClaimStatus, } from './services/programs/merkleDistributor/index.js';
16
+ export { ClaimStatusNotFoundError } from './services/programs/merkleDistributor/index.js';
17
17
  export { solBytesArrayToIpfsHash, ipfsHashToSolBytesArray } from '@nosana/ipfs';
18
- export { createTokenService, type TokenService } from './services/TokenService.js';
19
- export type { TokenAccount, TokenAccountWithBalance } from './services/TokenService.js';
18
+ export { createTokenService, type TokenService } from './services/token/index.js';
19
+ export type { TokenAccount, TokenAccountWithBalance } from './services/token/index.js';
20
20
  export * as JobsClient from './generated_clients/jobs/index.js';
21
21
  export * as StakingClient from './generated_clients/staking/index.js';
22
22
  export * as MerkleDistributorClient from './generated_clients/merkle_distributor/index.js';
package/dist/index.js CHANGED
@@ -9,16 +9,16 @@ export * from './config/index.js';
9
9
  export * from './errors/NosanaError.js';
10
10
  export * from './logger/Logger.js';
11
11
  // Export JobsProgram and related types
12
- export { createJobsProgram, JobState, MarketQueueType, } from './services/programs/JobsProgram.js';
12
+ export { createJobsProgram, JobState, MarketQueueType, } from './services/programs/jobs/index.js';
13
13
  // Export StakeProgram and related types
14
- export { createStakeProgram } from './services/programs/StakeProgram.js';
14
+ export { createStakeProgram } from './services/programs/stake/index.js';
15
15
  // Export MerkleDistributorProgram and related types
16
- export { createMerkleDistributorProgram, ClaimTarget, } from './services/programs/MerkleDistributorProgram.js';
17
- export { ClaimStatusNotFoundError } from './services/programs/MerkleDistributorProgram.js';
16
+ export { createMerkleDistributorProgram, ClaimTarget, } from './services/programs/merkleDistributor/index.js';
17
+ export { ClaimStatusNotFoundError } from './services/programs/merkleDistributor/index.js';
18
18
  // Export IPFS utilities from @nosana/ipfs
19
19
  export { solBytesArrayToIpfsHash, ipfsHashToSolBytesArray } from '@nosana/ipfs';
20
20
  // Export token service
21
- export { createTokenService } from './services/TokenService.js';
21
+ export { createTokenService } from './services/token/index.js';
22
22
  // Export generated clients under namespaces to avoid naming conflicts
23
23
  export * as JobsClient from './generated_clients/jobs/index.js';
24
24
  export * as StakingClient from './generated_clients/staking/index.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,OAAO,EAAE,kBAAkB,EAAqB,MAAM,mBAAmB,CAAC;AAE1E,oFAAoF;AACpF,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI9C,iCAAiC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AAEnC,uCAAuC;AACvC,OAAO,EACL,iBAAiB,EAEjB,QAAQ,EACR,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAG5C,wCAAwC;AACxC,OAAO,EAAE,kBAAkB,EAAqB,MAAM,qCAAqC,CAAC;AAG5F,oDAAoD;AACpD,OAAO,EACL,8BAA8B,EAE9B,WAAW,GACZ,MAAM,iDAAiD,CAAC;AAKzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAE3F,0CAA0C;AAC1C,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEhF,uBAAuB;AACvB,OAAO,EAAE,kBAAkB,EAAqB,MAAM,4BAA4B,CAAC;AAGnF,sEAAsE;AACtE,OAAO,KAAK,UAAU,MAAM,mCAAmC,CAAC;AAChE,OAAO,KAAK,aAAa,MAAM,sCAAsC,CAAC;AACtE,OAAO,KAAK,uBAAuB,MAAM,iDAAiD,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,OAAO,EAAE,kBAAkB,EAAqB,MAAM,mBAAmB,CAAC;AAE1E,oFAAoF;AACpF,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI9C,iCAAiC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AAEnC,uCAAuC;AACvC,OAAO,EACL,iBAAiB,EAEjB,QAAQ,EACR,eAAe,GAChB,MAAM,mCAAmC,CAAC;AAG3C,wCAAwC;AACxC,OAAO,EAAE,kBAAkB,EAAqB,MAAM,oCAAoC,CAAC;AAG3F,oDAAoD;AACpD,OAAO,EACL,8BAA8B,EAE9B,WAAW,GACZ,MAAM,gDAAgD,CAAC;AAKxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAC;AAE1F,0CAA0C;AAC1C,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEhF,uBAAuB;AACvB,OAAO,EAAE,kBAAkB,EAAqB,MAAM,2BAA2B,CAAC;AAGlF,sEAAsE;AACtE,OAAO,KAAK,UAAU,MAAM,mCAAmC,CAAC;AAChE,OAAO,KAAK,aAAa,MAAM,sCAAsC,CAAC;AACtE,OAAO,KAAK,uBAAuB,MAAM,iDAAiD,CAAC"}
@@ -0,0 +1,152 @@
1
+ import { type ConvertTypesForDb } from '../../../utils/index.js';
2
+ import type { Address } from '@solana/kit';
3
+ import type { ProgramDeps } from '../../../types.js';
4
+ import type { ProgramConfig } from '../../../config/types.js';
5
+ import * as Instructions from './instructions/index.js';
6
+ import * as programClient from '../../../generated_clients/jobs/index.js';
7
+ import type { SimpleMonitorEvent, MonitorEvent } from './monitor/index.js';
8
+ export declare enum JobState {
9
+ QUEUED = 0,
10
+ RUNNING = 1,
11
+ COMPLETED = 2,
12
+ STOPPED = 3
13
+ }
14
+ export declare enum MarketQueueType {
15
+ JOB_QUEUE = 0,
16
+ NODE_QUEUE = 1
17
+ }
18
+ export type Job = Omit<ConvertTypesForDb<programClient.JobAccountArgs>, 'state'> & {
19
+ address: Address;
20
+ state: JobState;
21
+ };
22
+ export type Market = Omit<ConvertTypesForDb<programClient.MarketAccountArgs>, 'queueType'> & {
23
+ address: Address;
24
+ queueType: MarketQueueType;
25
+ };
26
+ export type Run = ConvertTypesForDb<programClient.RunAccountArgs> & {
27
+ address: Address;
28
+ };
29
+ export { MonitorEventType } from './monitor/index.js';
30
+ export type { SimpleMonitorEvent, MonitorEvent } from './monitor/index.js';
31
+ /**
32
+ * Jobs program interface
33
+ */
34
+ export interface JobsProgram {
35
+ /**
36
+ * Fetch a job account by address
37
+ */
38
+ get(addr: Address, checkRun?: boolean): Promise<Job>;
39
+ /**
40
+ * Fetch a run account by address
41
+ */
42
+ run(addr: Address): Promise<Run>;
43
+ /**
44
+ * Fetch a market account by address
45
+ */
46
+ market(addr: Address): Promise<Market>;
47
+ /**
48
+ * Fetch multiple job accounts by address
49
+ */
50
+ multiple(addresses: Address[], checkRuns?: boolean): Promise<Job[]>;
51
+ /**
52
+ * Fetch all job accounts
53
+ */
54
+ all(filters?: {
55
+ state?: JobState;
56
+ market?: Address;
57
+ node?: Address;
58
+ project?: Address;
59
+ }, checkRuns?: boolean): Promise<Job[]>;
60
+ /**
61
+ * Fetch all run accounts
62
+ */
63
+ runs(filters?: {
64
+ node?: Address;
65
+ job?: Address;
66
+ }): Promise<Run[]>;
67
+ /**
68
+ * Fetch all market accounts
69
+ */
70
+ markets(): Promise<Market[]>;
71
+ /**
72
+ * Post a new job to the marketplace
73
+ */
74
+ post: Instructions.Post;
75
+ /**
76
+ * Extend an existing job's timeout
77
+ */
78
+ extend: Instructions.Extend;
79
+ /**
80
+ * Delist a job from the marketplace
81
+ */
82
+ delist: Instructions.Delist;
83
+ /**
84
+ * Stop a running job
85
+ */
86
+ end(params: {
87
+ job: Address;
88
+ }): Promise<ReturnType<typeof programClient.getEndInstruction>>;
89
+ /**
90
+ * Monitor program account updates using async iterators.
91
+ * Automatically merges run account data into job account updates.
92
+ * Returns a tuple of [eventStream, stopFunction].
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * const [eventStream, stop] = await jobsProgram.monitor();
97
+ * for await (const event of eventStream) {
98
+ * if (event.type === MonitorEventType.JOB) {
99
+ * console.log('Job updated:', event.data.address);
100
+ * } else if (event.type === MonitorEventType.MARKET) {
101
+ * console.log('Market updated:', event.data.address);
102
+ * }
103
+ * }
104
+ * ```
105
+ */
106
+ monitor(): Promise<[AsyncIterable<SimpleMonitorEvent>, () => void]>;
107
+ /**
108
+ * Monitor program account updates with detailed events for each account type.
109
+ * Provides separate events for job, market, and run accounts.
110
+ * Returns a tuple of [eventStream, stopFunction].
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * const [eventStream, stop] = await jobsProgram.monitorDetailed();
115
+ * for await (const event of eventStream) {
116
+ * switch (event.type) {
117
+ * case MonitorEventType.JOB:
118
+ * console.log('Job updated:', event.data.address);
119
+ * break;
120
+ * case MonitorEventType.MARKET:
121
+ * console.log('Market updated:', event.data.address);
122
+ * break;
123
+ * case MonitorEventType.RUN:
124
+ * console.log('Run updated:', event.data.address);
125
+ * break;
126
+ * }
127
+ * }
128
+ * ```
129
+ */
130
+ monitorDetailed(): Promise<[AsyncIterable<MonitorEvent>, () => void]>;
131
+ }
132
+ /**
133
+ * Creates a new JobsProgram instance.
134
+ *
135
+ * @param deps - Program dependencies (config, logger, solana service, wallet getter)
136
+ * @returns A JobsProgram instance with methods to interact with the jobs program
137
+ *
138
+ * @example
139
+ * ```ts
140
+ * import { createJobsProgram } from '@nosana/kit';
141
+ *
142
+ * const jobsProgram = createJobsProgram({
143
+ * config,
144
+ * logger,
145
+ * solana,
146
+ * getWallet,
147
+ * });
148
+ *
149
+ * const job = await jobsProgram.get('job-address');
150
+ * ```
151
+ */
152
+ export declare function createJobsProgram(deps: ProgramDeps, config: ProgramConfig): JobsProgram;