@jsm-mit/rabbit-motoko-package 0.4.5 → 0.6.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.
@@ -1,3 +1,4 @@
1
+ type TaskId = nat;
1
2
  type Task =
2
3
  record {
3
4
  channel: text;
@@ -5,7 +6,7 @@ type Task =
5
6
  completedAt: int;
6
7
  createdAt: int;
7
8
  expiresAt: int;
8
- id: nat;
9
+ id: TaskId;
9
10
  parentIds: opt vec nat;
10
11
  payload: text;
11
12
  resultMessage: text;
@@ -16,66 +17,64 @@ type Task =
16
17
  type Result_4 =
17
18
  variant {
18
19
  err: Error;
19
- ok: bool;
20
+ ok: TaskId;
20
21
  };
21
22
  type Result_3 =
22
23
  variant {
23
24
  err: Error;
24
- ok: vec nat;
25
+ ok: bool;
25
26
  };
26
27
  type Result_2 =
27
28
  variant {
28
29
  err: Error;
29
- ok: Task;
30
+ ok: vec TaskId;
30
31
  };
31
32
  type Result_1 =
32
33
  variant {
33
34
  err: Error;
34
- ok: vec Task;
35
+ ok: Task;
35
36
  };
36
37
  type Result =
37
38
  variant {
38
39
  err: Error;
39
- ok: nat;
40
+ ok: vec Task;
40
41
  };
41
42
  type Error =
42
43
  variant {
43
44
  AlreadyExists;
45
+ ForcedUpdate: text;
44
46
  InvalidData: text;
45
47
  NotAuthorized: text;
46
- NotFound;
48
+ NotFound: text;
47
49
  ReturnsNull;
48
50
  };
49
51
  type CompleteTaskArgs =
50
52
  record {
51
- id: nat;
53
+ id: TaskId;
52
54
  message: text;
53
55
  };
54
56
  type ClaimTaskArgs =
55
57
  record {
56
- id: nat;
58
+ id: TaskId;
57
59
  timeoutNanos: int;
58
60
  };
59
61
  type AddTaskArgs =
60
62
  record {
61
63
  channel: text;
62
64
  commonId: text;
63
- parentIds: opt vec nat;
65
+ parentIds: opt vec TaskId;
64
66
  payload: text;
65
67
  };
66
68
  service : {
67
- addTask: (args: AddTaskArgs) -> (Result);
68
- claimTask: (args: ClaimTaskArgs) -> (Result_2);
69
- completeTask: (args: CompleteTaskArgs) -> (Result_4);
70
- getAvailableTaskIds: (channel: text) -> (Result_3) query;
71
- getTask: (id: nat) -> (Result_2) query;
72
- getTasks: () -> (Result_1) query;
69
+ addTask: (args: AddTaskArgs) -> (Result_4);
70
+ claimTask: (args: ClaimTaskArgs) -> (Result_1);
71
+ completeTask: (args: CompleteTaskArgs) -> (Result_3);
72
+ getAvailableTaskIds: (channel: text) -> (Result_2) query;
73
+ getTask: (id: nat) -> (Result_1) query;
74
+ getTasks: () -> (Result) query;
73
75
  getTasksByChannelAndCommonId: (channel: text, commonId: text) ->
74
- (Result_1) query;
75
- getTasksByCommonId: (commonId: text) -> (Result_1) query;
76
- getTasksLast24h: () -> (Result_1) query;
77
- testErrWithText: () -> (Result) query;
78
- testErrWithText2: () -> (Result) query;
79
- testError: () -> (Result) query;
76
+ (Result) query;
77
+ getTasksByCommonId: (commonId: text) -> (Result) query;
78
+ getTasksLast24h: () -> (Result) query;
80
79
  whoAmI: () -> (principal) query;
81
80
  }
@@ -3,30 +3,31 @@ import type { ActorMethod } from '@icp-sdk/core/agent';
3
3
  import type { IDL } from '@icp-sdk/core/candid';
4
4
 
5
5
  export interface AddTaskArgs {
6
- 'parentIds' : [] | [Array<bigint>],
6
+ 'parentIds' : [] | [Array<TaskId>],
7
7
  'commonId' : string,
8
8
  'channel' : string,
9
9
  'payload' : string,
10
10
  }
11
- export interface ClaimTaskArgs { 'id' : bigint, 'timeoutNanos' : bigint }
12
- export interface CompleteTaskArgs { 'id' : bigint, 'message' : string }
13
- export type Error = { 'NotFound' : null } |
11
+ export interface ClaimTaskArgs { 'id' : TaskId, 'timeoutNanos' : bigint }
12
+ export interface CompleteTaskArgs { 'id' : TaskId, 'message' : string }
13
+ export type Error = { 'NotFound' : string } |
14
14
  { 'NotAuthorized' : string } |
15
15
  { 'InvalidData' : string } |
16
16
  { 'AlreadyExists' : null } |
17
+ { 'ForcedUpdate' : string } |
17
18
  { 'ReturnsNull' : null };
18
- export type Result = { 'ok' : bigint } |
19
+ export type Result = { 'ok' : Array<Task> } |
19
20
  { 'err' : Error };
20
- export type Result_1 = { 'ok' : Array<Task> } |
21
+ export type Result_1 = { 'ok' : Task } |
21
22
  { 'err' : Error };
22
- export type Result_2 = { 'ok' : Task } |
23
+ export type Result_2 = { 'ok' : Array<TaskId> } |
23
24
  { 'err' : Error };
24
- export type Result_3 = { 'ok' : Array<bigint> } |
25
+ export type Result_3 = { 'ok' : boolean } |
25
26
  { 'err' : Error };
26
- export type Result_4 = { 'ok' : boolean } |
27
+ export type Result_4 = { 'ok' : TaskId } |
27
28
  { 'err' : Error };
28
29
  export interface Task {
29
- 'id' : bigint,
30
+ 'id' : TaskId,
30
31
  'status' : bigint,
31
32
  'completedAt' : bigint,
32
33
  'resultMessage' : string,
@@ -39,19 +40,17 @@ export interface Task {
39
40
  'channel' : string,
40
41
  'payload' : string,
41
42
  }
43
+ export type TaskId = bigint;
42
44
  export interface _SERVICE {
43
- 'addTask' : ActorMethod<[AddTaskArgs], Result>,
44
- 'claimTask' : ActorMethod<[ClaimTaskArgs], Result_2>,
45
- 'completeTask' : ActorMethod<[CompleteTaskArgs], Result_4>,
46
- 'getAvailableTaskIds' : ActorMethod<[string], Result_3>,
47
- 'getTask' : ActorMethod<[bigint], Result_2>,
48
- 'getTasks' : ActorMethod<[], Result_1>,
49
- 'getTasksByChannelAndCommonId' : ActorMethod<[string, string], Result_1>,
50
- 'getTasksByCommonId' : ActorMethod<[string], Result_1>,
51
- 'getTasksLast24h' : ActorMethod<[], Result_1>,
52
- 'testErrWithText' : ActorMethod<[], Result>,
53
- 'testErrWithText2' : ActorMethod<[], Result>,
54
- 'testError' : ActorMethod<[], Result>,
45
+ 'addTask' : ActorMethod<[AddTaskArgs], Result_4>,
46
+ 'claimTask' : ActorMethod<[ClaimTaskArgs], Result_1>,
47
+ 'completeTask' : ActorMethod<[CompleteTaskArgs], Result_3>,
48
+ 'getAvailableTaskIds' : ActorMethod<[string], Result_2>,
49
+ 'getTask' : ActorMethod<[bigint], Result_1>,
50
+ 'getTasks' : ActorMethod<[], Result>,
51
+ 'getTasksByChannelAndCommonId' : ActorMethod<[string, string], Result>,
52
+ 'getTasksByCommonId' : ActorMethod<[string], Result>,
53
+ 'getTasksLast24h' : ActorMethod<[], Result>,
55
54
  'whoAmI' : ActorMethod<[], Principal>,
56
55
  }
57
56
  export declare const idlFactory: IDL.InterfaceFactory;
@@ -1,24 +1,23 @@
1
1
  export const idlFactory = ({ IDL }) => {
2
+ const TaskId = IDL.Nat;
2
3
  const AddTaskArgs = IDL.Record({
3
- 'parentIds' : IDL.Opt(IDL.Vec(IDL.Nat)),
4
+ 'parentIds' : IDL.Opt(IDL.Vec(TaskId)),
4
5
  'commonId' : IDL.Text,
5
6
  'channel' : IDL.Text,
6
7
  'payload' : IDL.Text,
7
8
  });
8
9
  const Error = IDL.Variant({
9
- 'NotFound' : IDL.Null,
10
+ 'NotFound' : IDL.Text,
10
11
  'NotAuthorized' : IDL.Text,
11
12
  'InvalidData' : IDL.Text,
12
13
  'AlreadyExists' : IDL.Null,
14
+ 'ForcedUpdate' : IDL.Text,
13
15
  'ReturnsNull' : IDL.Null,
14
16
  });
15
- const Result = IDL.Variant({ 'ok' : IDL.Nat, 'err' : Error });
16
- const ClaimTaskArgs = IDL.Record({
17
- 'id' : IDL.Nat,
18
- 'timeoutNanos' : IDL.Int,
19
- });
17
+ const Result_4 = IDL.Variant({ 'ok' : TaskId, 'err' : Error });
18
+ const ClaimTaskArgs = IDL.Record({ 'id' : TaskId, 'timeoutNanos' : IDL.Int });
20
19
  const Task = IDL.Record({
21
- 'id' : IDL.Nat,
20
+ 'id' : TaskId,
22
21
  'status' : IDL.Nat,
23
22
  'completedAt' : IDL.Int,
24
23
  'resultMessage' : IDL.Text,
@@ -31,28 +30,25 @@ export const idlFactory = ({ IDL }) => {
31
30
  'channel' : IDL.Text,
32
31
  'payload' : IDL.Text,
33
32
  });
34
- const Result_2 = IDL.Variant({ 'ok' : Task, 'err' : Error });
35
- const CompleteTaskArgs = IDL.Record({ 'id' : IDL.Nat, 'message' : IDL.Text });
36
- const Result_4 = IDL.Variant({ 'ok' : IDL.Bool, 'err' : Error });
37
- const Result_3 = IDL.Variant({ 'ok' : IDL.Vec(IDL.Nat), 'err' : Error });
38
- const Result_1 = IDL.Variant({ 'ok' : IDL.Vec(Task), 'err' : Error });
33
+ const Result_1 = IDL.Variant({ 'ok' : Task, 'err' : Error });
34
+ const CompleteTaskArgs = IDL.Record({ 'id' : TaskId, 'message' : IDL.Text });
35
+ const Result_3 = IDL.Variant({ 'ok' : IDL.Bool, 'err' : Error });
36
+ const Result_2 = IDL.Variant({ 'ok' : IDL.Vec(TaskId), 'err' : Error });
37
+ const Result = IDL.Variant({ 'ok' : IDL.Vec(Task), 'err' : Error });
39
38
  return IDL.Service({
40
- 'addTask' : IDL.Func([AddTaskArgs], [Result], []),
41
- 'claimTask' : IDL.Func([ClaimTaskArgs], [Result_2], []),
42
- 'completeTask' : IDL.Func([CompleteTaskArgs], [Result_4], []),
43
- 'getAvailableTaskIds' : IDL.Func([IDL.Text], [Result_3], ['query']),
44
- 'getTask' : IDL.Func([IDL.Nat], [Result_2], ['query']),
45
- 'getTasks' : IDL.Func([], [Result_1], ['query']),
39
+ 'addTask' : IDL.Func([AddTaskArgs], [Result_4], []),
40
+ 'claimTask' : IDL.Func([ClaimTaskArgs], [Result_1], []),
41
+ 'completeTask' : IDL.Func([CompleteTaskArgs], [Result_3], []),
42
+ 'getAvailableTaskIds' : IDL.Func([IDL.Text], [Result_2], ['query']),
43
+ 'getTask' : IDL.Func([IDL.Nat], [Result_1], ['query']),
44
+ 'getTasks' : IDL.Func([], [Result], ['query']),
46
45
  'getTasksByChannelAndCommonId' : IDL.Func(
47
46
  [IDL.Text, IDL.Text],
48
- [Result_1],
47
+ [Result],
49
48
  ['query'],
50
49
  ),
51
- 'getTasksByCommonId' : IDL.Func([IDL.Text], [Result_1], ['query']),
52
- 'getTasksLast24h' : IDL.Func([], [Result_1], ['query']),
53
- 'testErrWithText' : IDL.Func([], [Result], ['query']),
54
- 'testErrWithText2' : IDL.Func([], [Result], ['query']),
55
- 'testError' : IDL.Func([], [Result], ['query']),
50
+ 'getTasksByCommonId' : IDL.Func([IDL.Text], [Result], ['query']),
51
+ 'getTasksLast24h' : IDL.Func([], [Result], ['query']),
56
52
  'whoAmI' : IDL.Func([], [IDL.Principal], ['query']),
57
53
  });
58
54
  };
@@ -5,9 +5,9 @@ export declare class RabbitMotokoActor extends ActorBase {
5
5
  private actor;
6
6
  constructor(canisterId: string, identity?: Secp256k1KeyIdentity);
7
7
  protected initActor(): void;
8
- addTaskAsyncUnsafe(args: AddTaskArgs, ensureExecute?: boolean): Promise<bigint>;
9
- claimTaskAsyncUnsafe(args: ClaimTaskArgs, ensureExecute?: boolean): Promise<Task>;
10
- completeTaskAsyncUnsafe(args: CompleteTaskArgs, ensureExecute?: boolean): Promise<boolean>;
11
- getAvailableTaskIdsAsyncUnsafe(channel: string, ensureExecute?: boolean): Promise<bigint[]>;
8
+ addTaskAsyncUnsafe(args: AddTaskArgs): Promise<bigint>;
9
+ claimTaskAsyncUnsafe(args: ClaimTaskArgs): Promise<Task>;
10
+ completeTaskAsyncUnsafe(args: CompleteTaskArgs): Promise<boolean>;
11
+ getAvailableTaskIdsAsyncUnsafe(channel: string): Promise<bigint[]>;
12
12
  }
13
13
  //# sourceMappingURL=rabbit-motoko-actor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rabbit-motoko-actor.d.ts","sourceRoot":"","sources":["../src/rabbit-motoko-actor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,OAAO,KAAK,EAAY,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,oEAAoE,CAAC;AACvJ,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,qBAAa,iBAAkB,SAAQ,SAAS;IAC5C,OAAO,CAAC,KAAK,CAA2B;gBAE5B,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,oBAAoB;IAI/D,SAAS,CAAC,SAAS;IASN,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAUtF,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,aAAa,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxF,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,EAAE,aAAa,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAUjG,8BAA8B,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CASlH"}
1
+ {"version":3,"file":"rabbit-motoko-actor.d.ts","sourceRoot":"","sources":["../src/rabbit-motoko-actor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,OAAO,KAAK,EAAY,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,oEAAoE,CAAC;AACvJ,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,qBAAa,iBAAkB,SAAQ,SAAS;IAC5C,OAAO,CAAC,KAAK,CAA2B;gBAE5B,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,oBAAoB;IAI/D,SAAS,CAAC,SAAS;IASN,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAQtD,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxD,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQjE,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAOlF"}
@@ -13,16 +13,16 @@ export class RabbitMotokoActor extends ActorBase {
13
13
  });
14
14
  }
15
15
  // --- Public Actor Methods ---
16
- async addTaskAsyncUnsafe(args, ensureExecute = false) {
17
- return await this.executeFunctionAsyncUnsafe(() => this.actor.addTask(args), "Network error: add task failed", "addTaskAsyncUnsafe", [args, ensureExecute], ensureExecute);
16
+ async addTaskAsyncUnsafe(args) {
17
+ return await this.executeFunctionAsyncUnsafe(() => this.actor.addTask(args), "addTaskAsyncUnsafe", [args]);
18
18
  }
19
- async claimTaskAsyncUnsafe(args, ensureExecute = false) {
20
- return await this.executeFunctionAsyncUnsafe(() => this.actor.claimTask(args), "Network error: claim task failed", "claimTaskAsyncUnsafe", [args, ensureExecute], ensureExecute);
19
+ async claimTaskAsyncUnsafe(args) {
20
+ return await this.executeFunctionAsyncUnsafe(() => this.actor.claimTask(args), "claimTaskAsyncUnsafe", [args]);
21
21
  }
22
- async completeTaskAsyncUnsafe(args, ensureExecute = false) {
23
- return await this.executeFunctionAsyncUnsafe(() => this.actor.completeTask(args), "Network error: complete task failed", "completeTaskAsyncUnsafe", [args, ensureExecute], ensureExecute);
22
+ async completeTaskAsyncUnsafe(args) {
23
+ return await this.executeFunctionAsyncUnsafe(() => this.actor.completeTask(args), "completeTaskAsyncUnsafe", [args]);
24
24
  }
25
- async getAvailableTaskIdsAsyncUnsafe(channel, ensureExecute = false) {
26
- return await this.executeFunctionAsyncUnsafe(() => this.actor.getAvailableTaskIds(channel), "Network error: get available task IDs failed", "getAvailableTaskIdsAsyncUnsafe", [channel, ensureExecute], ensureExecute);
25
+ async getAvailableTaskIdsAsyncUnsafe(channel) {
26
+ return await this.executeFunctionAsyncUnsafe(() => this.actor.getAvailableTaskIds(channel), "getAvailableTaskIdsAsyncUnsafe", [channel]);
27
27
  }
28
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rabbit-task-worker.d.ts","sourceRoot":"","sources":["../src/rabbit-task-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAW,MAAM,MAAM,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAsB,KAAK,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAKlG,qBAAa,gBAAgB;IAYrB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,KAAK;IAbjB,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;IAEnD,OAAO,CAAC,uBAAuB,CAAc;IAE7C,IAAW,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,CAEpC;gBAGW,OAAO,EAAE,MAAM,EACf,mBAAmB,EAAE,MAAM,EAC3B,KAAK,EAAE,iBAAiB;YAItB,YAAY;IAwCnB,GAAG,IAAI,IAAI;IAWX,IAAI,IAAI,IAAI;CAQtB"}
1
+ {"version":3,"file":"rabbit-task-worker.d.ts","sourceRoot":"","sources":["../src/rabbit-task-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAW,MAAM,MAAM,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAsB,KAAK,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAKlG,qBAAa,gBAAgB;IAYrB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,KAAK;IAbjB,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;IAEnD,OAAO,CAAC,uBAAuB,CAAc;IAE7C,IAAW,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,CAEpC;gBAGW,OAAO,EAAE,MAAM,EACf,mBAAmB,EAAE,MAAM,EAC3B,KAAK,EAAE,iBAAiB;YAItB,YAAY;IA4CnB,GAAG,IAAI,IAAI;IAWX,IAAI,IAAI,IAAI;CAQtB"}
@@ -26,14 +26,14 @@ export class RabbitTaskWorker {
26
26
  }
27
27
  try {
28
28
  this.isProcessing = true;
29
- const availableIds = await this.actor.getAvailableTaskIdsAsyncUnsafe(this.channel, true);
29
+ const availableIds = await this.actor.getAvailableTaskIdsAsyncUnsafe(this.channel);
30
30
  const timeoutNanos = BigInt(5 * 60 * 1000000000);
31
31
  for (const taskId of availableIds) {
32
32
  const args = {
33
33
  id: taskId,
34
34
  timeoutNanos: timeoutNanos
35
35
  };
36
- const task = await this.actor.claimTaskAsyncUnsafe(args, true);
36
+ const task = await this.actor.claimTaskAsyncUnsafe(args);
37
37
  if (task) {
38
38
  this.taskSubject.next(task);
39
39
  }
@@ -41,7 +41,13 @@ export class RabbitTaskWorker {
41
41
  this.lastSuccessfulProcessTs = Date.now();
42
42
  }
43
43
  catch (err) {
44
- pigeon.reportUrgentAsyncSafe(componentName, "JTQRR", "Unexpected error in processQueue", BetterJSON.stringify(err));
44
+ const errorMsg = BetterJSON.stringify(err);
45
+ if (errorMsg.includes("ForcedUpdated")) {
46
+ pigeon.reportInfoAsyncSafe(componentName, "RZQ9K", "Forced update detected during processQueue, this is ok", errorMsg);
47
+ }
48
+ else {
49
+ pigeon.reportUrgentAsyncSafe(componentName, "JTQRR", "Unexpected error in processQueue", errorMsg);
50
+ }
45
51
  }
46
52
  finally {
47
53
  this.isProcessing = false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsm-mit/rabbit-motoko-package",
3
- "version": "0.4.5",
3
+ "version": "0.6.0",
4
4
  "description": "Wrapper TypeScript package for Rabbit Motoko Canister.",
5
5
  "license": "ISC",
6
6
  "author": "",
@@ -29,7 +29,7 @@
29
29
  "@jsm-mit/utils-package": "^0.4.0"
30
30
  },
31
31
  "peerDependencies": {
32
- "@jsm-mit/jsm-framework": "^0.5.1",
32
+ "@jsm-mit/jsm-framework": "^0.6.0",
33
33
  "@icp-sdk/core": "^5.2.0",
34
34
  "@jsm-mit/pigeon-package": "^0.9.4"
35
35
  },