pinokiod 3.9.0 → 3.9.2

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 (118) hide show
  1. package/kernel/api/filepicker/index.js +59 -0
  2. package/kernel/api/fs/index.js +6 -4
  3. package/kernel/api/index.js +123 -37
  4. package/kernel/api/input/index.js +2 -0
  5. package/kernel/api/web/index.js +6 -0
  6. package/kernel/bin/caddy.js +127 -0
  7. package/kernel/bin/cloudflared.js +1 -0
  8. package/kernel/bin/conda.js +10 -2
  9. package/kernel/bin/cuda.js +0 -16
  10. package/kernel/bin/ffmpeg.js +4 -6
  11. package/kernel/bin/git.js +55 -29
  12. package/kernel/bin/gxx.js +8 -6
  13. package/kernel/bin/huggingface.js +4 -5
  14. package/kernel/bin/index.js +347 -88
  15. package/kernel/bin/node.js +13 -6
  16. package/kernel/bin/py.js +1 -1
  17. package/kernel/bin/setup.js +146 -0
  18. package/kernel/bin/uv.js +4 -5
  19. package/kernel/bin/zip.js +7 -8
  20. package/kernel/connect/index.js +25 -0
  21. package/kernel/connect/providers/github/README.md +11 -0
  22. package/kernel/connect/providers/x/README.md +96 -0
  23. package/kernel/connect/providers/x/index.js +152 -0
  24. package/kernel/environment.js +50 -1
  25. package/kernel/index.js +152 -32
  26. package/kernel/info.js +4 -2
  27. package/kernel/kv.js +38 -0
  28. package/kernel/loader.js +13 -3
  29. package/kernel/peer.js +161 -0
  30. package/kernel/procs.js +116 -0
  31. package/kernel/prototype.js +62 -0
  32. package/kernel/router/common.js +42 -0
  33. package/kernel/router/connector.js +81 -0
  34. package/kernel/router/index.js +235 -0
  35. package/kernel/router/localhost_home_router.js +84 -0
  36. package/kernel/router/localhost_port_router.js +15 -0
  37. package/kernel/router/localhost_variable_router.js +37 -0
  38. package/kernel/router/peer_home_router.js +15 -0
  39. package/kernel/router/peer_peer_router.js +26 -0
  40. package/kernel/router/peer_port_router.js +45 -0
  41. package/kernel/router/peer_variable_router.js +46 -0
  42. package/kernel/router/processor.js +31 -0
  43. package/kernel/shell.js +141 -60
  44. package/kernel/shells.js +32 -17
  45. package/kernel/store.js +58 -0
  46. package/kernel/sysinfo.js +0 -1
  47. package/kernel/util.js +143 -36
  48. package/package.json +4 -1
  49. package/pipe/index.js +0 -2
  50. package/script/index.js +12 -0
  51. package/server/index.js +1473 -553
  52. package/server/public/Socket.js +5 -1
  53. package/server/public/SourceCodePro-Regular.ttf +0 -0
  54. package/server/public/SpaceMono-Bold.ttf +0 -0
  55. package/server/public/SpaceMono-BoldItalic.ttf +0 -0
  56. package/server/public/SpaceMono-Italic.ttf +0 -0
  57. package/server/public/SpaceMono-Regular.ttf +0 -0
  58. package/server/public/commander.js +40 -0
  59. package/server/public/common.js +60 -0
  60. package/server/public/dropzone-min.js +2 -0
  61. package/server/public/dropzone.css +1 -0
  62. package/server/public/filepond-plugin-file-validate-type.min.js +9 -0
  63. package/server/public/filepond-plugin-image-crop.min.js +9 -0
  64. package/server/public/filepond-plugin-image-edit.min.css +8 -0
  65. package/server/public/filepond-plugin-image-edit.min.js +9 -0
  66. package/server/public/filepond-plugin-image-exif-orientation.min.js +9 -0
  67. package/server/public/filepond-plugin-image-preview.min.css +8 -0
  68. package/server/public/filepond-plugin-image-preview.min.js +9 -0
  69. package/server/public/filepond-plugin-image-resize.min.js +9 -0
  70. package/server/public/filepond-plugin-image-transform.min.js +9 -0
  71. package/server/public/filepond.min.css +8 -0
  72. package/server/public/filepond.min.js +9 -0
  73. package/server/public/fscreator.js +174 -0
  74. package/server/public/fseditor.js +212 -0
  75. package/server/public/github.png +0 -0
  76. package/server/public/highlight-js.js +81 -0
  77. package/server/public/highlight.css +9 -0
  78. package/server/public/highlight.js +1244 -0
  79. package/server/public/install.js +17 -20
  80. package/server/public/modalinput.js +105 -9
  81. package/server/public/opener.js +3 -1
  82. package/server/public/pinokio-black.png +0 -0
  83. package/server/public/pinokio-black2.png +0 -0
  84. package/server/public/redoc.standalone.js +1832 -0
  85. package/server/public/style.css +211 -17
  86. package/server/public/swagger-ui-bundle.js +2 -0
  87. package/server/public/swagger-ui.css +3 -0
  88. package/server/public/x.js +63 -0
  89. package/server/socket.js +136 -39
  90. package/server/views/404.ejs +0 -1
  91. package/server/views/app.ejs +356 -90
  92. package/server/views/bootstrap.ejs +22 -19
  93. package/server/views/connect/x.ejs +324 -0
  94. package/server/views/connect.ejs +197 -0
  95. package/server/views/download.ejs +7 -1
  96. package/server/views/editor.ejs +68 -9
  97. package/server/views/explore.ejs +13 -10
  98. package/server/views/file_explorer.ejs +10 -37
  99. package/server/views/github.ejs +218 -0
  100. package/server/views/help.ejs +4 -3
  101. package/server/views/index.ejs +268 -118
  102. package/server/views/install.ejs +56 -29
  103. package/server/views/keys.ejs +276 -0
  104. package/server/views/network.ejs +889 -0
  105. package/server/views/partials/dynamic.ejs +9 -0
  106. package/server/views/partials/menu.ejs +7 -1
  107. package/server/views/prototype/index.ejs +311 -0
  108. package/server/views/prototype/show.ejs +383 -0
  109. package/server/views/redoc.ejs +18 -0
  110. package/server/views/required_env_editor.ejs +11 -2
  111. package/server/views/settings.ejs +38 -10
  112. package/server/views/setup.ejs +254 -0
  113. package/server/views/setup_home.ejs +192 -0
  114. package/server/views/shell.ejs +781 -0
  115. package/server/views/swaggerui.ejs +19 -0
  116. package/server/views/terminal.ejs +174 -42
  117. package/LICENSE +0 -7
  118. package/server/views/proxy.ejs +0 -405
