@maaxyz/maa-node 0.0.1-alpha.1

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 (105) hide show
  1. package/agent/maatouch/universal/maatouch +0 -0
  2. package/agent/minicap/arm64-v8a/bin/minicap +0 -0
  3. package/agent/minicap/arm64-v8a/bin/minicap-nopie +0 -0
  4. package/agent/minicap/arm64-v8a/lib/android-21/minicap.so +0 -0
  5. package/agent/minicap/arm64-v8a/lib/android-22/minicap.so +0 -0
  6. package/agent/minicap/arm64-v8a/lib/android-23/minicap.so +0 -0
  7. package/agent/minicap/arm64-v8a/lib/android-24/minicap.so +0 -0
  8. package/agent/minicap/arm64-v8a/lib/android-25/minicap.so +0 -0
  9. package/agent/minicap/arm64-v8a/lib/android-26/minicap.so +0 -0
  10. package/agent/minicap/arm64-v8a/lib/android-27/minicap.so +0 -0
  11. package/agent/minicap/arm64-v8a/lib/android-28/minicap.so +0 -0
  12. package/agent/minicap/arm64-v8a/lib/android-29/minicap +0 -0
  13. package/agent/minicap/arm64-v8a/lib/android-29/minicap-nopie +0 -0
  14. package/agent/minicap/arm64-v8a/lib/android-29/minicap.so +0 -0
  15. package/agent/minicap/arm64-v8a/lib/android-30/minicap.so +0 -0
  16. package/agent/minicap/arm64-v8a/lib/android-31/minicap.so +0 -0
  17. package/agent/minicap/armeabi-v7a/bin/minicap +0 -0
  18. package/agent/minicap/armeabi-v7a/bin/minicap-nopie +0 -0
  19. package/agent/minicap/armeabi-v7a/lib/android-10/minicap.so +0 -0
  20. package/agent/minicap/armeabi-v7a/lib/android-14/minicap.so +0 -0
  21. package/agent/minicap/armeabi-v7a/lib/android-15/minicap.so +0 -0
  22. package/agent/minicap/armeabi-v7a/lib/android-16/minicap.so +0 -0
  23. package/agent/minicap/armeabi-v7a/lib/android-17/minicap.so +0 -0
  24. package/agent/minicap/armeabi-v7a/lib/android-18/minicap.so +0 -0
  25. package/agent/minicap/armeabi-v7a/lib/android-19/minicap.so +0 -0
  26. package/agent/minicap/armeabi-v7a/lib/android-21/minicap.so +0 -0
  27. package/agent/minicap/armeabi-v7a/lib/android-22/minicap.so +0 -0
  28. package/agent/minicap/armeabi-v7a/lib/android-23/minicap.so +0 -0
  29. package/agent/minicap/armeabi-v7a/lib/android-24/minicap.so +0 -0
  30. package/agent/minicap/armeabi-v7a/lib/android-25/minicap.so +0 -0
  31. package/agent/minicap/armeabi-v7a/lib/android-26/minicap.so +0 -0
  32. package/agent/minicap/armeabi-v7a/lib/android-27/minicap.so +0 -0
  33. package/agent/minicap/armeabi-v7a/lib/android-28/minicap.so +0 -0
  34. package/agent/minicap/armeabi-v7a/lib/android-29/minicap +0 -0
  35. package/agent/minicap/armeabi-v7a/lib/android-29/minicap-nopie +0 -0
  36. package/agent/minicap/armeabi-v7a/lib/android-29/minicap.so +0 -0
  37. package/agent/minicap/armeabi-v7a/lib/android-30/minicap.so +0 -0
  38. package/agent/minicap/armeabi-v7a/lib/android-31/minicap.so +0 -0
  39. package/agent/minicap/armeabi-v7a/lib/android-9/minicap.so +0 -0
  40. package/agent/minicap/x86/bin/minicap +0 -0
  41. package/agent/minicap/x86/bin/minicap-nopie +0 -0
  42. package/agent/minicap/x86/lib/android-14/minicap.so +0 -0
  43. package/agent/minicap/x86/lib/android-15/minicap.so +0 -0
  44. package/agent/minicap/x86/lib/android-16/minicap.so +0 -0
  45. package/agent/minicap/x86/lib/android-17/minicap.so +0 -0
  46. package/agent/minicap/x86/lib/android-18/minicap.so +0 -0
  47. package/agent/minicap/x86/lib/android-19/minicap.so +0 -0
  48. package/agent/minicap/x86/lib/android-21/minicap.so +0 -0
  49. package/agent/minicap/x86/lib/android-22/minicap.so +0 -0
  50. package/agent/minicap/x86/lib/android-23/minicap.so +0 -0
  51. package/agent/minicap/x86/lib/android-24/minicap.so +0 -0
  52. package/agent/minicap/x86/lib/android-25/minicap.so +0 -0
  53. package/agent/minicap/x86/lib/android-26/minicap.so +0 -0
  54. package/agent/minicap/x86/lib/android-27/minicap.so +0 -0
  55. package/agent/minicap/x86/lib/android-28/minicap.so +0 -0
  56. package/agent/minicap/x86/lib/android-29/minicap +0 -0
  57. package/agent/minicap/x86/lib/android-29/minicap-nopie +0 -0
  58. package/agent/minicap/x86/lib/android-29/minicap.so +0 -0
  59. package/agent/minicap/x86/lib/android-31/minicap.so +0 -0
  60. package/agent/minicap/x86_64/bin/minicap +0 -0
  61. package/agent/minicap/x86_64/bin/minicap-nopie +0 -0
  62. package/agent/minicap/x86_64/lib/android-21/minicap.so +0 -0
  63. package/agent/minicap/x86_64/lib/android-22/minicap.so +0 -0
  64. package/agent/minicap/x86_64/lib/android-23/minicap.so +0 -0
  65. package/agent/minicap/x86_64/lib/android-24/minicap.so +0 -0
  66. package/agent/minicap/x86_64/lib/android-25/minicap.so +0 -0
  67. package/agent/minicap/x86_64/lib/android-26/minicap.so +0 -0
  68. package/agent/minicap/x86_64/lib/android-27/minicap.so +0 -0
  69. package/agent/minicap/x86_64/lib/android-28/minicap.so +0 -0
  70. package/agent/minicap/x86_64/lib/android-29/minicap +0 -0
  71. package/agent/minicap/x86_64/lib/android-29/minicap-nopie +0 -0
  72. package/agent/minicap/x86_64/lib/android-29/minicap.so +0 -0
  73. package/agent/minicap/x86_64/lib/android-31/minicap.so +0 -0
  74. package/agent/minitouch/arm64-v8a/minitouch +0 -0
  75. package/agent/minitouch/armeabi/minitouch +0 -0
  76. package/agent/minitouch/armeabi-v7a/minitouch +0 -0
  77. package/agent/minitouch/x86/minitouch +0 -0
  78. package/agent/minitouch/x86_64/minitouch +0 -0
  79. package/dist/context.d.ts +52 -0
  80. package/dist/controller.d.ts +105 -0
  81. package/dist/global.d.ts +10 -0
  82. package/dist/index.d.ts +9 -0
  83. package/dist/index.js +1028 -0
  84. package/dist/job.d.ts +23 -0
  85. package/dist/maa.d.ts +376 -0
  86. package/dist/pi.d.ts +9 -0
  87. package/dist/pipeline.d.ts +249 -0
  88. package/dist/resource.d.ts +36 -0
  89. package/dist/tasker.d.ts +128 -0
  90. package/dist/types.d.ts +27 -0
  91. package/package.json +33 -0
  92. package/scripts/build.mjs +20 -0
  93. package/src/context.ts +78 -0
  94. package/src/controller.ts +366 -0
  95. package/src/global.ts +49 -0
  96. package/src/index.ts +9 -0
  97. package/src/job.ts +68 -0
  98. package/src/maa.d.ts +376 -0
  99. package/src/maa.js +27 -0
  100. package/src/pi.ts +62 -0
  101. package/src/pipeline.ts +694 -0
  102. package/src/resource.ts +173 -0
  103. package/src/tasker.ts +231 -0
  104. package/src/types.ts +31 -0
  105. package/tsconfig.json +9 -0
