@autonoelle/wsg-active 0.1.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 (110) hide show
  1. package/README.md +169 -0
  2. package/dist/activeRestClient.d.ts +30 -0
  3. package/dist/activeRestClient.d.ts.map +1 -0
  4. package/dist/activeRestClient.js +130 -0
  5. package/dist/activeRestClient.js.map +1 -0
  6. package/dist/args.d.ts +33 -0
  7. package/dist/args.d.ts.map +1 -0
  8. package/dist/args.js +83 -0
  9. package/dist/args.js.map +1 -0
  10. package/dist/commands/account.d.ts +23 -0
  11. package/dist/commands/account.d.ts.map +1 -0
  12. package/dist/commands/account.js +322 -0
  13. package/dist/commands/account.js.map +1 -0
  14. package/dist/commands/auth.d.ts +8 -0
  15. package/dist/commands/auth.d.ts.map +1 -0
  16. package/dist/commands/auth.js +30 -0
  17. package/dist/commands/auth.js.map +1 -0
  18. package/dist/commands/battleMap.d.ts +4 -0
  19. package/dist/commands/battleMap.d.ts.map +1 -0
  20. package/dist/commands/battleMap.js +146 -0
  21. package/dist/commands/battleMap.js.map +1 -0
  22. package/dist/commands/config.d.ts +11 -0
  23. package/dist/commands/config.d.ts.map +1 -0
  24. package/dist/commands/config.js +125 -0
  25. package/dist/commands/config.js.map +1 -0
  26. package/dist/commands/discovery.d.ts +2 -0
  27. package/dist/commands/discovery.d.ts.map +1 -0
  28. package/dist/commands/discovery.js +109 -0
  29. package/dist/commands/discovery.js.map +1 -0
  30. package/dist/commands/functions.d.ts +26 -0
  31. package/dist/commands/functions.d.ts.map +1 -0
  32. package/dist/commands/functions.js +237 -0
  33. package/dist/commands/functions.js.map +1 -0
  34. package/dist/commands/mission.d.ts +7 -0
  35. package/dist/commands/mission.d.ts.map +1 -0
  36. package/dist/commands/mission.js +217 -0
  37. package/dist/commands/mission.js.map +1 -0
  38. package/dist/commands/session.d.ts +7 -0
  39. package/dist/commands/session.d.ts.map +1 -0
  40. package/dist/commands/session.js +17 -0
  41. package/dist/commands/session.js.map +1 -0
  42. package/dist/commands/shipPipe.d.ts +11 -0
  43. package/dist/commands/shipPipe.d.ts.map +1 -0
  44. package/dist/commands/shipPipe.js +127 -0
  45. package/dist/commands/shipPipe.js.map +1 -0
  46. package/dist/commands/snapshot.d.ts +33 -0
  47. package/dist/commands/snapshot.d.ts.map +1 -0
  48. package/dist/commands/snapshot.js +308 -0
  49. package/dist/commands/snapshot.js.map +1 -0
  50. package/dist/commands/store.d.ts +32 -0
  51. package/dist/commands/store.d.ts.map +1 -0
  52. package/dist/commands/store.js +212 -0
  53. package/dist/commands/store.js.map +1 -0
  54. package/dist/configTypes.d.ts +131 -0
  55. package/dist/configTypes.d.ts.map +1 -0
  56. package/dist/configTypes.js +152 -0
  57. package/dist/configTypes.js.map +1 -0
  58. package/dist/errors.d.ts +21 -0
  59. package/dist/errors.d.ts.map +1 -0
  60. package/dist/errors.js +42 -0
  61. package/dist/errors.js.map +1 -0
  62. package/dist/gameDataClient.d.ts +15 -0
  63. package/dist/gameDataClient.d.ts.map +1 -0
  64. package/dist/gameDataClient.js +63 -0
  65. package/dist/gameDataClient.js.map +1 -0
  66. package/dist/graphqlClient.d.ts +32 -0
  67. package/dist/graphqlClient.d.ts.map +1 -0
  68. package/dist/graphqlClient.js +106 -0
  69. package/dist/graphqlClient.js.map +1 -0
  70. package/dist/index.d.ts +3 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +712 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/output.d.ts +24 -0
  75. package/dist/output.d.ts.map +1 -0
  76. package/dist/output.js +39 -0
  77. package/dist/output.js.map +1 -0
  78. package/dist/security.d.ts +3 -0
  79. package/dist/security.d.ts.map +1 -0
  80. package/dist/security.js +41 -0
  81. package/dist/security.js.map +1 -0
  82. package/dist/tests/clients.test.d.ts +2 -0
  83. package/dist/tests/clients.test.d.ts.map +1 -0
  84. package/dist/tests/clients.test.js +31 -0
  85. package/dist/tests/clients.test.js.map +1 -0
  86. package/dist/tests/security.test.d.ts +2 -0
  87. package/dist/tests/security.test.d.ts.map +1 -0
  88. package/dist/tests/security.test.js +26 -0
  89. package/dist/tests/security.test.js.map +1 -0
  90. package/dist/tests/shipPipe.test.d.ts +2 -0
  91. package/dist/tests/shipPipe.test.d.ts.map +1 -0
  92. package/dist/tests/shipPipe.test.js +31 -0
  93. package/dist/tests/shipPipe.test.js.map +1 -0
  94. package/dist/tests/validation.test.d.ts +2 -0
  95. package/dist/tests/validation.test.d.ts.map +1 -0
  96. package/dist/tests/validation.test.js +58 -0
  97. package/dist/tests/validation.test.js.map +1 -0
  98. package/dist/tests/writeWorkflow.test.d.ts +2 -0
  99. package/dist/tests/writeWorkflow.test.d.ts.map +1 -0
  100. package/dist/tests/writeWorkflow.test.js +22 -0
  101. package/dist/tests/writeWorkflow.test.js.map +1 -0
  102. package/dist/validation.d.ts +18 -0
  103. package/dist/validation.d.ts.map +1 -0
  104. package/dist/validation.js +328 -0
  105. package/dist/validation.js.map +1 -0
  106. package/dist/writeWorkflow.d.ts +16 -0
  107. package/dist/writeWorkflow.d.ts.map +1 -0
  108. package/dist/writeWorkflow.js +135 -0
  109. package/dist/writeWorkflow.js.map +1 -0
  110. package/package.json +31 -0