@@ -109,26 +109,23 @@ const install = async (name, url, term, socket, options) => {
109
109
 
110
110
  }
111
111
  }
112
- const createTerm = () => {
113
- const term = new Terminal({
114
- //theme: xtermTheme.Piatto_Light,
115
- //theme: xtermTheme.Github,
116
- //theme: xtermTheme.Cobalt_Neon, // top legibility
117
- //theme: xtermTheme.Duotone_Dark,
118
- theme: xtermTheme.FrontEndDelight,
119
- //theme: xtermTheme.Seafoam_Pastel,
120
- //theme: xtermTheme.IC_Green_PPL,
121
- //theme: xtermTheme.FunForrest,
122
- //theme: xtermTheme.Jackie_Brown,
123
- //theme: xtermTheme.Ocean,
124
-
125
- //theme: xtermTheme.Blazer,
126
- //theme: xtermTheme.BirdsOfParadise,
127
- //theme: xtermTheme.AtelierSulphurpool,
128
- //theme: xtermTheme.Borland,
129
- rows: 20,
130
- fontSize: 12
131
- });
112
+ const createTerm = async (_theme) => {
113
+ const theme = Object.assign({ }, _theme, {
114
+ selectionBackground: "red",
115
+ selectionForeground: "white"
116
+ })
117
+ let config = {
118
+ scrollback: 9999999,
119
+ fontSize: 14,
120
+ theme,
121
+ }
122
+ let res = await fetch("/xterm_config").then((res) => {
123
+ return res.json()
124
+ })
125
+ if (res && res.config) {
126
+ config = res.config
127
+ }
128
+ const term = new Terminal(config)
132
129
  const fitAddon = new FitAddon.FitAddon();
133
130
  term.loadAddon(fitAddon);
134
131
  term.loadAddon(new WebLinksAddon.WebLinksAddon());
@@ -1,4 +1,4 @@
1
- const ModalInput = async (params) => {
1
+ const ModalInput = async (params, uri) => {
2
2
  /*
3
3
  {
4
4
  title,
@@ -15,23 +15,32 @@ const ModalInput = async (params) => {
15
15
  }
16
16
  */
17
17
  let form = params.form || []
18
+ let dropzones = []
18
19
  let description = (params.description ? `<div class='desc'>${params.description}</div>` : "")
19
20
  let result = await Swal.fire({
20
21
  title: (params.title || ""),
21
22
  html: description + form.map((field) => {
22
23
  let type = (field.type ? field.type : "text")
24
+ let autofocus = (field.autofocus ? "autofocus" : "")
23
25
  let input
24
26
  if (type === 'textarea') {
25
- input = `<textarea oninput="autoExpand(this)" data-id="${field.key}" class="swal2-input" placeholder="${field.placeholder ? field.placeholder : ''}"></textarea>`
27
+ input = `<textarea ${autofocus} oninput="autoExpand(this)" data-id="${field.key}" class="swal2-input" placeholder="${field.placeholder ? field.placeholder : ''}"></textarea>`
26
28
  } else if (type === 'select') {
27
29
  if (field.items && Array.isArray(field.items)) {
28
30
  let items = field.items.map((item) => {
29
- return `<option value="${item}">${item}</option>`
31
+ if (typeof item === "object" && item.value && item.text) {
32
+ return `<option value="${item.value}">${item.text}</option>`
33
+ } else {
34
+ return `<option value="${item}">${item}</option>`
35
+ }
30
36
  }).join("")
31
- input = `<select>${items}</select>`
37
+ input = `<select data-id="${field.key}">${items}</select>`
32
38
  }
39
+ } else if (type === 'file') {
40
+ input = `<div class='dropzone' data-type='file' data-id='${field.key}'></div>`
41
+ //input = `<input type='file' data-id="${field.key}" />`
33
42
  } else {
34
- input = `<input type='${type}' data-id="${field.key}" class="swal2-input" placeholder="${field.placeholder ? field.placeholder : ''}">`
43
+ input = `<input ${autofocus} type='${type}' data-id="${field.key}" class="swal2-input" placeholder="${field.placeholder ? field.placeholder : ''}">`
35
44
  }
36
45
  return [
37
46
  "<div class='field'>",
@@ -43,6 +52,22 @@ const ModalInput = async (params) => {
43
52
  }).join("\n"),
44
53
  //focusConfirm: false,
45
54
  confirmButtonText: 'Done',
55
+ didRender: () => {
56
+ Swal.getPopup().querySelectorAll('[data-type=file]').forEach((el, index) => {
57
+ const dz = new Dropzone(el, {
58
+ url: '/no-op', // dummy, not used
59
+ autoProcessQueue: false,
60
+ uploadMultiple: false,
61
+ maxFiles: 1,
62
+ addRemoveLinks: true,
63
+ dictDefaultMessage: "Drag and drop or click to upload a file",
64
+ init: function () {
65
+ console.log(`Dropzone ${index + 1} ready`);
66
+ }
67
+ });
68
+ dropzones.push(dz);
69
+ });
70
+ },
46
71
  didOpen: () => {
47
72
  for(let field of form) {
48
73
  if (field.default) {
@@ -53,14 +78,85 @@ const ModalInput = async (params) => {
53
78
  }
54
79
  document.querySelector(".swal2-confirm").blur()
55
80
  },
56
- preConfirm: () => {
81
+ preConfirm: async () => {
57
82
  let response = {}
83
+ let buffer_response = {}
58
84
  for(let field of form) {
59
- debugger
60
85
  let input = Swal.getPopup().querySelector("[data-id='" + field.key + "']")
61
- response[field.key] = input.value
86
+ let type = input.getAttribute("data-type")
87
+ if (type !== 'file') {
88
+ response[field.key] = input.value
89
+ }
90
+
91
+ // let type = input.getAttribute("type")
92
+ // if (type === 'file') {
93
+ // const file = input.files[0];
94
+ // const reader = new FileReader();
95
+ // let buffer = await new Promise((resolve, reject) => {
96
+ // reader.onload = () => {
97
+ // resolve(new Uint8Array(reader.result))
98
+ // };
99
+ // reader.readAsArrayBuffer(file);
100
+ // })
101
+ // buffer_response[field.key] = buffer
102
+ // } else {
103
+ // response[field.key] = input.value
104
+ // }
105
+ }
106
+
107
+
108
+ for(let dz of dropzones) {
109
+ const id = dz.element.getAttribute("data-id");
110
+ const fileList = dz.getAcceptedFiles(); // array of File
111
+ const file = fileList[0]; // actual File object (like from <input>)
112
+ let buffer = await new Promise((resolve, reject) => {
113
+ const reader = new FileReader();
114
+ reader.onload = () => {
115
+ resolve(new Uint8Array(reader.result))
116
+ };
117
+ reader.readAsArrayBuffer(file);
118
+ })
119
+ buffer_response[id] = buffer
120
+ }
121
+
122
+
123
+ if (Object.keys(buffer_response).length > 0) {
124
+
125
+
126
+ const fileKeys = Object.keys(buffer_response);
127
+ const metadata = {
128
+ uri,
129
+ response,
130
+ buffer_keys: fileKeys
131
+ };
132
+
133
+ const metaJson = JSON.stringify(metadata);
134
+ const metaBuffer = new TextEncoder().encode(metaJson);
135
+ const separator = new Uint8Array([0]);
136
+
137
+ const parts = [metaBuffer, separator];
138
+
139
+ for (const key of fileKeys) {
140
+ const buf = buffer_response[key];
141
+ const lenBytes = new Uint8Array(4);
142
+ new DataView(lenBytes.buffer).setUint32(0, buf.byteLength); // big-endian length
143
+ parts.push(lenBytes, new Uint8Array(buf));
144
+ }
145
+
146
+ // Calculate total length
147
+ const totalLen = parts.reduce((sum, part) => sum + part.length, 0);
148
+ const combined = new Uint8Array(totalLen);
149
+
150
+ let offset = 0;
151
+ for (const part of parts) {
152
+ combined.set(part, offset);
153
+ offset += part.length;
154
+ }
155
+
156
+ return combined.buffer
157
+ } else {
158
+ return response
62
159
  }
63
- return response
64
160
  }
65
161
  })
66
162
  if (result) {
@@ -9,13 +9,15 @@ document.addEventListener("click", async (e) => {
9
9
  }
10
10
  if (el) {
11
11
  let filepath = el.getAttribute("data-filepath")
12
+ let command = el.getAttribute("data-command")
12
13
  await fetch("/openfs", {
13
14
  method: "post",
14
15
  headers: {
15
16
  "Content-Type": "application/json"
16
17
  },
17
18
  body: JSON.stringify({
18
- path: filepath
19
+ path: filepath,
20
+ command
19
21
  })
20
22
  }).then((res) => {
21
23
  return res.json()
Binary file
Binary file