@@ -0,0 +1,173 @@
1
+ import { Context } from './context'
2
+ import { Job, JobSource } from './job'
3
+ import maa from './maa'
4
+ import {
5
+ CustomActionCallback,
6
+ CustomActionSelf,
7
+ CustomRecognizerCallback,
8
+ CustomRecognizerSelf
9
+ } from './types'
10
+
11
+ export type ResourceNotify = { res_id: maa.ResId; path: string } & (
12
+ | {
13
+ msg: 'StartLoading'
14
+ }
15
+ | {
16
+ msg: 'LoadingCompleted' | 'LoadingFailed'
17
+ hash: string
18
+ }
19
+ )
20
+
21
+ export class ResourceBase {
22
+ handle: maa.ResourceHandle
23
+ #source: JobSource<maa.ResId>
24
+
25
+ notify(message: string, details_json: string): maa.MaybePromise<void> {}
26
+
27
+ set parsed_notify(cb: (msg: ResourceNotify) => maa.MaybePromise<void>) {
28
+ this.notify = (msg, details) => {
29
+ return cb({
30
+ msg: msg.replace(/^Resource\./, '') as any,
31
+ ...JSON.parse(details)
32
+ })
33
+ }
34
+ }
35
+
36
+ constructor(handle: maa.ResourceHandle) {
37
+ this.handle = handle
38
+ this.#source = {
39
+ status: id => maa.resource_status(this.handle, id),
40
+ wait: id => maa.resource_wait(this.handle, id)
41
+ }
42
+ }
43
+
44
+ destroy() {
45
+ maa.resource_destroy(this.handle)
46
+ }
47
+
48
+ set inference_device(id: keyof typeof maa.InferenceDevice | number) {
49
+ if (typeof id === 'string') {
50
+ id = maa.InferenceDevice[id]
51
+ }
52
+ if (!maa.resource_set_option_inference_device(this.handle, id)) {
53
+ throw 'Resource set inference_device failed'
54
+ }
55
+ }
56
+
57
+ set inference_execution_provider(provider: keyof typeof maa.InferenceExecutionProvider) {
58
+ if (
59
+ !maa.resource_set_option_inference_execution_provider(
60
+ this.handle,
61
+ maa.InferenceExecutionProvider[provider]
62
+ )
63
+ ) {
64
+ throw 'Resource set inference_execution_provider failed'
65
+ }
66
+ }
67
+
68
+ register_custom_recognizer(name: string, func: CustomRecognizerCallback) {
69
+ if (
70
+ !maa.resource_register_custom_recognition(
71
+ this.handle,
72
+ name,
73
+ (context, id, task, name, param, image, roi) => {
74
+ const self: CustomRecognizerSelf = {
75
+ context: new Context(context),
76
+ id,
77
+ task,
78
+ name,
79
+ param: JSON.parse(param),
80
+ image,
81
+ roi
82
+ }
83
+ return func.apply(self, [self])
84
+ }
85
+ )
86
+ ) {
87
+ throw 'Resource register_custom_recognition failed'
88
+ }
89
+ }
90
+
91
+ unregister_custom_recognizer(name: string) {
92
+ if (!maa.resource_unregister_custom_recognition(this.handle, name)) {
93
+ throw 'Resource unregister_custom_recognition failed'
94
+ }
95
+ }
96
+
97
+ clear_custom_recognizer() {
98
+ if (!maa.resource_clear_custom_recognition(this.handle)) {
99
+ throw 'Resource clear_custom_recognition failed'
100
+ }
101
+ }
102
+
103
+ register_custom_action(name: string, func: CustomActionCallback) {
104
+ if (
105
+ !maa.resource_register_custom_action(
106
+ this.handle,
107
+ name,
108
+ (context, id, task, name, param, recoId, box) => {
109
+ const self: CustomActionSelf = {
110
+ context: new Context(context),
111
+ id,
112
+ task,
113
+ name,
114
+ param: JSON.parse(param),
115
+ recoId,
116
+ box
117
+ }
118
+ return func.apply(self, [self])
119
+ }
120
+ )
121
+ ) {
122
+ throw 'Resource register_custom_action failed'
123
+ }
124
+ }
125
+
126
+ unregister_custom_action(name: string) {
127
+ if (!maa.resource_unregister_custom_action(this.handle, name)) {
128
+ throw 'Resource unregister_custom_action failed'
129
+ }
130
+ }
131
+
132
+ clear_custom_action() {
133
+ if (!maa.resource_clear_custom_action(this.handle)) {
134
+ throw 'Resource clear_custom_action failed'
135
+ }
136
+ }
137
+
138
+ post_path(path: string) {
139
+ return new Job(this.#source, maa.resource_post_path(this.handle, path))
140
+ }
141
+
142
+ clear() {
143
+ if (!maa.resource_clear(this.handle)) {
144
+ throw 'Resource clear failed'
145
+ }
146
+ }
147
+
148
+ get loaded() {
149
+ return maa.resource_loaded(this.handle)
150
+ }
151
+
152
+ get hash() {
153
+ return maa.resource_get_hash(this.handle)
154
+ }
155
+
156
+ get task_list() {
157
+ return maa.resource_get_task_list(this.handle)
158
+ }
159
+ }
160
+
161
+ export class Resource extends ResourceBase {
162
+ constructor() {
163
+ let ws: WeakRef<this>
164
+ const h = maa.resource_create((message, details_json) => {
165
+ ws.deref()?.notify(message, details_json)
166
+ })
167
+ if (!h) {
168
+ throw 'Resource create failed'
169
+ }
170
+ super(h)
171
+ ws = new WeakRef(this)
172
+ }
173
+ }
package/src/tasker.ts ADDED
@@ -0,0 +1,231 @@
1
+ import { ControllerBase } from './controller'
2
+ import { Job, JobSource } from './job'
3
+ import maa from './maa'
4
+ import { ResourceBase } from './resource'
5
+
6
+ type TaskDetail = ReturnType<TaskerBase['task_detail']>
7
+
8
+ class TaskJob extends Job<maa.TaskId, JobSource<maa.TaskId>> {
9
+ #tasker: TaskerBase
10
+
11
+ constructor(tasker: TaskerBase, source: JobSource<maa.TaskId>, id: maa.TaskId) {
12
+ super(source, id)
13
+
14
+ this.#tasker = tasker
15
+ }
16
+
17
+ get() {
18
+ if (this.done) {
19
+ return this.#tasker.task_detail(this.id)
20
+ } else {
21
+ return null
22
+ }
23
+ }
24
+
25
+ wait() {
26
+ const superPro = super.wait()
27
+ const pro = superPro as typeof superPro & {
28
+ get: () => Promise<TaskDetail>
29
+ }
30
+ pro.get = () => {
31
+ return new Promise(resolve => {
32
+ pro.then(self => {
33
+ resolve(self.get())
34
+ })
35
+ })
36
+ }
37
+ return pro
38
+ }
39
+ }
40
+
41
+ export type TaskerNotify = {
42
+ task_id: maa.TaskId
43
+ entry: string
44
+ hash: string
45
+ uuid: string
46
+ } & (
47
+ | {
48
+ msg: 'Task.Started' | 'Task.Completed' | 'Task.Failed'
49
+ }
50
+ | {
51
+ msg: 'Debug.RecognitionResult' | 'Debug.Hit'
52
+ current: string
53
+ recognition: {
54
+ reco_id: maa.RecoId
55
+ name: string
56
+ /**
57
+ * Won't be `null` for msg `Debug.Hit`
58
+ */
59
+ box: maa.FlatRect | null
60
+ detail: string
61
+ }
62
+ }
63
+ | {
64
+ msg: 'Focus.ReadyToRun' | 'Focus.Completed' | 'Debug.ReadyToRun' | 'Debug.Completed'
65
+ current: string
66
+ node: {
67
+ node_id: maa.NodeId
68
+ name: string
69
+ reco_id: maa.RecoId
70
+ times: number
71
+ completed: boolean
72
+ }
73
+ }
74
+ | {
75
+ msg: 'Debug.ListToRecognize' | 'Debug.MissAll'
76
+ current: string
77
+ list: string[]
78
+ }
79
+ )
80
+
81
+ export class TaskerBase {
82
+ handle: maa.TaskerHandle
83
+ #source: JobSource<maa.TaskId>
84
+
85
+ notify(message: string, details_json: string): maa.MaybePromise<void> {}
86
+
87
+ set parsed_notify(cb: (msg: TaskerNotify) => maa.MaybePromise<void>) {
88
+ this.notify = (msg, details) => {
89
+ return cb({
90
+ msg: msg.replace(/^Task(?:er)?\./, '') as any,
91
+ ...JSON.parse(details)
92
+ })
93
+ }
94
+ }
95
+
96
+ constructor(handle: maa.TaskerHandle) {
97
+ this.handle = handle
98
+ this.#source = {
99
+ status: id => maa.tasker_status(this.handle, id),
100
+ wait: id => maa.tasker_wait(this.handle, id)
101
+ }
102
+ }
103
+
104
+ destroy() {
105
+ maa.tasker_destroy(this.handle)
106
+ }
107
+
108
+ bind(slave: ControllerBase | ResourceBase) {
109
+ let ret: boolean
110
+ if (slave instanceof ControllerBase) {
111
+ ret = maa.tasker_bind_controller(this.handle, slave.handle)
112
+ } else {
113
+ ret = maa.tasker_bind_resource(this.handle, slave.handle)
114
+ }
115
+ if (!ret) {
116
+ throw 'Tasker bind failed'
117
+ }
118
+ }
119
+
120
+ post_pipeline(entry: string, param: Record<string, unknown> = {}) {
121
+ return new TaskJob(
122
+ this,
123
+ this.#source,
124
+ maa.tasker_post_pipeline(this.handle, entry, JSON.stringify(param))
125
+ )
126
+ }
127
+
128
+ get inited() {
129
+ return maa.tasker_inited(this.handle)
130
+ }
131
+
132
+ get running() {
133
+ return maa.tasker_running(this.handle)
134
+ }
135
+
136
+ post_stop() {
137
+ return new TaskJob(
138
+ this,
139
+ this.#source,
140
+ maa.tasker_post_stop(this.handle)
141
+ )
142
+ }
143
+
144
+ get resource() {
145
+ const res = maa.tasker_get_resource(this.handle)
146
+ if (res) {
147
+ return new ResourceBase(res)
148
+ } else {
149
+ return null
150
+ }
151
+ }
152
+
153
+ get controller() {
154
+ const ctrl = maa.tasker_get_controller(this.handle)
155
+ if (ctrl) {
156
+ return new ControllerBase(ctrl)
157
+ } else {
158
+ return null
159
+ }
160
+ }
161
+
162
+ clear_cache() {
163
+ if (!maa.tasker_clear_cache(this.handle)) {
164
+ throw 'Tasker clear_cache failed'
165
+ }
166
+ }
167
+
168
+ recognition_detail(id: maa.RecoId) {
169
+ const dt = maa.tasker_get_recognition_detail(this.handle, id)
170
+ if (dt) {
171
+ const [name, algorithm, hit, box, detail, raw, draws] = dt
172
+ return {
173
+ name,
174
+ algorithm,
175
+ hit,
176
+ box,
177
+ detail,
178
+ raw,
179
+ draws
180
+ }
181
+ } else {
182
+ return null
183
+ }
184
+ }
185
+
186
+ node_detail(id: maa.NodeId) {
187
+ const dt = maa.tasker_get_node_detail(this.handle, id)
188
+ if (dt) {
189
+ const [name, reco_id, completed] = dt
190
+ return {
191
+ name,
192
+ reco: this.recognition_detail(reco_id),
193
+ completed
194
+ }
195
+ } else {
196
+ return null
197
+ }
198
+ }
199
+
200
+ task_detail(id: maa.TaskId) {
201
+ const dt = maa.tasker_get_task_detail(this.handle, id)
202
+ if (dt) {
203
+ const [entry, node_ids, status] = dt
204
+ return {
205
+ entry,
206
+ nodes: node_ids.map(i => this.node_detail(i)),
207
+ status
208
+ }
209
+ } else {
210
+ return null
211
+ }
212
+ }
213
+
214
+ latest_node(task: string) {
215
+ return maa.tasker_get_latest_node(this.handle, task)
216
+ }
217
+ }
218
+
219
+ export class Tasker extends TaskerBase {
220
+ constructor() {
221
+ let ws: WeakRef<this>
222
+ const h = maa.tasker_create((message, details_json) => {
223
+ ws.deref()?.notify(message, details_json)
224
+ })
225
+ if (!h) {
226
+ throw 'Tasker create failed'
227
+ }
228
+ super(h)
229
+ ws = new WeakRef(this)
230
+ }
231
+ }
package/src/types.ts ADDED
@@ -0,0 +1,31 @@
1
+ import { Context } from './context'
2
+ import maa from './maa'
3
+
4
+ export interface CustomRecognizerSelf {
5
+ context: Context
6
+ id: maa.TaskId
7
+ task: string
8
+ name: string
9
+ param: unknown
10
+ image: maa.ImageData
11
+ roi: maa.Rect
12
+ }
13
+
14
+ export interface CustomActionSelf {
15
+ context: Context
16
+ id: maa.TaskId
17
+ task: string
18
+ name: string
19
+ param: unknown
20
+ recoId: maa.RecoId
21
+ box: maa.Rect
22
+ }
23
+
24
+ type CustomCallback<Self, Ret> = (this: Self, self: Self) => maa.MaybePromise<Ret>
25
+
26
+ export type CustomRecognizerCallback = CustomCallback<
27
+ CustomRecognizerSelf,
28
+ [out_box: maa.Rect, out_detail: string] | null
29
+ >
30
+
31
+ export type CustomActionCallback = CustomCallback<CustomActionSelf, boolean>
package/tsconfig.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "@tsconfig/node20/tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "declaration": true,
6
+ "emitDeclarationOnly": true
7
+ },
8
+ "include": ["src/**/*.ts"]
9
+ }