@@ -0,0 +1,131 @@
1
+ /** Config type mapping — query field, mutation field, selection. */
2
+ export interface ConfigTypeEntry {
3
+ category: 'mission' | 'global';
4
+ queryField: string;
5
+ mutationField: string;
6
+ inputType: string;
7
+ selection: string;
8
+ }
9
+ export declare const configTypes: {
10
+ readonly MissionBattleConfig: {
11
+ readonly category: "mission";
12
+ readonly queryField: "missionBattleConfig";
13
+ readonly mutationField: "setMissionBattleConfig";
14
+ readonly inputType: "MissionBattleConfigInput";
15
+ readonly selection: "{\n allowDailyRestart\n activeBattle {\n enable autoRestartDaily autoStopWithFishing autoDecompose battleConfigId\n completeCount completeCountTarget name teamId teamChecker teamCheckerContinue\n onlySpoils autoStopWithSpoils\n }\n }";
16
+ };
17
+ readonly MissionCampaignBattleConfig: {
18
+ readonly category: "mission";
19
+ readonly queryField: "missionCampaignBattleConfig";
20
+ readonly mutationField: "setMissionCampaignBattleConfig";
21
+ readonly inputType: "MissionCampaignBattleConfigInput";
22
+ readonly selection: "{ dailyRestart campaignBattleArray { count id formation } }";
23
+ };
24
+ readonly MissionTaskReciverConfig: {
25
+ readonly category: "mission";
26
+ readonly queryField: "missionTaskReciverConfig";
27
+ readonly mutationField: "setMissionTaskReciverConfig";
28
+ readonly inputType: "MissionTaskReciverConfigInput";
29
+ readonly selection: "{ autoStart }";
30
+ };
31
+ readonly MissionAnythingConfig: {
32
+ readonly category: "mission";
33
+ readonly queryField: "missionAnythingConfig";
34
+ readonly mutationField: "setMissionAnythingConfig";
35
+ readonly inputType: "MissionAnythingConfigInput";
36
+ readonly selection: "{ autoDailyReward autoCook autoBuildShip }";
37
+ };
38
+ readonly MissionSixthBattleConfig: {
39
+ readonly category: "mission";
40
+ readonly queryField: "missionSixthBattleConfig";
41
+ readonly mutationField: "setMissionSixthBattleConfig";
42
+ readonly inputType: "MissionSixthBattleConfigInput";
43
+ readonly selection: "{ autoRun autoBuy autoBuyWith targets minTickets }";
44
+ };
45
+ readonly MissionRepairConfig: {
46
+ readonly category: "mission";
47
+ readonly queryField: "missionRepairConfig";
48
+ readonly mutationField: "setMissionRepairConfig";
49
+ readonly inputType: "MissionRepairConfigInput";
50
+ readonly selection: "{ state }";
51
+ };
52
+ readonly MissionInsertConfig: {
53
+ readonly category: "mission";
54
+ readonly queryField: "missionInsertConfig";
55
+ readonly mutationField: "setMissionInsertConfig";
56
+ readonly inputType: "MissionInsertConfigInput";
57
+ readonly selection: "{ actionNames }";
58
+ };
59
+ readonly GlobalDecomposeConfig: {
60
+ readonly category: "global";
61
+ readonly queryField: "globalDecomposeConfig";
62
+ readonly mutationField: "setGlobalDecomposeConfig";
63
+ readonly inputType: "GlobalDecomposeConfigInput";
64
+ readonly selection: "{ enable shipPipe }";
65
+ };
66
+ readonly GlobalStrengthenConfig: {
67
+ readonly category: "global";
68
+ readonly queryField: "globalStrengthenConfig";
69
+ readonly mutationField: "setGlobalStrengthenConfig";
70
+ readonly inputType: "GlobalStrengthenConfigInput";
71
+ readonly selection: "{\n enable auto110HasSkill shipIdArray allowCustomCover\n config {\n itemPower { fuel ammo steel aluminum }\n expPower { atk torpedo def airDef }\n lastExpUnlock { key value }\n }\n }";
72
+ };
73
+ readonly GlobalArchiveLockConfig: {
74
+ readonly category: "global";
75
+ readonly queryField: "globalArchiveLockConfig";
76
+ readonly mutationField: "setGlobalArchiveLockConfig";
77
+ readonly inputType: "GlobalArchiveLockConfigInput";
78
+ readonly selection: "{ enable }";
79
+ };
80
+ };
81
+ export type ConfigTypeName = keyof typeof configTypes;
82
+ /** Store type mapping. */
83
+ export interface StoreTypeEntry {
84
+ description: string;
85
+ listField: string;
86
+ getField: string;
87
+ setField: string;
88
+ removeField: string;
89
+ inputType: string;
90
+ selection: string;
91
+ }
92
+ export declare const storeTypes: {
93
+ readonly ShipPipe: {
94
+ readonly description: "舰船管道 — 按类型、等级、技能、锁状态等条件筛选舰船";
95
+ readonly listField: "shipPipes";
96
+ readonly getField: "shipPipe";
97
+ readonly setField: "setShipPipe";
98
+ readonly removeField: "removeShipPipe";
99
+ readonly inputType: "ShipPipeInput";
100
+ readonly selection: "{\n id name description shipTypeApply shipTypeBan\n levelRange { min max }\n skillLevelRange { min max }\n hpRate { min max }\n isLock isEvo\n sixthCost { min max }\n shipIdApply shipIdBan\n }";
101
+ };
102
+ readonly ShipReadyPipe: {
103
+ readonly description: "舰船武备管道 — 为舰船配置各装备槽位的装备 ID";
104
+ readonly listField: "shipReadyPipes";
105
+ readonly getField: "shipReadyPipe";
106
+ readonly setField: "setShipReadyPipe";
107
+ readonly removeField: "removeShipReadyPipe";
108
+ readonly inputType: "ShipReadyPipeInput";
109
+ readonly selection: "{ id name description shipType equipApply1 equipApply2 equipApply3 equipApply4 useUsedEquip }";
110
+ };
111
+ readonly TeamPipe: {
112
+ readonly description: "编队管道 — 定义编队的舰船管道和武备管道引用";
113
+ readonly listField: "teamPipes";
114
+ readonly getField: "teamPipe";
115
+ readonly setField: "setTeamPipe";
116
+ readonly removeField: "removeTeamPipe";
117
+ readonly inputType: "TeamPipeInput";
118
+ readonly selection: "{ id name description shipCheckers { v1 v2 v3 v4 v5 v6 values } shipReadys { v1 v2 v3 v4 v5 v6 values } }";
119
+ };
120
+ readonly BattleMapConfig: {
121
+ readonly description: "出征地图 — 配置地图初始节点、队伍血量条件和节点行为";
122
+ readonly listField: "battleMapConfigs";
123
+ readonly getField: "battleMapConfig";
124
+ readonly setField: "setBattleMapConfig";
125
+ readonly removeField: "removeBattleMapConfig";
126
+ readonly inputType: "BattleMapConfigInput";
127
+ readonly selection: "{\n id name description mapInitNodeId\n teamHPCondition { v1 { min max } v2 { min max } v3 { min max } v4 { min max } v5 { min max } v6 { min max } }\n nodeConfigs { key value {\n isEndPoint\n teamHPCondition { v1 { min max } v2 { min max } v3 { min max } v4 { min max } v5 { min max } v6 { min max } }\n battleConfig {\n timeMin timeOffset battleFormation nightAtk buffId\n battleFormationCheck { key value { passCount conditions { number shipType routeType } } }\n }\n nodeBackConfig { passCount conditions { number shipType routeType } }\n nodeRoundConfig { passCount conditions { number shipType routeType } }\n} }\n }";
128
+ };
129
+ };
130
+ export type StoreTypeName = keyof typeof storeTypes;
131
+ //# sourceMappingURL=configTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configTypes.d.ts","sourceRoot":"","sources":["../src/configTypes.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAgBpE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqF4B,CAAC;AAErD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,WAAW,CAAC;AAEtD,0BAA0B;AAC1B,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiD4B,CAAC;AAEpD,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,UAAU,CAAC"}
@@ -0,0 +1,152 @@
1
+ /** Config type mapping — query field, mutation field, selection. */
2
+ const rangeSelection = '{ min max }';
3
+ const teamRangeSelection = `{ v1 ${rangeSelection} v2 ${rangeSelection} v3 ${rangeSelection} v4 ${rangeSelection} v5 ${rangeSelection} v6 ${rangeSelection} }`;
4
+ const teamGuidSelection = '{ v1 v2 v3 v4 v5 v6 values }';
5
+ const routeCheckSelection = '{ passCount conditions { number shipType routeType } }';
6
+ const battleNodeSelection = `{
7
+ isEndPoint
8
+ teamHPCondition ${teamRangeSelection}
9
+ battleConfig {
10
+ timeMin timeOffset battleFormation nightAtk buffId
11
+ battleFormationCheck { key value ${routeCheckSelection} }
12
+ }
13
+ nodeBackConfig ${routeCheckSelection}
14
+ nodeRoundConfig ${routeCheckSelection}
15
+ }`;
16
+ export const configTypes = {
17
+ MissionBattleConfig: {
18
+ category: 'mission',
19
+ queryField: 'missionBattleConfig',
20
+ mutationField: 'setMissionBattleConfig',
21
+ inputType: 'MissionBattleConfigInput',
22
+ selection: `{
23
+ allowDailyRestart
24
+ activeBattle {
25
+ enable autoRestartDaily autoStopWithFishing autoDecompose battleConfigId
26
+ completeCount completeCountTarget name teamId teamChecker teamCheckerContinue
27
+ onlySpoils autoStopWithSpoils
28
+ }
29
+ }`,
30
+ },
31
+ MissionCampaignBattleConfig: {
32
+ category: 'mission',
33
+ queryField: 'missionCampaignBattleConfig',
34
+ mutationField: 'setMissionCampaignBattleConfig',
35
+ inputType: 'MissionCampaignBattleConfigInput',
36
+ selection: '{ dailyRestart campaignBattleArray { count id formation } }',
37
+ },
38
+ MissionTaskReciverConfig: {
39
+ category: 'mission',
40
+ queryField: 'missionTaskReciverConfig',
41
+ mutationField: 'setMissionTaskReciverConfig',
42
+ inputType: 'MissionTaskReciverConfigInput',
43
+ selection: '{ autoStart }',
44
+ },
45
+ MissionAnythingConfig: {
46
+ category: 'mission',
47
+ queryField: 'missionAnythingConfig',
48
+ mutationField: 'setMissionAnythingConfig',
49
+ inputType: 'MissionAnythingConfigInput',
50
+ selection: '{ autoDailyReward autoCook autoBuildShip }',
51
+ },
52
+ MissionSixthBattleConfig: {
53
+ category: 'mission',
54
+ queryField: 'missionSixthBattleConfig',
55
+ mutationField: 'setMissionSixthBattleConfig',
56
+ inputType: 'MissionSixthBattleConfigInput',
57
+ selection: '{ autoRun autoBuy autoBuyWith targets minTickets }',
58
+ },
59
+ MissionRepairConfig: {
60
+ category: 'mission',
61
+ queryField: 'missionRepairConfig',
62
+ mutationField: 'setMissionRepairConfig',
63
+ inputType: 'MissionRepairConfigInput',
64
+ selection: '{ state }',
65
+ },
66
+ MissionInsertConfig: {
67
+ category: 'mission',
68
+ queryField: 'missionInsertConfig',
69
+ mutationField: 'setMissionInsertConfig',
70
+ inputType: 'MissionInsertConfigInput',
71
+ selection: '{ actionNames }',
72
+ },
73
+ GlobalDecomposeConfig: {
74
+ category: 'global',
75
+ queryField: 'globalDecomposeConfig',
76
+ mutationField: 'setGlobalDecomposeConfig',
77
+ inputType: 'GlobalDecomposeConfigInput',
78
+ selection: '{ enable shipPipe }',
79
+ },
80
+ GlobalStrengthenConfig: {
81
+ category: 'global',
82
+ queryField: 'globalStrengthenConfig',
83
+ mutationField: 'setGlobalStrengthenConfig',
84
+ inputType: 'GlobalStrengthenConfigInput',
85
+ selection: `{
86
+ enable auto110HasSkill shipIdArray allowCustomCover
87
+ config {
88
+ itemPower { fuel ammo steel aluminum }
89
+ expPower { atk torpedo def airDef }
90
+ lastExpUnlock { key value }
91
+ }
92
+ }`,
93
+ },
94
+ GlobalArchiveLockConfig: {
95
+ category: 'global',
96
+ queryField: 'globalArchiveLockConfig',
97
+ mutationField: 'setGlobalArchiveLockConfig',
98
+ inputType: 'GlobalArchiveLockConfigInput',
99
+ selection: '{ enable }',
100
+ },
101
+ };
102
+ export const storeTypes = {
103
+ ShipPipe: {
104
+ description: '舰船管道 — 按类型、等级、技能、锁状态等条件筛选舰船',
105
+ listField: 'shipPipes',
106
+ getField: 'shipPipe',
107
+ setField: 'setShipPipe',
108
+ removeField: 'removeShipPipe',
109
+ inputType: 'ShipPipeInput',
110
+ selection: `{
111
+ id name description shipTypeApply shipTypeBan
112
+ levelRange ${rangeSelection}
113
+ skillLevelRange ${rangeSelection}
114
+ hpRate ${rangeSelection}
115
+ isLock isEvo
116
+ sixthCost ${rangeSelection}
117
+ shipIdApply shipIdBan
118
+ }`,
119
+ },
120
+ ShipReadyPipe: {
121
+ description: '舰船武备管道 — 为舰船配置各装备槽位的装备 ID',
122
+ listField: 'shipReadyPipes',
123
+ getField: 'shipReadyPipe',
124
+ setField: 'setShipReadyPipe',
125
+ removeField: 'removeShipReadyPipe',
126
+ inputType: 'ShipReadyPipeInput',
127
+ selection: '{ id name description shipType equipApply1 equipApply2 equipApply3 equipApply4 useUsedEquip }',
128
+ },
129
+ TeamPipe: {
130
+ description: '编队管道 — 定义编队的舰船管道和武备管道引用',
131
+ listField: 'teamPipes',
132
+ getField: 'teamPipe',
133
+ setField: 'setTeamPipe',
134
+ removeField: 'removeTeamPipe',
135
+ inputType: 'TeamPipeInput',
136
+ selection: `{ id name description shipCheckers ${teamGuidSelection} shipReadys ${teamGuidSelection} }`,
137
+ },
138
+ BattleMapConfig: {
139
+ description: '出征地图 — 配置地图初始节点、队伍血量条件和节点行为',
140
+ listField: 'battleMapConfigs',
141
+ getField: 'battleMapConfig',
142
+ setField: 'setBattleMapConfig',
143
+ removeField: 'removeBattleMapConfig',
144
+ inputType: 'BattleMapConfigInput',
145
+ selection: `{
146
+ id name description mapInitNodeId
147
+ teamHPCondition ${teamRangeSelection}
148
+ nodeConfigs { key value ${battleNodeSelection} }
149
+ }`,
150
+ },
151
+ };
152
+ //# sourceMappingURL=configTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configTypes.js","sourceRoot":"","sources":["../src/configTypes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export type ErrorCategory = 'usage' | 'validation' | 'authentication' | 'authorization' | 'network' | 'timeout' | 'server' | 'graphql' | 'rest' | 'not_found' | 'conflict' | 'io' | 'unknown';
2
+ export interface CliErrorOptions {
3
+ category?: ErrorCategory;
4
+ field?: string;
5
+ details?: Record<string, unknown>;
6
+ suggestion?: string;
7
+ retryable?: boolean;
8
+ cause?: unknown;
9
+ }
10
+ /** Error with a stable machine-readable code for AI-agent callers. */
11
+ export declare class CliError extends Error {
12
+ readonly code: string;
13
+ readonly category: ErrorCategory;
14
+ readonly field?: string;
15
+ readonly details?: Record<string, unknown>;
16
+ readonly suggestion?: string;
17
+ readonly retryable: boolean;
18
+ constructor(code: string, message: string, options?: CliErrorOptions);
19
+ }
20
+ export declare function asCliError(value: unknown): CliError;
21
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,YAAY,GACZ,gBAAgB,GAChB,eAAe,GACf,SAAS,GACT,SAAS,GACT,QAAQ,GACR,SAAS,GACT,MAAM,GACN,WAAW,GACX,UAAU,GACV,IAAI,GACJ,SAAS,CAAC;AAEd,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,sEAAsE;AACtE,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;gBAEhB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB;CAUzE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAqBnD"}
package/dist/errors.js ADDED
@@ -0,0 +1,42 @@
1
+ /** Error with a stable machine-readable code for AI-agent callers. */
2
+ export class CliError extends Error {
3
+ code;
4
+ category;
5
+ field;
6
+ details;
7
+ suggestion;
8
+ retryable;
9
+ constructor(code, message, options = {}) {
10
+ super(message, options.cause === undefined ? undefined : { cause: options.cause });
11
+ this.name = 'CliError';
12
+ this.code = code;
13
+ this.category = options.category ?? 'unknown';
14
+ this.field = options.field;
15
+ this.details = options.details;
16
+ this.suggestion = options.suggestion;
17
+ this.retryable = options.retryable ?? false;
18
+ }
19
+ }
20
+ export function asCliError(value) {
21
+ if (value instanceof CliError) {
22
+ return value;
23
+ }
24
+ if (value instanceof Error) {
25
+ if (/^(?:Invalid|Missing|Unknown|Unsupported)|mutually exclusive/i.test(value.message)) {
26
+ return new CliError('ARGUMENT_ERROR', value.message, {
27
+ category: 'usage',
28
+ suggestion: 'Run the command with --help and correct the indicated argument.',
29
+ cause: value,
30
+ });
31
+ }
32
+ if (/not found|No item found/i.test(value.message)) {
33
+ return new CliError('NOT_FOUND', value.message, { category: 'not_found', cause: value });
34
+ }
35
+ return new CliError('UNEXPECTED_ERROR', value.message || 'Unexpected error', {
36
+ category: 'unknown',
37
+ cause: value,
38
+ });
39
+ }
40
+ return new CliError('UNEXPECTED_ERROR', String(value), { category: 'unknown' });
41
+ }
42
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAwBA,sEAAsE;AACtE,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,IAAI,CAAS;IACb,QAAQ,CAAgB;IACxB,KAAK,CAAU;IACf,OAAO,CAA2B;IAClC,UAAU,CAAU;IACpB,SAAS,CAAU;IAE5B,YAAY,IAAY,EAAE,OAAe,EAAE,UAA2B,EAAE;QACtE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC;QAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,IAAI,8DAA8D,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACvF,OAAO,IAAI,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC,OAAO,EAAE;gBACnD,QAAQ,EAAE,OAAO;gBACjB,UAAU,EAAE,iEAAiE;gBAC7E,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;QACD,IAAI,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,IAAI,QAAQ,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,IAAI,kBAAkB,EAAE;YAC3E,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1,15 @@
1
+ /** Lightweight GraphQL client for GameData endpoint. */
2
+ import type { GameDataOptions } from './args.js';
3
+ import { CliError } from './errors.js';
4
+ export declare class GameDataError extends CliError {
5
+ readonly httpCode?: number | undefined;
6
+ readonly graphQlErrors?: unknown[] | undefined;
7
+ constructor(code: string, message: string, httpCode?: number | undefined, graphQlErrors?: unknown[] | undefined, options?: {
8
+ category?: 'network' | 'timeout' | 'server' | 'graphql';
9
+ retryable?: boolean;
10
+ cause?: unknown;
11
+ });
12
+ }
13
+ /** Execute a GraphQL query against the GameData endpoint. */
14
+ export declare function gameDataGql<T = Record<string, unknown>>(options: GameDataOptions, query: string, variables?: Record<string, unknown>): Promise<T>;
15
+ //# sourceMappingURL=gameDataClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gameDataClient.d.ts","sourceRoot":"","sources":["../src/gameDataClient.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,qBAAa,aAAc,SAAQ,QAAQ;aAIvB,QAAQ,CAAC,EAAE,MAAM;aACjB,aAAa,CAAC,EAAE,OAAO,EAAE;gBAHzC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACC,QAAQ,CAAC,EAAE,MAAM,YAAA,EACjB,aAAa,CAAC,EAAE,OAAO,EAAE,YAAA,EACzC,OAAO,GAAE;QACP,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;QACxD,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,KAAK,CAAC,EAAE,OAAO,CAAC;KACZ;CAaT;AAOD,6DAA6D;AAC7D,wBAAsB,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,CAAC,CAAC,CAiEZ"}
@@ -0,0 +1,63 @@
1
+ /** Lightweight GraphQL client for GameData endpoint. */
2
+ import { CliError } from './errors.js';
3
+ export class GameDataError extends CliError {
4
+ httpCode;
5
+ graphQlErrors;
6
+ constructor(code, message, httpCode, graphQlErrors, options = {}) {
7
+ super(code, message, {
8
+ category: options.category ?? 'graphql',
9
+ details: {
10
+ ...(httpCode === undefined ? {} : { httpCode }),
11
+ ...(graphQlErrors === undefined ? {} : { graphQlErrors }),
12
+ },
13
+ retryable: options.retryable,
14
+ cause: options.cause,
15
+ });
16
+ this.httpCode = httpCode;
17
+ this.graphQlErrors = graphQlErrors;
18
+ this.name = 'GameDataError';
19
+ }
20
+ }
21
+ /** Execute a GraphQL query against the GameData endpoint. */
22
+ export async function gameDataGql(options, query, variables) {
23
+ let res;
24
+ const timeoutMs = options.timeoutMs ?? 15_000;
25
+ const controller = new AbortController();
26
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
27
+ try {
28
+ res = await fetch(options.dataUrl, {
29
+ method: 'POST',
30
+ headers: { 'content-type': 'application/json' },
31
+ body: JSON.stringify({ query, variables }),
32
+ signal: controller.signal,
33
+ });
34
+ }
35
+ catch (cause) {
36
+ if (cause.name === 'AbortError') {
37
+ throw new GameDataError('GAMEDATA_TIMEOUT', `GameData request timed out after ${timeoutMs} ms.`, undefined, undefined, { category: 'timeout', retryable: true, cause });
38
+ }
39
+ throw new GameDataError('GAMEDATA_NETWORK_ERROR', `HTTP 请求失败: ${cause.message}`, undefined, undefined, { category: 'network', retryable: true, cause });
40
+ }
41
+ finally {
42
+ clearTimeout(timeout);
43
+ }
44
+ if (!res.ok) {
45
+ const bodyText = await res.text().catch(() => '(no body)');
46
+ throw new GameDataError(res.status >= 500 ? 'GAMEDATA_SERVER_ERROR' : 'GAMEDATA_HTTP_ERROR', `GameData returned HTTP ${res.status}${bodyText ? '.' : ''}`, res.status, undefined, { category: res.status >= 500 ? 'server' : 'graphql', retryable: res.status >= 500 });
47
+ }
48
+ let json;
49
+ try {
50
+ json = (await res.json());
51
+ }
52
+ catch {
53
+ throw new GameDataError('GAMEDATA_INVALID_JSON', 'GameData response is not valid JSON.');
54
+ }
55
+ if (json.errors && json.errors.length > 0) {
56
+ throw new GameDataError('GAMEDATA_GRAPHQL_ERROR', json.errors.map((item) => item.message).join('; '), res.status, json.errors);
57
+ }
58
+ if (!json.data) {
59
+ throw new GameDataError('GAMEDATA_MISSING_DATA', 'GameData response is missing data.');
60
+ }
61
+ return json.data;
62
+ }
63
+ //# sourceMappingURL=gameDataClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gameDataClient.js","sourceRoot":"","sources":["../src/gameDataClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /** GraphQL client for POST /UserConfig. Uses native fetch. */
2
+ import { CliError } from './errors.js';
3
+ export interface GraphQlOptions {
4
+ queryUrl: string;
5
+ k: string;
6
+ scope: string;
7
+ timeoutMs?: number;
8
+ }
9
+ export declare class GraphQlError extends CliError {
10
+ readonly httpCode?: number | undefined;
11
+ readonly graphQlErrors?: unknown[] | undefined;
12
+ constructor(code: string, message: string, httpCode?: number | undefined, graphQlErrors?: unknown[] | undefined, options?: {
13
+ category?: 'authentication' | 'authorization' | 'network' | 'timeout' | 'server' | 'graphql';
14
+ suggestion?: string;
15
+ retryable?: boolean;
16
+ cause?: unknown;
17
+ });
18
+ }
19
+ export interface GraphQlResponse {
20
+ data?: Record<string, unknown>;
21
+ errors?: Array<{
22
+ message: string;
23
+ [key: string]: unknown;
24
+ }>;
25
+ }
26
+ /** Execute a GraphQL query/mutation. */
27
+ export declare function gql<T = Record<string, unknown>>(options: GraphQlOptions, query: string, variables?: Record<string, unknown>): Promise<T>;
28
+ /** Execute a GraphQL mutation — same interface as gql. */
29
+ export declare const mutation: typeof gql;
30
+ /** Validate required config options and return a parsed options object. */
31
+ export declare function buildGqlOptions(): GraphQlOptions;
32
+ //# sourceMappingURL=graphqlClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphqlClient.d.ts","sourceRoot":"","sources":["../src/graphqlClient.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAE9D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAa,SAAQ,QAAQ;aAItB,QAAQ,CAAC,EAAE,MAAM;aACjB,aAAa,CAAC,EAAE,OAAO,EAAE;gBAHzC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACC,QAAQ,CAAC,EAAE,MAAM,YAAA,EACjB,aAAa,CAAC,EAAE,OAAO,EAAE,YAAA,EACzC,OAAO,GAAE;QACP,QAAQ,CAAC,EAAE,gBAAgB,GAAG,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;QAC7F,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,KAAK,CAAC,EAAE,OAAO,CAAC;KACZ;CAcT;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED,wCAAwC;AACxC,wBAAsB,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnD,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,CAAC,CAAC,CAmGZ;AAED,0DAA0D;AAC1D,eAAO,MAAM,QAAQ,YAAM,CAAC;AAE5B,2EAA2E;AAC3E,wBAAgB,eAAe,IAAI,cAAc,CAahD"}
@@ -0,0 +1,106 @@
1
+ /** GraphQL client for POST /UserConfig. Uses native fetch. */
2
+ import { CliError } from './errors.js';
3
+ export class GraphQlError extends CliError {
4
+ httpCode;
5
+ graphQlErrors;
6
+ constructor(code, message, httpCode, graphQlErrors, options = {}) {
7
+ super(code, message, {
8
+ category: options.category ?? 'graphql',
9
+ details: {
10
+ ...(httpCode === undefined ? {} : { httpCode }),
11
+ ...(graphQlErrors === undefined ? {} : { graphQlErrors }),
12
+ },
13
+ suggestion: options.suggestion,
14
+ retryable: options.retryable,
15
+ cause: options.cause,
16
+ });
17
+ this.httpCode = httpCode;
18
+ this.graphQlErrors = graphQlErrors;
19
+ this.name = 'GraphQlError';
20
+ }
21
+ }
22
+ /** Execute a GraphQL query/mutation. */
23
+ export async function gql(options, query, variables) {
24
+ const { queryUrl, k, scope } = options;
25
+ let res;
26
+ const timeoutMs = options.timeoutMs ?? 15_000;
27
+ const controller = new AbortController();
28
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
29
+ try {
30
+ res = await fetch(queryUrl, {
31
+ method: 'POST',
32
+ headers: {
33
+ 'content-type': 'application/json',
34
+ k,
35
+ scope,
36
+ },
37
+ body: JSON.stringify({ query, variables }),
38
+ signal: controller.signal,
39
+ });
40
+ }
41
+ catch (cause) {
42
+ if (cause.name === 'AbortError') {
43
+ throw new GraphQlError('QUERY_TIMEOUT', `UserConfig request timed out after ${timeoutMs} ms.`, undefined, undefined, { category: 'timeout', retryable: true, cause });
44
+ }
45
+ throw new GraphQlError('QUERY_NETWORK_ERROR', `HTTP 请求失败: ${cause.message}`, undefined, undefined, { category: 'network', retryable: true, cause });
46
+ }
47
+ finally {
48
+ clearTimeout(timeout);
49
+ }
50
+ if (!res.ok) {
51
+ const bodyText = await res.text().catch(() => '');
52
+ let httpErrors;
53
+ let httpMessage;
54
+ if (bodyText) {
55
+ try {
56
+ const parsed = JSON.parse(bodyText);
57
+ httpErrors = parsed.errors;
58
+ httpMessage = parsed.errors?.map((entry) => entry.message).join('; ');
59
+ }
60
+ catch {
61
+ // The status and stable code remain sufficient when the body is not JSON.
62
+ }
63
+ }
64
+ if (res.status === 401) {
65
+ throw new GraphQlError('AUTHENTICATION_FAILED', 'AutoNoelle credential is missing, invalid, or expired.', res.status, undefined, {
66
+ category: 'authentication',
67
+ suggestion: 'Provide AUTO_NOELLE_USER_KEY/--k, or login again using runtime credentials.',
68
+ });
69
+ }
70
+ if (res.status === 403) {
71
+ throw new GraphQlError('AUTHORIZATION_DENIED', 'The credential is not allowed to query or update this configuration.', res.status, undefined, { category: 'authorization' });
72
+ }
73
+ throw new GraphQlError(res.status >= 500 ? 'QUERY_SERVER_ERROR' : 'QUERY_HTTP_ERROR', httpMessage || `UserConfig returned HTTP ${res.status}${bodyText ? '.' : ''}`, res.status, httpErrors, { category: res.status >= 500 ? 'server' : 'graphql', retryable: res.status >= 500 });
74
+ }
75
+ let json;
76
+ try {
77
+ json = (await res.json());
78
+ }
79
+ catch {
80
+ throw new GraphQlError('QUERY_INVALID_JSON', 'UserConfig response is not valid JSON.');
81
+ }
82
+ if (json.errors && json.errors.length > 0) {
83
+ const msg = json.errors.map((e) => e.message).join('; ');
84
+ throw new GraphQlError('GRAPHQL_ERROR', msg, res.status, json.errors, { category: 'graphql' });
85
+ }
86
+ if (!json.data) {
87
+ throw new GraphQlError('QUERY_MISSING_DATA', 'UserConfig response is missing data.');
88
+ }
89
+ return json.data;
90
+ }
91
+ /** Execute a GraphQL mutation — same interface as gql. */
92
+ export const mutation = gql;
93
+ /** Validate required config options and return a parsed options object. */
94
+ export function buildGqlOptions() {
95
+ const queryUrl = process.env.AUTO_NOELLE_QUERY_URL || 'https://query.auto.noelle.cool/UserConfig';
96
+ const k = process.env.AUTO_NOELLE_USER_KEY;
97
+ const scope = process.env.AUTO_NOELLE_SCOPE || 'CN';
98
+ if (!k) {
99
+ throw new CliError('CREDENTIAL_REQUIRED', 'Missing AutoNoelle user key.', {
100
+ category: 'authentication',
101
+ suggestion: 'Use --k/AUTO_NOELLE_USER_KEY, or provide runtime login environment variables.',
102
+ });
103
+ }
104
+ return { queryUrl, k, scope, timeoutMs: Number(process.env.AUTO_NOELLE_TIMEOUT_MS ?? 15_000) };
105
+ }
106
+ //# sourceMappingURL=graphqlClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphqlClient.js","sourceRoot":"","sources":["../src/graphqlClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}