agentbox-app 0.1.7 → 0.1.12

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 (255) hide show
  1. package/README.md +220 -58
  2. package/bin/agentbox.mjs +18 -3
  3. package/briefs/message-rules.md +24 -3
  4. package/briefs/worker.md +63 -49
  5. package/briefs/writing-rules.md +90 -131
  6. package/main/account-discovery.mjs +21 -20
  7. package/main/account-tooling.mjs +11 -11
  8. package/main/agent-activity.mjs +45 -5
  9. package/main/agent-schedule.mjs +14 -14
  10. package/main/agent-sessions.mjs +94 -10
  11. package/main/agent-updates.mjs +116 -0
  12. package/main/agents.mjs +52 -46
  13. package/main/analytics.mjs +27 -0
  14. package/main/approval-prompt-server.mjs +2 -2
  15. package/main/approvals.mjs +14 -5
  16. package/main/artifact-path.mjs +11 -0
  17. package/main/claude-bin.mjs +32 -5
  18. package/main/claude-input.mjs +45 -3
  19. package/main/claude-plan.mjs +25 -13
  20. package/main/code-change.mjs +3 -3
  21. package/main/codex-account.mjs +1 -1
  22. package/main/codex-bin.mjs +18 -0
  23. package/main/codex-launch-env.mjs +31 -0
  24. package/main/codex-memory-gate.mjs +260 -0
  25. package/main/codex-models.mjs +12 -7
  26. package/main/codex-threads.mjs +46 -23
  27. package/main/codex-usage-file.mjs +7 -7
  28. package/main/codex-usage.mjs +4 -4
  29. package/main/codex-watch.mjs +12 -12
  30. package/main/config.mjs +82 -17
  31. package/main/demo.mjs +17 -14
  32. package/main/dev-window.mjs +9 -9
  33. package/main/doc-scheme.mjs +2 -0
  34. package/main/engine-setup.mjs +204 -0
  35. package/main/feedback.mjs +55 -0
  36. package/main/folder-pictures.mjs +48 -0
  37. package/main/frame-scrollbars.mjs +90 -0
  38. package/main/fresh-user.mjs +7 -4
  39. package/main/git-change-offthread.mjs +70 -0
  40. package/main/git-change-thread.mjs +11 -0
  41. package/main/git-change.mjs +9 -3
  42. package/main/img-scheme.mjs +70 -1
  43. package/main/instruction-settings.mjs +134 -60
  44. package/main/ipc.mjs +335 -42
  45. package/main/leftovers.mjs +518 -0
  46. package/main/live-replies.mjs +43 -5
  47. package/main/machine.mjs +48 -1
  48. package/main/main.mjs +138 -15
  49. package/main/memory-gate-history.mjs +254 -0
  50. package/main/memory-gate-server.mjs +461 -0
  51. package/main/memory-gate.mjs +206 -0
  52. package/main/message-priority.mjs +87 -0
  53. package/main/notify.mjs +1 -1
  54. package/main/rail-note.mjs +2 -2
  55. package/main/refresh-agent-models.mjs +21 -0
  56. package/main/repeats.mjs +4 -4
  57. package/main/row-label.mjs +115 -51
  58. package/main/runs-on.mjs +93 -0
  59. package/main/serve.mjs +77 -5
  60. package/main/settings.mjs +245 -26
  61. package/main/ship-queue.mjs +279 -0
  62. package/main/sign-in-files.mjs +39 -0
  63. package/main/source-updater.mjs +298 -0
  64. package/main/store/home.mjs +84 -7
  65. package/main/store/project.mjs +15 -19
  66. package/main/store/work-items.mjs +150 -6
  67. package/main/store.mjs +245 -13
  68. package/main/supervisor.mjs +1634 -417
  69. package/main/task-commands.mjs +8 -10
  70. package/main/task-folders.mjs +94 -16
  71. package/main/task-remote-control.mjs +3 -3
  72. package/main/task-terminals.mjs +14 -2
  73. package/main/team/index.mjs +440 -0
  74. package/main/team/memory-cloud.mjs +247 -0
  75. package/main/team/projects.mjs +162 -0
  76. package/main/team/session.mjs +225 -0
  77. package/main/team/sign-in.mjs +106 -0
  78. package/main/team/supabase-backend.mjs +231 -0
  79. package/main/team/sync.mjs +163 -0
  80. package/main/updater.mjs +15 -5
  81. package/main/write-before-reload.mjs +50 -0
  82. package/mcp/core/page.mjs +10 -12
  83. package/mcp/core/work.mjs +123 -26
  84. package/mcp/tools.mjs +13 -6
  85. package/package.json +21 -9
  86. package/renderer/dist/assets/agentbox-icon-F1oN9nj_.svg +15 -0
  87. package/renderer/dist/assets/index-ChKsQkRw.js +1169 -0
  88. package/renderer/dist/assets/index-ClBXnq3B.css +32 -0
  89. package/renderer/dist/index.html +2 -2
  90. package/scripts/after-install.mjs +14 -0
  91. package/scripts/approval-server.sh +7 -2
  92. package/scripts/memory-gate-hook.sh +59 -0
  93. package/shared/agent-import.mjs +39 -16
  94. package/shared/agents.d.mts +26 -8
  95. package/shared/agents.mjs +100 -108
  96. package/shared/analytics-events.mjs +19 -2
  97. package/shared/answers.mjs +12 -0
  98. package/shared/bridge-map.d.mts +12 -0
  99. package/shared/bridge-map.mjs +38 -1
  100. package/shared/claude-commands.generated.mjs +2 -2
  101. package/shared/claude-models.generated.mjs +6 -6
  102. package/shared/claude-usage.mjs +6 -6
  103. package/shared/codex-import.mjs +7 -7
  104. package/shared/codex-modes.d.mts +50 -0
  105. package/shared/codex-modes.mjs +1 -1
  106. package/shared/codex-usage.mjs +7 -8
  107. package/shared/demo-world.mjs +6 -6
  108. package/shared/engines.mjs +27 -10
  109. package/shared/feedback.d.mts +14 -0
  110. package/shared/feedback.mjs +44 -0
  111. package/shared/first-run-examples.mjs +4 -4
  112. package/shared/first-run-practice.d.mts +16 -0
  113. package/shared/first-run-practice.mjs +176 -70
  114. package/shared/fresh-user-home.mjs +34 -4
  115. package/shared/instruction-defaults.json +2 -2
  116. package/shared/product-name.mjs +4 -2
  117. package/shared/project-folder-check.mjs +9 -3
  118. package/shared/rank.d.mts +1 -0
  119. package/shared/rank.mjs +22 -0
  120. package/shared/referenced-files.mjs +1 -1
  121. package/shared/runs-on.d.mts +20 -0
  122. package/shared/runs-on.mjs +79 -0
  123. package/shared/schemes.d.mts +11 -0
  124. package/shared/schemes.mjs +1 -1
  125. package/shared/shortcuts.d.mts +41 -0
  126. package/shared/shortcuts.mjs +236 -0
  127. package/shared/spawn-trouble.d.mts +2 -0
  128. package/shared/spawn-trouble.mjs +40 -19
  129. package/shared/team-rules.d.mts +17 -0
  130. package/shared/team-rules.mjs +230 -0
  131. package/shared/team-status.d.mts +11 -0
  132. package/shared/team-status.mjs +90 -0
  133. package/shared/terminal-links.d.mts +2 -0
  134. package/shared/terminal-links.mjs +55 -0
  135. package/shared/terminal-state.d.mts +1 -0
  136. package/shared/terminal-state.mjs +16 -0
  137. package/shared/thread-cards.d.mts +19 -0
  138. package/shared/thread-cards.mjs +254 -0
  139. package/shared/usage.d.mts +1 -1
  140. package/shared/usage.mjs +6 -7
  141. package/shared/work-items.mjs +258 -28
  142. package/shared/work-lines.mjs +393 -16
  143. package/worker-permissions.json +1 -1
  144. package/renderer/dist/assets/cel-dusk-CS5I7kJS.webp +0 -0
  145. package/renderer/dist/assets/cel-dusk-DUslqS6B.webp +0 -0
  146. package/renderer/dist/assets/cel-dusk-Jt_xVGxp.webp +0 -0
  147. package/renderer/dist/assets/cel-dusk-sm-BBkV-tWT.webp +0 -0
  148. package/renderer/dist/assets/frost-haze-CxPSOBEg.webp +0 -0
  149. package/renderer/dist/assets/frost-haze-sm-C_w21qgd.webp +0 -0
  150. package/renderer/dist/assets/ice-BC8luINc.webp +0 -0
  151. package/renderer/dist/assets/ice-CP9PrKHo.webp +0 -0
  152. package/renderer/dist/assets/ice-river-D6ziOhLY.webp +0 -0
  153. package/renderer/dist/assets/ice-river-UVM2-JY_.webp +0 -0
  154. package/renderer/dist/assets/ice-river-bErJwYWW.webp +0 -0
  155. package/renderer/dist/assets/ice-river-sm-Bg1U-SIj.webp +0 -0
  156. package/renderer/dist/assets/ice-sm-CbVcg3_D.webp +0 -0
  157. package/renderer/dist/assets/index-B7hhfHrT.js +0 -684
  158. package/renderer/dist/assets/index-CwiDv5bL.css +0 -32
  159. package/renderer/dist/assets/lake-C0WaW-6E.webp +0 -0
  160. package/renderer/dist/assets/lake-CSKjLC5K.webp +0 -0
  161. package/renderer/dist/assets/lake-ETGcOb25.webp +0 -0
  162. package/renderer/dist/assets/lake-harbour-BCQRbrHb.webp +0 -0
  163. package/renderer/dist/assets/lake-harbour-B_wfXTmE.webp +0 -0
  164. package/renderer/dist/assets/lake-harbour-Te1pEvBh.webp +0 -0
  165. package/renderer/dist/assets/lake-harbour-sm-Cme_ShEg.webp +0 -0
  166. package/renderer/dist/assets/lake-sm-CbG72Hbv.webp +0 -0
  167. package/renderer/dist/assets/lino-coast-CUZHcucI.webp +0 -0
  168. package/renderer/dist/assets/lino-coast-DP4J7cgd.webp +0 -0
  169. package/renderer/dist/assets/lino-coast-kOIAffr_.webp +0 -0
  170. package/renderer/dist/assets/lino-coast-sm-C1Mdbgit.webp +0 -0
  171. package/renderer/dist/assets/moon-pines-BskgnnXR.webp +0 -0
  172. package/renderer/dist/assets/moon-pines-CFSIIwt0.webp +0 -0
  173. package/renderer/dist/assets/moon-pines-PNhdOYww.webp +0 -0
  174. package/renderer/dist/assets/moon-pines-sm-C6K1NomK.webp +0 -0
  175. package/renderer/dist/assets/orbit-rings-2XV36Ch3.webp +0 -0
  176. package/renderer/dist/assets/orbit-rings-C4NrcYGQ.webp +0 -0
  177. package/renderer/dist/assets/orbit-rings-DGLk07dT.webp +0 -0
  178. package/renderer/dist/assets/orbit-rings-sm-Dky3YdvL.webp +0 -0
  179. package/renderer/dist/assets/peach-haze-2-C6f7xnWw.webp +0 -0
  180. package/renderer/dist/assets/peach-haze-2-sm-Dj_Ez_Sb.webp +0 -0
  181. package/renderer/dist/assets/pixel-harbour-DQjqMROg.webp +0 -0
  182. package/renderer/dist/assets/pixel-harbour-Dw71H_bc.webp +0 -0
  183. package/renderer/dist/assets/pixel-harbour-kOZfm-GM.webp +0 -0
  184. package/renderer/dist/assets/pixel-harbour-sm-Dturjuky.webp +0 -0
  185. package/renderer/dist/assets/pixel-orbit-C296JVMO.webp +0 -0
  186. package/renderer/dist/assets/pixel-orbit-C4oMRDSx.webp +0 -0
  187. package/renderer/dist/assets/pixel-orbit-CqVmQ4eh.webp +0 -0
  188. package/renderer/dist/assets/pixel-orbit-sm-CHagC_nO.webp +0 -0
  189. package/renderer/dist/assets/pixel-ridge-C6LYu6uE.webp +0 -0
  190. package/renderer/dist/assets/pixel-ridge-CIUCEESs.webp +0 -0
  191. package/renderer/dist/assets/pixel-ridge-sm-BnE0F_w-.webp +0 -0
  192. package/renderer/dist/assets/riso-hills-7heKVtry.webp +0 -0
  193. package/renderer/dist/assets/riso-hills-CIjAL3J6.webp +0 -0
  194. package/renderer/dist/assets/riso-hills-sm-DHsnbCfP.webp +0 -0
  195. package/renderer/dist/assets/slate-haze-BPWdkNsw.webp +0 -0
  196. package/renderer/dist/assets/slate-haze-sm-B0Cb5a2W.webp +0 -0
  197. package/renderer/dist/assets/valley-haze-BDHPqoJy.webp +0 -0
  198. package/renderer/dist/assets/valley-haze-sm-CTyjmPAG.webp +0 -0
  199. package/renderer/dist/assets/vector-dunes-DzzWLdKo.webp +0 -0
  200. package/renderer/dist/assets/vector-dunes-Yr9NBQUy.webp +0 -0
  201. package/renderer/dist/assets/vector-dunes-sm-D8MYY6ms.webp +0 -0
  202. package/renderer/dist/assets/watercolour-mist-BCGKN4u4.webp +0 -0
  203. package/renderer/dist/assets/watercolour-mist-BF-jk5MC.webp +0 -0
  204. package/renderer/dist/assets/watercolour-mist-sm-Ds1xzTw9.webp +0 -0
  205. package/renderer/dist/assets/woodblock-sea-B1um67Z9.webp +0 -0
  206. package/renderer/dist/assets/woodblock-sea-DKQdYs32.webp +0 -0
  207. package/renderer/dist/assets/woodblock-sea-sm-BJzNq8xh.webp +0 -0
  208. package/renderer/dist/emulator/audio-rules.mjs +0 -74
  209. package/renderer/dist/emulator/data/compression/README.md +0 -11
  210. package/renderer/dist/emulator/data/compression/extract7z.js +0 -1
  211. package/renderer/dist/emulator/data/compression/extractzip.js +0 -1
  212. package/renderer/dist/emulator/data/compression/libunrar.js +0 -519
  213. package/renderer/dist/emulator/data/compression/libunrar.wasm +0 -0
  214. package/renderer/dist/emulator/data/cores/README.md +0 -22
  215. package/renderer/dist/emulator/data/cores/mgba-legacy-wasm.data +0 -0
  216. package/renderer/dist/emulator/data/cores/mgba-thread-legacy-wasm.data +0 -0
  217. package/renderer/dist/emulator/data/cores/mgba-thread-wasm.data +0 -0
  218. package/renderer/dist/emulator/data/cores/mgba-wasm.data +0 -0
  219. package/renderer/dist/emulator/data/cores/package.json +0 -65
  220. package/renderer/dist/emulator/data/cores/reports/mgba.json +0 -1
  221. package/renderer/dist/emulator/data/emulator.css +0 -1614
  222. package/renderer/dist/emulator/data/loader.js +0 -170
  223. package/renderer/dist/emulator/data/localization/README.md +0 -63
  224. package/renderer/dist/emulator/data/localization/af-FR.json +0 -339
  225. package/renderer/dist/emulator/data/localization/ar-AR.json +0 -301
  226. package/renderer/dist/emulator/data/localization/ben-BEN.json +0 -301
  227. package/renderer/dist/emulator/data/localization/de-GER.json +0 -301
  228. package/renderer/dist/emulator/data/localization/el-GR.json +0 -301
  229. package/renderer/dist/emulator/data/localization/en-US.json +0 -339
  230. package/renderer/dist/emulator/data/localization/es-ES.json +0 -310
  231. package/renderer/dist/emulator/data/localization/fa-AF.json +0 -310
  232. package/renderer/dist/emulator/data/localization/hi-HI.json +0 -301
  233. package/renderer/dist/emulator/data/localization/it-IT.json +0 -302
  234. package/renderer/dist/emulator/data/localization/ja-JA.json +0 -301
  235. package/renderer/dist/emulator/data/localization/jv-JV.json +0 -301
  236. package/renderer/dist/emulator/data/localization/ko-KO.json +0 -336
  237. package/renderer/dist/emulator/data/localization/pt-BR.json +0 -361
  238. package/renderer/dist/emulator/data/localization/retroarch.json +0 -617
  239. package/renderer/dist/emulator/data/localization/ro-RO.json +0 -310
  240. package/renderer/dist/emulator/data/localization/ru-RU.json +0 -301
  241. package/renderer/dist/emulator/data/localization/tr-TR.json +0 -310
  242. package/renderer/dist/emulator/data/localization/vi-VN.json +0 -302
  243. package/renderer/dist/emulator/data/localization/zh-CN.json +0 -351
  244. package/renderer/dist/emulator/data/src/GameManager.js +0 -464
  245. package/renderer/dist/emulator/data/src/compression.js +0 -142
  246. package/renderer/dist/emulator/data/src/emulator.js +0 -6158
  247. package/renderer/dist/emulator/data/src/gamepad.js +0 -167
  248. package/renderer/dist/emulator/data/src/nipplejs.js +0 -1
  249. package/renderer/dist/emulator/data/src/shaders.js +0 -236
  250. package/renderer/dist/emulator/data/src/socket.io.min.js +0 -7
  251. package/renderer/dist/emulator/data/src/storage.js +0 -125
  252. package/renderer/dist/emulator/data/version.json +0 -5
  253. package/renderer/dist/emulator/host.js +0 -299
  254. package/renderer/dist/emulator/index.html +0 -28
  255. package/renderer/dist/emulator/provenance.json +0 -6
@@ -1,464 +0,0 @@
1
- class EJS_GameManager {
2
- constructor(Module, EJS) {
3
- this.EJS = EJS;
4
- this.Module = Module;
5
- this.FS = this.Module.FS;
6
- this.functions = {
7
- restart: this.Module.cwrap("system_restart", "", []),
8
- saveStateInfo: this.Module.cwrap("save_state_info", "string", []),
9
- loadState: this.Module.cwrap("load_state", "number", ["string", "number"]),
10
- screenshot: this.Module.cwrap("cmd_take_screenshot", "", []),
11
- simulateInput: this.Module.cwrap("simulate_input", "null", ["number", "number", "number"]),
12
- toggleMainLoop: this.Module.cwrap("toggleMainLoop", "null", ["number"]),
13
- getCoreOptions: this.Module.cwrap("get_core_options", "string", []),
14
- setVariable: this.Module.cwrap("ejs_set_variable", "null", ["string", "string"]),
15
- setCheat: this.Module.cwrap("set_cheat", "null", ["number", "number", "string"]),
16
- resetCheat: this.Module.cwrap("reset_cheat", "null", []),
17
- toggleShader: this.Module.cwrap("shader_enable", "null", ["number"]),
18
- getDiskCount: this.Module.cwrap("get_disk_count", "number", []),
19
- getCurrentDisk: this.Module.cwrap("get_current_disk", "number", []),
20
- setCurrentDisk: this.Module.cwrap("set_current_disk", "null", ["number"]),
21
- getSaveFilePath: this.Module.cwrap("save_file_path", "string", []),
22
- saveSaveFiles: this.Module.cwrap("cmd_savefiles", "", []),
23
- supportsStates: this.Module.cwrap("supports_states", "number", []),
24
- loadSaveFiles: this.Module.cwrap("refresh_save_files", "null", []),
25
- toggleFastForward: this.Module.cwrap("toggle_fastforward", "null", ["number"]),
26
- setFastForwardRatio: this.Module.cwrap("set_ff_ratio", "null", ["number"]),
27
- toggleRewind: this.Module.cwrap("toggle_rewind", "null", ["number"]),
28
- setRewindGranularity: this.Module.cwrap("set_rewind_granularity", "null", ["number"]),
29
- toggleSlowMotion: this.Module.cwrap("toggle_slow_motion", "null", ["number"]),
30
- setSlowMotionRatio: this.Module.cwrap("set_sm_ratio", "null", ["number"]),
31
- getFrameNum: this.Module.cwrap("get_current_frame_count", "number", [""]),
32
- setVSync: this.Module.cwrap("set_vsync", "null", ["number"]),
33
- setVideoRoation: this.Module.cwrap("set_video_rotation", "null", ["number"]),
34
- getVideoDimensions: this.Module.cwrap("get_video_dimensions", "number", ["string"]),
35
- setKeyboardEnabled: this.Module.cwrap("ejs_set_keyboard_enabled", "null", ["number"])
36
- }
37
-
38
- this.writeFile("/home/web_user/.config/retroarch/retroarch.cfg", this.getRetroArchCfg());
39
-
40
- this.writeConfigFile();
41
- this.initShaders();
42
- this.setupPreLoadSettings();
43
-
44
- this.EJS.on("exit", () => {
45
- if (!this.EJS.failedToStart) {
46
- this.saveSaveFiles();
47
- this.functions.restart();
48
- this.saveSaveFiles();
49
- }
50
- this.toggleMainLoop(0);
51
- this.FS.unmount("/data/saves");
52
- setTimeout(() => {
53
- try {
54
- this.Module.abort();
55
- } catch(e) {
56
- console.warn(e);
57
- };
58
- }, 1000);
59
- })
60
- }
61
- setupPreLoadSettings() {
62
- this.Module.callbacks.setupCoreSettingFile = (filePath) => {
63
- if (this.EJS.debug) console.log("Setting up core settings with path:", filePath);
64
- this.writeFile(filePath, this.EJS.getCoreSettings());
65
- }
66
- }
67
- mountFileSystems() {
68
- return new Promise(async resolve => {
69
- this.mkdir("/data");
70
- this.mkdir("/data/saves");
71
- this.FS.mount(this.FS.filesystems.IDBFS, { autoPersist: true }, "/data/saves");
72
- this.FS.syncfs(true, resolve);
73
- });
74
- }
75
- writeConfigFile() {
76
- if (!this.EJS.defaultCoreOpts.file || !this.EJS.defaultCoreOpts.settings) {
77
- return;
78
- }
79
- let output = "";
80
- for (const k in this.EJS.defaultCoreOpts.settings) {
81
- output += k + ' = "' + this.EJS.defaultCoreOpts.settings[k] + '"\n';
82
- }
83
-
84
- this.writeFile("/home/web_user/retroarch/userdata/config/" + this.EJS.defaultCoreOpts.file, output);
85
- }
86
- loadExternalFiles() {
87
- return new Promise(async (resolve, reject) => {
88
- if (this.EJS.config.externalFiles && this.EJS.config.externalFiles.constructor.name === "Object") {
89
- for (const key in this.EJS.config.externalFiles) {
90
- await new Promise(done => {
91
- this.EJS.downloadFile(this.EJS.config.externalFiles[key], null, true, { responseType: "arraybuffer", method: "GET" }).then(async (res) => {
92
- if (res === -1) {
93
- if (this.EJS.debug) console.warn("Failed to fetch file from '" + this.EJS.config.externalFiles[key] + "'. Make sure the file exists.");
94
- return done();
95
- }
96
- let path = key;
97
- if (key.trim().endsWith("/")) {
98
- const invalidCharacters = /[#<$+%>!`&*'|{}/\\?"=@:^\r\n]/ig;
99
- let name = this.EJS.config.externalFiles[key].split("/").pop().split("#")[0].split("?")[0].replace(invalidCharacters, "").trim();
100
- if (!name) return done();
101
- const files = await this.EJS.checkCompression(new Uint8Array(res.data), this.EJS.localization("Decompress Game Assets"));
102
- if (files["!!notCompressedData"]) {
103
- path += name;
104
- } else {
105
- for (const k in files) {
106
- this.writeFile(path + k, files[k]);
107
- }
108
- return done();
109
- }
110
- }
111
- try {
112
- this.writeFile(path, res.data);
113
- } catch(e) {
114
- if (this.EJS.debug) console.warn("Failed to write file to '" + path + "'. Make sure there are no conflicting files.");
115
- }
116
- done();
117
- });
118
- })
119
- }
120
- }
121
- resolve();
122
- });
123
- }
124
- writeFile(path, data) {
125
- const parts = path.split("/");
126
- let current = "/";
127
- for (let i = 0; i < parts.length - 1; i++) {
128
- if (!parts[i].trim()) continue;
129
- current += parts[i] + "/";
130
- this.mkdir(current);
131
- }
132
- this.FS.writeFile(path, data);
133
- }
134
- mkdir(path) {
135
- try {
136
- this.FS.mkdir(path);
137
- } catch(e) {}
138
- }
139
- getRetroArchCfg() {
140
- let cfg = "autosave_interval = 60\n" +
141
- "screenshot_directory = \"/\"\n" +
142
- "block_sram_overwrite = false\n" +
143
- "video_gpu_screenshot = false\n" +
144
- "audio_latency = 64\n" +
145
- "video_top_portrait_viewport = true\n" +
146
- "video_vsync = true\n" +
147
- "video_smooth = false\n" +
148
- "fastforward_ratio = 3.0\n" +
149
- "slowmotion_ratio = 3.0\n" +
150
- (this.EJS.rewindEnabled ? "rewind_enable = true\n" : "") +
151
- (this.EJS.rewindEnabled ? "rewind_granularity = 6\n" : "") +
152
- "savefile_directory = \"/data/saves\"\n";
153
-
154
- if (this.EJS.retroarchOpts && Array.isArray(this.EJS.retroarchOpts)) {
155
- this.EJS.retroarchOpts.forEach(option => {
156
- let selected = this.EJS.preGetSetting(option.name);
157
- console.log(selected);
158
- if (!selected) {
159
- selected = option.default;
160
- }
161
- const value = option.isString === false ? selected : '"' + selected + '"';
162
- cfg += option.name + " = " + value + "\n"
163
- })
164
- }
165
- return cfg;
166
- }
167
- initShaders() {
168
- if (!this.EJS.config.shaders) return;
169
- this.mkdir("/shader");
170
- for (const shaderFileName in this.EJS.config.shaders) {
171
- const shader = this.EJS.config.shaders[shaderFileName];
172
- if (typeof shader === "string") {
173
- this.FS.writeFile(`/shader/${shaderFileName}`, shader);
174
- }
175
- }
176
- }
177
- clearEJSResetTimer() {
178
- if (this.EJS.resetTimeout) {
179
- clearTimeout(this.EJS.resetTimeout);
180
- delete this.EJS.resetTimeout;
181
- }
182
- }
183
- restart() {
184
- this.clearEJSResetTimer();
185
- this.functions.restart();
186
- }
187
- getState() {
188
- const state = this.functions.saveStateInfo().split("|");
189
- if (state[2] !== "1") {
190
- console.error(state[0]);
191
- throw new Error(state[0]);
192
- }
193
- const size = parseInt(state[0]);
194
- const dataStart = parseInt(state[1]);
195
- const data = this.Module.HEAPU8.subarray(dataStart, dataStart + size);
196
- return new Uint8Array(data);
197
- }
198
- loadState(state) {
199
- try {
200
- this.FS.unlink("game.state");
201
- } catch(e) {}
202
- this.FS.writeFile("/game.state", state);
203
- this.clearEJSResetTimer();
204
- this.functions.loadState("game.state", 0);
205
- setTimeout(() => {
206
- try {
207
- this.FS.unlink("game.state");
208
- } catch(e) {}
209
- }, 5000)
210
- }
211
- screenshot() {
212
- try {
213
- this.FS.unlink("screenshot.png");
214
- } catch(e) {}
215
- this.functions.screenshot();
216
- return new Promise(async resolve => {
217
- while (1) {
218
- try {
219
- this.FS.stat("/screenshot.png");
220
- return resolve(this.FS.readFile("/screenshot.png"));
221
- } catch(e) {}
222
- await new Promise(res => setTimeout(res, 50));
223
- }
224
- })
225
- }
226
- quickSave(slot) {
227
- if (!slot) slot = 1;
228
- let name = slot + "-quick.state";
229
- try {
230
- this.FS.unlink(name);
231
- } catch(e) {}
232
- try {
233
- let data = this.getState();
234
- this.FS.writeFile("/" + name, data);
235
- } catch(e) {
236
- return false;
237
- }
238
- return true;
239
- }
240
- quickLoad(slot) {
241
- if (!slot) slot = 1;
242
- (async () => {
243
- let name = slot + "-quick.state";
244
- this.clearEJSResetTimer();
245
- this.functions.loadState(name, 0);
246
- })();
247
- }
248
- simulateInput(player, index, value) {
249
- if (this.EJS.isNetplay) {
250
- this.EJS.netplay.simulateInput(player, index, value);
251
- return;
252
- }
253
- if ([24, 25, 26, 27, 28, 29].includes(index)) {
254
- if (index === 24 && value === 1) {
255
- const slot = this.EJS.settings["save-state-slot"] ? this.EJS.settings["save-state-slot"] : "1";
256
- if (this.quickSave(slot)) {
257
- this.EJS.displayMessage(this.EJS.localization("SAVED STATE TO SLOT") + " " + slot);
258
- } else {
259
- this.EJS.displayMessage(this.EJS.localization("FAILED TO SAVE STATE"));
260
- }
261
- }
262
- if (index === 25 && value === 1) {
263
- const slot = this.EJS.settings["save-state-slot"] ? this.EJS.settings["save-state-slot"] : "1";
264
- this.quickLoad(slot);
265
- this.EJS.displayMessage(this.EJS.localization("LOADED STATE FROM SLOT") + " " + slot);
266
- }
267
- if (index === 26 && value === 1) {
268
- let newSlot;
269
- try {
270
- newSlot = parseFloat(this.EJS.settings["save-state-slot"] ? this.EJS.settings["save-state-slot"] : "1") + 1;
271
- } catch(e) {
272
- newSlot = 1;
273
- }
274
- if (newSlot > 9) newSlot = 1;
275
- this.EJS.displayMessage(this.EJS.localization("SET SAVE STATE SLOT TO") + " " + newSlot);
276
- this.EJS.changeSettingOption("save-state-slot", newSlot.toString());
277
- }
278
- if (index === 27) {
279
- this.functions.toggleFastForward(this.EJS.isFastForward ? !value : value);
280
- }
281
- if (index === 29) {
282
- this.functions.toggleSlowMotion(this.EJS.isSlowMotion ? !value : value);
283
- }
284
- if (index === 28) {
285
- if (this.EJS.rewindEnabled) {
286
- this.functions.toggleRewind(value);
287
- }
288
- }
289
- return;
290
- }
291
- this.functions.simulateInput(player, index, value);
292
- }
293
- getFileNames() {
294
- if (this.EJS.getCore() === "picodrive") {
295
- return ["bin", "gen", "smd", "md", "32x", "cue", "iso", "sms", "68k", "chd"];
296
- } else {
297
- return ["toc", "ccd", "exe", "pbp", "chd", "img", "bin", "iso"];
298
- }
299
- }
300
- createCueFile(fileNames) {
301
- try {
302
- if (fileNames.length > 1) {
303
- fileNames = fileNames.filter((item) => {
304
- return this.getFileNames().includes(item.split(".").pop().toLowerCase());
305
- })
306
- fileNames = fileNames.sort((a, b) => {
307
- if (isNaN(a.charAt()) || isNaN(b.charAt())) throw new Error("Incorrect file name format");
308
- return (parseInt(a.charAt()) > parseInt(b.charAt())) ? 1 : -1;
309
- })
310
- }
311
- } catch(e) {
312
- if (fileNames.length > 1) {
313
- console.warn("Could not auto-create cue file(s).");
314
- return null;
315
- }
316
- }
317
- for (let i = 0; i < fileNames.length; i++) {
318
- if (fileNames[i].split(".").pop().toLowerCase() === "ccd") {
319
- console.warn("Did not auto-create cue file(s). Found a ccd.");
320
- return null;
321
- }
322
- }
323
- if (fileNames.length === 0) {
324
- console.warn("Could not auto-create cue file(s).");
325
- return null;
326
- }
327
- let baseFileName = fileNames[0].split("/").pop();
328
- if (baseFileName.includes(".")) {
329
- baseFileName = baseFileName.substring(0, baseFileName.length - baseFileName.split(".").pop().length - 1);
330
- }
331
- for (let i = 0; i < fileNames.length; i++) {
332
- const contents = " FILE \"" + fileNames[i] + "\" BINARY\n TRACK 01 MODE1/2352\n INDEX 01 00:00:00";
333
- this.FS.writeFile("/" + baseFileName + "-" + i + ".cue", contents);
334
- }
335
- if (fileNames.length > 1) {
336
- let contents = "";
337
- for (let i = 0; i < fileNames.length; i++) {
338
- contents += "/" + baseFileName + "-" + i + ".cue\n";
339
- }
340
- this.FS.writeFile("/" + baseFileName + ".m3u", contents);
341
- }
342
- return (fileNames.length === 1) ? baseFileName + "-0.cue" : baseFileName + ".m3u";
343
- }
344
- loadPpssppAssets() {
345
- return new Promise(resolve => {
346
- this.EJS.downloadFile("cores/ppsspp-assets.zip", null, false, { responseType: "arraybuffer", method: "GET" }).then((res) => {
347
- this.EJS.checkCompression(new Uint8Array(res.data), this.EJS.localization("Decompress Game Data")).then((pspassets) => {
348
- if (pspassets === -1) {
349
- this.EJS.textElem.innerText = this.localization("Network Error");
350
- this.EJS.textElem.style.color = "red";
351
- return;
352
- }
353
- this.mkdir("/PPSSPP");
354
-
355
- for (const file in pspassets) {
356
- const data = pspassets[file];
357
- const path = "/PPSSPP/" + file;
358
- const paths = path.split("/");
359
- let cp = "";
360
- for (let i = 0; i < paths.length - 1; i++) {
361
- if (paths[i] === "") continue;
362
- cp += "/" + paths[i];
363
- if (!this.FS.analyzePath(cp).exists) {
364
- this.FS.mkdir(cp);
365
- }
366
- }
367
- if (!path.endsWith("/")) {
368
- this.FS.writeFile(path, data);
369
- }
370
- }
371
- resolve();
372
- })
373
- });
374
- })
375
- }
376
- setVSync(enabled) {
377
- this.functions.setVSync(enabled);
378
- }
379
- toggleMainLoop(playing) {
380
- this.functions.toggleMainLoop(playing);
381
- }
382
- getCoreOptions() {
383
- return this.functions.getCoreOptions();
384
- }
385
- setVariable(option, value) {
386
- this.functions.setVariable(option, value);
387
- }
388
- setCheat(index, enabled, code) {
389
- this.functions.setCheat(index, enabled, code);
390
- }
391
- resetCheat() {
392
- this.functions.resetCheat();
393
- }
394
- toggleShader(active) {
395
- this.functions.toggleShader(active);
396
- }
397
- getDiskCount() {
398
- return this.functions.getDiskCount();
399
- }
400
- getCurrentDisk() {
401
- return this.functions.getCurrentDisk();
402
- }
403
- setCurrentDisk(disk) {
404
- this.functions.setCurrentDisk(disk);
405
- }
406
- getSaveFilePath() {
407
- return this.functions.getSaveFilePath();
408
- }
409
- saveSaveFiles() {
410
- this.functions.saveSaveFiles();
411
- this.EJS.callEvent("saveSaveFiles", this.getSaveFile(false));
412
- //this.FS.syncfs(false, () => {});
413
- }
414
- supportsStates() {
415
- return !!this.functions.supportsStates();
416
- }
417
- getSaveFile(save) {
418
- if (save !== false) {
419
- this.saveSaveFiles();
420
- }
421
- const exists = this.FS.analyzePath(this.getSaveFilePath()).exists;
422
- return (exists ? this.FS.readFile(this.getSaveFilePath()) : null);
423
- }
424
- loadSaveFiles() {
425
- this.clearEJSResetTimer();
426
- this.functions.loadSaveFiles();
427
- }
428
- setFastForwardRatio(ratio) {
429
- this.functions.setFastForwardRatio(ratio);
430
- }
431
- toggleFastForward(active) {
432
- this.functions.toggleFastForward(active);
433
- }
434
- setSlowMotionRatio(ratio) {
435
- this.functions.setSlowMotionRatio(ratio);
436
- }
437
- toggleSlowMotion(active) {
438
- this.functions.toggleSlowMotion(active);
439
- }
440
- setRewindGranularity(value) {
441
- this.functions.setRewindGranularity(value);
442
- }
443
- getFrameNum() {
444
- return this.functions.getFrameNum();
445
- }
446
- setVideoRotation(rotation) {
447
- this.functions.setVideoRoation(rotation);
448
- }
449
- getVideoDimensions(type) {
450
- try {
451
- return this.functions.getVideoDimensions(type);
452
- } catch(e) {
453
- console.warn(e);
454
- }
455
- }
456
- setKeyboardEnabled(enabled) {
457
- this.functions.setKeyboardEnabled(enabled === true ? 1 : 0);
458
- }
459
- setAltKeyEnabled(enabled) {
460
- this.functions.setKeyboardEnabled(enabled === true ? 3 : 2);
461
- }
462
- }
463
-
464
- window.EJS_GameManager = EJS_GameManager;
@@ -1,142 +0,0 @@
1
- class EJS_COMPRESSION {
2
- constructor(EJS) {
3
- this.EJS = EJS;
4
- }
5
- isCompressed(data) { //https://www.garykessler.net/library/file_sigs.html
6
- //todo. Use hex instead of numbers
7
- if ((data[0] === 80 && data[1] === 75) && ((data[2] === 3 && data[3] === 4) || (data[2] === 5 && data[3] === 6) || (data[2] === 7 && data[3] === 8))) {
8
- return "zip";
9
- } else if (data[0] === 55 && data[1] === 122 && data[2] === 188 && data[3] === 175 && data[4] === 39 && data[5] === 28) {
10
- return "7z";
11
- } else if ((data[0] === 82 && data[1] === 97 && data[2] === 114 && data[3] === 33 && data[4] === 26 && data[5] === 7) && ((data[6] === 0) || (data[6] === 1 && data[7] == 0))) {
12
- return "rar";
13
- }
14
- return null;
15
- }
16
- decompress(data, updateMsg, fileCbFunc) {
17
- const compressed = this.isCompressed(data.slice(0, 10));
18
- if (compressed === null) {
19
- if (typeof fileCbFunc === "function") {
20
- fileCbFunc("!!notCompressedData", data);
21
- }
22
- return new Promise(resolve => resolve({ "!!notCompressedData": data }));
23
- }
24
- return this.decompressFile(compressed, data, updateMsg, fileCbFunc);
25
- }
26
- getWorkerFile(method) {
27
- return new Promise(async (resolve, reject) => {
28
- let path, obj;
29
- if (method === "7z") {
30
- path = "compression/extract7z.js";
31
- obj = "sevenZip";
32
- } else if (method === "zip") {
33
- path = "compression/extractzip.js";
34
- obj = "zip";
35
- } else if (method === "rar") {
36
- path = "compression/libunrar.js";
37
- obj = "rar";
38
- }
39
- const res = await this.EJS.downloadFile(path, null, false, { responseType: "text", method: "GET" });
40
- if (res === -1) {
41
- this.EJS.startGameError(this.EJS.localization("Network Error"));
42
- return;
43
- }
44
- if (method === "rar") {
45
- const res2 = await this.EJS.downloadFile("compression/libunrar.wasm", null, false, { responseType: "arraybuffer", method: "GET" });
46
- if (res2 === -1) {
47
- this.EJS.startGameError(this.EJS.localization("Network Error"));
48
- return;
49
- }
50
- const path = URL.createObjectURL(new Blob([res2.data], { type: "application/wasm" }));
51
- let script = `
52
- let dataToPass = [];
53
- Module = {
54
- monitorRunDependencies: function(left) {
55
- if (left == 0) {
56
- setTimeout(function() {
57
- unrar(dataToPass, null);
58
- }, 100);
59
- }
60
- },
61
- onRuntimeInitialized: function() {},
62
- locateFile: function(file) {
63
- console.log("locateFile");
64
- return "` + path + `";
65
- }
66
- };
67
- ` + res.data + `
68
- let unrar = function(data, password) {
69
- let cb = function(fileName, fileSize, progress) {
70
- postMessage({ "t": 4, "current": progress, "total": fileSize, "name": fileName });
71
- };
72
- let rarContent = readRARContent(data.map(function(d) {
73
- return {
74
- name: d.name,
75
- content: new Uint8Array(d.content)
76
- }
77
- }), password, cb)
78
- let rec = function(entry) {
79
- if (!entry) return;
80
- if (entry.type === "file") {
81
- postMessage({ "t": 2, "file": entry.fullFileName, "size": entry.fileSize, "data": entry.fileContent });
82
- } else if (entry.type === "dir") {
83
- Object.keys(entry.ls).forEach(function(k) {
84
- rec(entry.ls[k]);
85
- });
86
- } else {
87
- throw "Unknown type";
88
- }
89
- }
90
- rec(rarContent);
91
- postMessage({ "t": 1 });
92
- return rarContent;
93
- };
94
- onmessage = function(data) {
95
- dataToPass.push({ name: "test.rar", content: data.data });
96
- };
97
- `;
98
- const blob = new Blob([script], {
99
- type: "application/javascript"
100
- })
101
- resolve(blob);
102
- } else {
103
- const blob = new Blob([res.data], {
104
- type: "application/javascript"
105
- })
106
- resolve(blob);
107
- }
108
- })
109
- }
110
- decompressFile(method, data, updateMsg, fileCbFunc) {
111
- return new Promise(async callback => {
112
- const file = await this.getWorkerFile(method);
113
- const worker = new Worker(URL.createObjectURL(file));
114
- const files = {};
115
- worker.onmessage = (data) => {
116
- if (!data.data) return;
117
- //data.data.t/ 4=progress, 2 is file, 1 is zip done
118
- if (data.data.t === 4) {
119
- const pg = data.data;
120
- const num = Math.floor(pg.current / pg.total * 100);
121
- if (isNaN(num)) return;
122
- const progress = " " + num.toString() + "%";
123
- updateMsg(progress, true);
124
- }
125
- if (data.data.t === 2) {
126
- if (typeof fileCbFunc === "function") {
127
- fileCbFunc(data.data.file, data.data.data);
128
- files[data.data.file] = true;
129
- } else {
130
- files[data.data.file] = data.data.data;
131
- }
132
- }
133
- if (data.data.t === 1) {
134
- callback(files);
135
- }
136
- }
137
- worker.postMessage(data);
138
- });
139
- }
140
- }
141
-
142
- window.EJS_COMPRESSION = EJS_COMPRESSION;