qubicl-cli 0.1.0-dev.0 → 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 (91) hide show
  1. package/README.md +46 -21
  2. package/dist/SBOM.spdx.json +222 -0
  3. package/dist/THIRD_PARTY_NOTICES.txt +244 -0
  4. package/dist/assets/chromium-seccomp.json +181 -0
  5. package/dist/assets/computer/BROWSER_SKILLS_THIRD_PARTY_NOTICES.txt +23 -0
  6. package/dist/assets/computer/Dockerfile +191 -49
  7. package/dist/assets/computer/PLAYWRIGHT_THIRD_PARTY_NOTICES.txt +217 -0
  8. package/dist/assets/computer/SKILLS_THIRD_PARTY_NOTICES.txt +29 -0
  9. package/dist/assets/computer/THIRD_PARTY_NOTICES.txt +28 -0
  10. package/dist/assets/computer/WEB_THIRD_PARTY_NOTICES.txt +42 -0
  11. package/dist/assets/computer/browser-skills-requirements.txt +12 -0
  12. package/dist/assets/computer/chromium-wrapper.sh +12 -0
  13. package/dist/assets/computer/control.mjs +112 -52
  14. package/dist/assets/computer/entrypoint.sh +272 -35
  15. package/dist/assets/computer/libreoffice-registrymodifications.xcu +8 -0
  16. package/dist/assets/computer/manifests/browser.json +72 -0
  17. package/dist/assets/computer/manifests/computer.json +76 -0
  18. package/dist/assets/computer/manifests/file-system.json +42 -0
  19. package/dist/assets/computer/manifests/workstation.json +78 -0
  20. package/dist/assets/computer/node_modules/playwright-core/LICENSE +202 -0
  21. package/dist/assets/computer/node_modules/playwright-core/NOTICE +5 -0
  22. package/dist/assets/computer/node_modules/playwright-core/ThirdPartyNotices.txt +13 -0
  23. package/dist/assets/computer/node_modules/playwright-core/browsers.json +75 -0
  24. package/dist/assets/computer/node_modules/playwright-core/index.js +17 -0
  25. package/dist/assets/computer/node_modules/playwright-core/index.mjs +28 -0
  26. package/dist/assets/computer/node_modules/playwright-core/lib/bootstrap.js +88 -0
  27. package/dist/assets/computer/node_modules/playwright-core/lib/coreBundle.js +74830 -0
  28. package/dist/assets/computer/node_modules/playwright-core/lib/utilsBundle.js +90764 -0
  29. package/dist/assets/computer/node_modules/playwright-core/lib/utilsBundle.js.LICENSE +2179 -0
  30. package/dist/assets/computer/node_modules/playwright-core/lib/webp_codec.LICENSE +173 -0
  31. package/dist/assets/computer/node_modules/playwright-core/lib/webp_codec.wasm +0 -0
  32. package/dist/assets/computer/node_modules/playwright-core/lib/xdg-open +1267 -0
  33. package/dist/assets/computer/node_modules/playwright-core/package.json +34 -0
  34. package/dist/assets/computer/skills/core/docx/LICENSE +21 -0
  35. package/dist/assets/computer/skills/core/docx/SKILL.md +21 -0
  36. package/dist/assets/computer/skills/core/docx/references/revisions-and-comments.md +88 -0
  37. package/dist/assets/computer/skills/core/docx/scripts/docx_comments.py +289 -0
  38. package/dist/assets/computer/skills/core/docx/scripts/docx_common.py +94 -0
  39. package/dist/assets/computer/skills/core/docx/scripts/docx_create.py +177 -0
  40. package/dist/assets/computer/skills/core/docx/scripts/docx_edit.py +250 -0
  41. package/dist/assets/computer/skills/core/docx/scripts/docx_read.py +149 -0
  42. package/dist/assets/computer/skills/core/docx/scripts/docx_revisions.py +147 -0
  43. package/dist/assets/computer/skills/core/docx/scripts/docx_template.py +70 -0
  44. package/dist/assets/computer/skills/core/docx/scripts/docx_validate.py +156 -0
  45. package/dist/assets/computer/skills/core/ocr-and-documents/LICENSE +21 -0
  46. package/dist/assets/computer/skills/core/ocr-and-documents/SKILL.md +24 -0
  47. package/dist/assets/computer/skills/core/ocr-and-documents/scripts/ocr_document.py +132 -0
  48. package/dist/assets/computer/skills/core/pdf/LICENSE +21 -0
  49. package/dist/assets/computer/skills/core/pdf/SKILL.md +25 -0
  50. package/dist/assets/computer/skills/core/pdf/references/forms.md +100 -0
  51. package/dist/assets/computer/skills/core/pdf/scripts/_raster.py +76 -0
  52. package/dist/assets/computer/skills/core/pdf/scripts/pdf_create.py +130 -0
  53. package/dist/assets/computer/skills/core/pdf/scripts/pdf_fill_form.py +97 -0
  54. package/dist/assets/computer/skills/core/pdf/scripts/pdf_form_layout.py +168 -0
  55. package/dist/assets/computer/skills/core/pdf/scripts/pdf_make_form.py +145 -0
  56. package/dist/assets/computer/skills/core/pdf/scripts/pdf_merge.py +50 -0
  57. package/dist/assets/computer/skills/core/pdf/scripts/pdf_meta.py +115 -0
  58. package/dist/assets/computer/skills/core/pdf/scripts/pdf_page_image.py +99 -0
  59. package/dist/assets/computer/skills/core/pdf/scripts/pdf_read.py +153 -0
  60. package/dist/assets/computer/skills/core/pdf/scripts/pdf_secure.py +71 -0
  61. package/dist/assets/computer/skills/core/pdf/scripts/pdf_split.py +84 -0
  62. package/dist/assets/computer/skills/core/pdf/scripts/pdf_stamp.py +143 -0
  63. package/dist/assets/computer/skills/core/pdf/scripts/pdf_watermark.py +51 -0
  64. package/dist/assets/computer/skills/core/plan/LICENSE +21 -0
  65. package/dist/assets/computer/skills/core/plan/SKILL.md +21 -0
  66. package/dist/assets/computer/skills/core/powerpoint/LICENSE +21 -0
  67. package/dist/assets/computer/skills/core/powerpoint/SKILL.md +18 -0
  68. package/dist/assets/computer/skills/core/powerpoint/scripts/pptx_create.py +214 -0
  69. package/dist/assets/computer/skills/core/powerpoint/scripts/pptx_edit.py +436 -0
  70. package/dist/assets/computer/skills/core/powerpoint/scripts/pptx_from_template.py +88 -0
  71. package/dist/assets/computer/skills/core/powerpoint/scripts/pptx_read.py +131 -0
  72. package/dist/assets/computer/skills/core/powerpoint/scripts/pptx_render.py +93 -0
  73. package/dist/assets/computer/skills/core/xlsx/LICENSE +21 -0
  74. package/dist/assets/computer/skills/core/xlsx/SKILL.md +22 -0
  75. package/dist/assets/computer/skills/core/xlsx/references/restructuring.md +71 -0
  76. package/dist/assets/computer/skills/core/xlsx/scripts/csv_to_xlsx.py +104 -0
  77. package/dist/assets/computer/skills/core/xlsx/scripts/xlsx_create.py +259 -0
  78. package/dist/assets/computer/skills/core/xlsx/scripts/xlsx_edit.py +263 -0
  79. package/dist/assets/computer/skills/core/xlsx/scripts/xlsx_read.py +160 -0
  80. package/dist/assets/computer/skills/core/xlsx/scripts/xlsx_recalc.py +110 -0
  81. package/dist/assets/computer/skills/core/xlsx/scripts/xlsx_restructure.py +337 -0
  82. package/dist/assets/computer/skills/core/xlsx/scripts/xlsx_to_csv.py +69 -0
  83. package/dist/assets/computer/skills/core-catalog.json +246 -0
  84. package/dist/assets/computer/skills-requirements.txt +18 -0
  85. package/dist/assets/computer/web-provider.py +592 -0
  86. package/dist/assets/computer/web-requirements.txt +37 -0
  87. package/dist/assets/gateway/Dockerfile +3 -1
  88. package/dist/assets/gateway/gateway.mjs +69 -40
  89. package/dist/assets/image-catalog.json +183 -0
  90. package/dist/qubicl.mjs +297 -167
  91. package/package.json +7 -7
@@ -0,0 +1,181 @@
1
+ {
2
+ "defaultAction": "SCMP_ACT_ERRNO",
3
+ "defaultErrnoRet": 1,
4
+ "archMap": [
5
+ { "architecture": "SCMP_ARCH_X86_64", "subArchitectures": ["SCMP_ARCH_X86", "SCMP_ARCH_X32"] },
6
+ { "architecture": "SCMP_ARCH_AARCH64", "subArchitectures": ["SCMP_ARCH_ARM"] },
7
+ { "architecture": "SCMP_ARCH_MIPS64", "subArchitectures": ["SCMP_ARCH_MIPS", "SCMP_ARCH_MIPS64N32"] },
8
+ { "architecture": "SCMP_ARCH_MIPS64N32", "subArchitectures": ["SCMP_ARCH_MIPS", "SCMP_ARCH_MIPS64"] },
9
+ { "architecture": "SCMP_ARCH_MIPSEL64", "subArchitectures": ["SCMP_ARCH_MIPSEL", "SCMP_ARCH_MIPSEL64N32"] },
10
+ { "architecture": "SCMP_ARCH_MIPSEL64N32", "subArchitectures": ["SCMP_ARCH_MIPSEL", "SCMP_ARCH_MIPSEL64"] },
11
+ { "architecture": "SCMP_ARCH_S390X", "subArchitectures": ["SCMP_ARCH_S390"] },
12
+ { "architecture": "SCMP_ARCH_RISCV64", "subArchitectures": null }
13
+ ],
14
+ "syscalls": [
15
+ {
16
+ "names": [
17
+ "accept", "accept4", "access", "adjtimex", "alarm", "bind", "brk", "capget", "capset",
18
+ "chdir", "chmod", "chown", "chown32", "clock_adjtime", "clock_adjtime64", "clock_getres",
19
+ "clock_getres_time64", "clock_gettime", "clock_gettime64", "clock_nanosleep", "clock_nanosleep_time64",
20
+ "close", "close_range", "connect", "copy_file_range", "creat", "dup", "dup2", "dup3", "epoll_create",
21
+ "epoll_create1", "epoll_ctl", "epoll_ctl_old", "epoll_pwait", "epoll_pwait2", "epoll_wait", "epoll_wait_old",
22
+ "eventfd", "eventfd2", "execve", "execveat", "exit", "exit_group", "faccessat", "faccessat2", "fadvise64",
23
+ "fadvise64_64", "fallocate", "fanotify_mark", "fchdir", "fchmod", "fchmodat", "fchown",
24
+ "fchown32", "fchownat", "fcntl", "fcntl64", "fdatasync", "fgetxattr", "flistxattr", "flock", "fork",
25
+ "fremovexattr", "fsetxattr", "fstat", "fstat64", "fstatat64", "fstatfs", "fstatfs64", "fsync", "ftruncate",
26
+ "ftruncate64", "futex", "futex_time64", "futex_waitv",
27
+ "futimesat", "getcpu", "getcwd", "getdents", "getdents64", "getegid", "getegid32", "geteuid", "geteuid32",
28
+ "getgid", "getgid32", "getgroups", "getgroups32", "getitimer", "getpeername", "getpgid", "getpgrp", "getpid",
29
+ "getppid", "getpriority", "getrandom", "getresgid", "getresgid32", "getresuid", "getresuid32", "getrlimit",
30
+ "get_robust_list", "getrusage", "getsid", "getsockname", "getsockopt", "get_thread_area", "gettid",
31
+ "gettimeofday", "getuid", "getuid32", "getxattr", "inotify_add_watch", "inotify_init",
32
+ "inotify_init1", "inotify_rm_watch", "io_cancel", "ioctl", "io_destroy", "io_getevents", "io_pgetevents",
33
+ "io_pgetevents_time64", "ioprio_get", "ioprio_set", "io_setup", "io_submit", "ipc", "kill", "landlock_add_rule",
34
+ "landlock_create_ruleset", "landlock_restrict_self", "lchown", "lchown32", "lgetxattr", "link", "linkat",
35
+ "listen", "listxattr", "llistxattr", "_llseek", "lremovexattr", "lseek", "lsetxattr",
36
+ "lstat", "lstat64", "madvise", "membarrier", "memfd_create", "memfd_secret", "mincore",
37
+ "mkdir", "mkdirat", "mknod", "mknodat", "mlock", "mlock2", "mlockall", "mmap", "mmap2", "mprotect",
38
+ "mq_getsetattr", "mq_notify", "mq_open", "mq_timedreceive", "mq_timedreceive_time64", "mq_timedsend",
39
+ "mq_timedsend_time64", "mq_unlink", "mremap", "msgctl", "msgget", "msgrcv", "msgsnd", "msync",
40
+ "munlock", "munlockall", "munmap", "nanosleep", "newfstatat", "_newselect", "open",
41
+ "openat", "openat2", "pause", "pidfd_open", "pidfd_send_signal", "pipe", "pipe2", "pkey_alloc", "pkey_free",
42
+ "pkey_mprotect", "poll", "ppoll", "ppoll_time64", "prctl", "pread64", "preadv", "preadv2", "prlimit64",
43
+ "process_mrelease", "pselect6", "pselect6_time64", "pwrite64", "pwritev", "pwritev2", "read", "readahead",
44
+ "readlink", "readlinkat", "readv", "recv", "recvfrom", "recvmmsg", "recvmmsg_time64", "recvmsg",
45
+ "remap_file_pages", "removexattr", "rename", "renameat", "renameat2", "restart_syscall",
46
+ "rmdir", "rseq", "rt_sigaction", "rt_sigpending", "rt_sigprocmask", "rt_sigqueueinfo",
47
+ "rt_sigreturn", "rt_sigsuspend", "rt_sigtimedwait", "rt_sigtimedwait_time64", "rt_tgsigqueueinfo",
48
+ "sched_getaffinity", "sched_getattr", "sched_getparam", "sched_get_priority_max", "sched_get_priority_min",
49
+ "sched_getscheduler", "sched_rr_get_interval", "sched_rr_get_interval_time64", "sched_setaffinity", "sched_setattr",
50
+ "sched_setparam", "sched_setscheduler", "sched_yield", "seccomp", "select", "semctl", "semget", "semop",
51
+ "semtimedop", "semtimedop_time64", "send", "sendfile", "sendfile64", "sendmmsg", "sendmsg", "sendto",
52
+ "setfsgid", "setfsgid32", "setfsuid", "setfsuid32", "setgid", "setgid32", "setgroups", "setgroups32",
53
+ "setitimer", "setpgid", "setpriority", "setregid", "setregid32", "setresgid", "setresgid32", "setresuid",
54
+ "setresuid32", "setreuid", "setreuid32", "setrlimit", "set_robust_list", "setsid", "setsockopt",
55
+ "set_thread_area", "set_tid_address", "setuid", "setuid32", "setxattr", "shmat", "shmctl",
56
+ "shmdt", "shmget", "shutdown", "sigaltstack", "signalfd", "signalfd4", "sigprocmask", "sigreturn",
57
+ "socketcall", "socketpair", "splice", "stat", "stat64", "statfs", "statfs64", "statx", "symlink",
58
+ "symlinkat", "sync", "sync_file_range", "syncfs", "sysinfo", "tee", "tgkill", "time", "timer_create",
59
+ "timer_delete", "timer_getoverrun", "timer_gettime", "timer_gettime64", "timer_settime", "timer_settime64",
60
+ "timerfd_create", "timerfd_gettime", "timerfd_gettime64", "timerfd_settime", "timerfd_settime64", "times",
61
+ "tkill", "truncate", "truncate64", "ugetrlimit", "umask", "uname", "unlink", "unlinkat", "utime",
62
+ "utimensat", "utimensat_time64", "utimes", "vfork", "vmsplice", "wait4", "waitid", "waitpid", "write", "writev"
63
+ ],
64
+ "action": "SCMP_ACT_ALLOW"
65
+ },
66
+ {
67
+ "names": ["process_vm_readv", "process_vm_writev", "ptrace"],
68
+ "action": "SCMP_ACT_ALLOW",
69
+ "includes": { "minKernel": "4.8" }
70
+ },
71
+ {
72
+ "names": ["socket"],
73
+ "action": "SCMP_ACT_ALLOW",
74
+ "args": [{ "index": 0, "value": 40, "op": "SCMP_CMP_NE" }]
75
+ },
76
+ { "names": ["personality"], "action": "SCMP_ACT_ALLOW", "args": [{ "index": 0, "value": 0, "op": "SCMP_CMP_EQ" }] },
77
+ { "names": ["personality"], "action": "SCMP_ACT_ALLOW", "args": [{ "index": 0, "value": 8, "op": "SCMP_CMP_EQ" }] },
78
+ { "names": ["personality"], "action": "SCMP_ACT_ALLOW", "args": [{ "index": 0, "value": 131072, "op": "SCMP_CMP_EQ" }] },
79
+ { "names": ["personality"], "action": "SCMP_ACT_ALLOW", "args": [{ "index": 0, "value": 131080, "op": "SCMP_CMP_EQ" }] },
80
+ { "names": ["personality"], "action": "SCMP_ACT_ALLOW", "args": [{ "index": 0, "value": 4294967295, "op": "SCMP_CMP_EQ" }] },
81
+ {
82
+ "names": ["sync_file_range2", "swapcontext"],
83
+ "action": "SCMP_ACT_ALLOW",
84
+ "includes": { "arches": ["ppc64le"] }
85
+ },
86
+ {
87
+ "names": ["arm_fadvise64_64", "arm_sync_file_range", "sync_file_range2", "breakpoint", "cacheflush", "set_tls"],
88
+ "action": "SCMP_ACT_ALLOW",
89
+ "includes": { "arches": ["arm", "arm64"] }
90
+ },
91
+ { "names": ["arch_prctl"], "action": "SCMP_ACT_ALLOW", "includes": { "arches": ["amd64", "x32"] } },
92
+ { "names": ["modify_ldt"], "action": "SCMP_ACT_ALLOW", "includes": { "arches": ["amd64", "x32", "x86"] } },
93
+ {
94
+ "names": ["s390_pci_mmio_read", "s390_pci_mmio_write", "s390_runtime_instr"],
95
+ "action": "SCMP_ACT_ALLOW",
96
+ "includes": { "arches": ["s390", "s390x"] }
97
+ },
98
+ { "names": ["riscv_flush_icache"], "action": "SCMP_ACT_ALLOW", "includes": { "arches": ["riscv64"] } },
99
+ { "names": ["open_by_handle_at"], "action": "SCMP_ACT_ALLOW", "includes": { "caps": ["CAP_DAC_READ_SEARCH"] } },
100
+ {
101
+ "names": ["bpf", "clone", "clone3", "fanotify_init", "fsconfig", "fsmount", "fsopen", "fspick",
102
+ "lookup_dcookie", "mount", "mount_setattr", "move_mount", "name_to_handle_at", "open_tree",
103
+ "perf_event_open", "quotactl", "quotactl_fd", "setdomainname", "sethostname",
104
+ "setns", "syslog", "umount", "umount2", "unshare"],
105
+ "action": "SCMP_ACT_ALLOW",
106
+ "includes": { "caps": ["CAP_SYS_ADMIN"] }
107
+ },
108
+ {
109
+ "names": ["clone"],
110
+ "action": "SCMP_ACT_ALLOW",
111
+ "args": [{ "index": 0, "value": 2114060288, "op": "SCMP_CMP_MASKED_EQ" }],
112
+ "excludes": { "caps": ["CAP_SYS_ADMIN"], "arches": ["s390", "s390x"] }
113
+ },
114
+ {
115
+ "names": ["clone"],
116
+ "action": "SCMP_ACT_ALLOW",
117
+ "args": [{ "index": 1, "value": 2114060288, "op": "SCMP_CMP_MASKED_EQ" }],
118
+ "comment": "s390 parameter ordering for clone is different",
119
+ "includes": { "arches": ["s390", "s390x"] },
120
+ "excludes": { "caps": ["CAP_SYS_ADMIN"] }
121
+ },
122
+ {
123
+ "names": ["clone"],
124
+ "action": "SCMP_ACT_ALLOW",
125
+ "args": [{ "index": 0, "value": 2114060288, "valueTwo": 268435456, "op": "SCMP_CMP_MASKED_EQ" }],
126
+ "comment": "Qubicl session only: Chromium user-namespace feature probe.",
127
+ "excludes": { "arches": ["s390", "s390x"] }
128
+ },
129
+ {
130
+ "names": ["clone"],
131
+ "action": "SCMP_ACT_ALLOW",
132
+ "args": [{ "index": 0, "value": 2114060288, "valueTwo": 805306368, "op": "SCMP_CMP_MASKED_EQ" }],
133
+ "comment": "Qubicl session only: Chromium user and PID namespaces.",
134
+ "excludes": { "arches": ["s390", "s390x"] }
135
+ },
136
+ {
137
+ "names": ["clone"],
138
+ "action": "SCMP_ACT_ALLOW",
139
+ "args": [{ "index": 0, "value": 2114060288, "valueTwo": 1342177280, "op": "SCMP_CMP_MASKED_EQ" }],
140
+ "comment": "Qubicl session only: Chromium user and network namespaces.",
141
+ "excludes": { "arches": ["s390", "s390x"] }
142
+ },
143
+ {
144
+ "names": ["clone"],
145
+ "action": "SCMP_ACT_ALLOW",
146
+ "args": [{ "index": 0, "value": 2114060288, "valueTwo": 1879048192, "op": "SCMP_CMP_MASKED_EQ" }],
147
+ "comment": "Qubicl session only: Chromium user, PID, and network namespaces.",
148
+ "excludes": { "arches": ["s390", "s390x"] }
149
+ },
150
+ {
151
+ "names": ["clone"],
152
+ "action": "SCMP_ACT_ALLOW",
153
+ "args": [{ "index": 0, "value": 2114060288, "valueTwo": 536870912, "op": "SCMP_CMP_MASKED_EQ" }],
154
+ "comment": "Qubicl session only: Chromium forks inside its established user namespace into a PID namespace.",
155
+ "excludes": { "arches": ["s390", "s390x"] }
156
+ },
157
+ {
158
+ "names": ["unshare"],
159
+ "action": "SCMP_ACT_ALLOW",
160
+ "args": [{ "index": 0, "value": 2114060288, "valueTwo": 268435456, "op": "SCMP_CMP_MASKED_EQ" }],
161
+ "comment": "Qubicl session only: Chromium enters a second unprivileged user namespace."
162
+ },
163
+ { "names": ["clone3"], "action": "SCMP_ACT_ERRNO", "errnoRet": 38, "excludes": { "caps": ["CAP_SYS_ADMIN"] } },
164
+ { "names": ["reboot"], "action": "SCMP_ACT_ALLOW", "includes": { "caps": ["CAP_SYS_BOOT"] } },
165
+ { "names": ["chroot"], "action": "SCMP_ACT_ALLOW", "includes": { "caps": ["CAP_SYS_CHROOT"] } },
166
+ { "names": ["delete_module", "init_module", "finit_module"], "action": "SCMP_ACT_ALLOW", "includes": { "caps": ["CAP_SYS_MODULE"] } },
167
+ { "names": ["acct"], "action": "SCMP_ACT_ALLOW", "includes": { "caps": ["CAP_SYS_PACCT"] } },
168
+ {
169
+ "names": ["kcmp", "pidfd_getfd", "process_madvise", "process_vm_readv", "process_vm_writev", "ptrace"],
170
+ "action": "SCMP_ACT_ALLOW",
171
+ "includes": { "caps": ["CAP_SYS_PTRACE"] }
172
+ },
173
+ { "names": ["iopl", "ioperm"], "action": "SCMP_ACT_ALLOW", "includes": { "caps": ["CAP_SYS_RAWIO"] } },
174
+ { "names": ["settimeofday", "stime", "clock_settime", "clock_settime64"], "action": "SCMP_ACT_ALLOW", "includes": { "caps": ["CAP_SYS_TIME"] } },
175
+ { "names": ["vhangup"], "action": "SCMP_ACT_ALLOW", "includes": { "caps": ["CAP_SYS_TTY_CONFIG"] } },
176
+ { "names": ["get_mempolicy", "mbind", "set_mempolicy"], "action": "SCMP_ACT_ALLOW", "includes": { "caps": ["CAP_SYS_NICE"] } },
177
+ { "names": ["syslog"], "action": "SCMP_ACT_ALLOW", "includes": { "caps": ["CAP_SYSLOG"] } },
178
+ { "names": ["bpf"], "action": "SCMP_ACT_ALLOW", "includes": { "caps": ["CAP_BPF"] } },
179
+ { "names": ["perf_event_open"], "action": "SCMP_ACT_ALLOW", "includes": { "caps": ["CAP_PERFMON"] } }
180
+ ]
181
+ }
@@ -0,0 +1,23 @@
1
+ Qubicl browser document-inspection dependencies
2
+
3
+ The exact dependency closure is pinned in browser-skills-requirements.txt.
4
+ Distribution license texts are retained under
5
+ /usr/share/doc/qubicl/skills-python-licenses in browser images. These packages
6
+ are installed only in the isolated /opt/qubicl/skills-venv.
7
+
8
+ Package Version License
9
+ cffi 2.1.1 MIT-0
10
+ charset-normalizer 3.5.1 MIT
11
+ cryptography 50.0.0 Apache-2.0 OR BSD-3-Clause
12
+ pdfminer.six 20260107 MIT
13
+ pdfplumber 0.11.10 MIT
14
+ pillow 12.3.0 MIT-CMU
15
+ pycparser 3.0 BSD-3-Clause
16
+ pypdf 6.16.1 BSD-3-Clause
17
+ pypdfium2 5.13.0 BSD-3-Clause / Apache-2.0 / bundled notices
18
+ reportlab 5.0.1 BSD
19
+ typing_extensions 4.16.0 PSF-2.0
20
+
21
+ No Hermes Agent runtime is installed or required. PyMuPDF, pymupdf4llm, and
22
+ pymupdf-layout are not bundled because their AGPL-3.0-or-commercial licensing
23
+ is outside Qubicl's curated permissive Python dependency policy.
@@ -1,4 +1,4 @@
1
- FROM node:22-trixie-slim@sha256:db8a96a63e5264607ada2d206758876ebbed6a12be2ada7517793cbfb0c2a29c
1
+ FROM node:22-trixie-slim@sha256:db8a96a63e5264607ada2d206758876ebbed6a12be2ada7517793cbfb0c2a29c AS filesystem-base
2
2
 
3
3
  ARG QUBICL_VERSION=development
4
4
  ARG QUBICL_REVISION=unknown
@@ -6,7 +6,7 @@ ARG QUBICL_CREATED=unknown
6
6
  ARG QUBICL_SOURCE=https://github.com/EldanRing/qubicl
7
7
 
8
8
  LABEL org.opencontainers.image.title="Qubicl computer" \
9
- org.opencontainers.image.description="Private Docker computer and desktop for compatible AI agents" \
9
+ org.opencontainers.image.description="Private Docker computer for compatible AI agents" \
10
10
  org.opencontainers.image.licenses="Apache-2.0" \
11
11
  org.opencontainers.image.source="$QUBICL_SOURCE" \
12
12
  org.opencontainers.image.url="$QUBICL_SOURCE" \
@@ -18,73 +18,215 @@ ENV DEBIAN_FRONTEND=noninteractive
18
18
  RUN apt-get update \
19
19
  && apt-get upgrade -y \
20
20
  && apt-get install -y --no-install-recommends \
21
- atril \
22
- build-essential \
23
- ca-certificates \
24
- chromium \
25
- chromium-sandbox \
26
- curl \
27
- dbus-x11 \
28
- file \
29
- fonts-dejavu-core \
30
- git \
31
- libreoffice \
32
- mousepad \
33
- novnc \
34
- patch \
35
- procps \
36
- python3 \
37
- python3-pip \
38
- ristretto \
39
- scrot \
40
- sudo \
41
- thunar \
42
- tini \
43
- websockify \
44
- x11vnc \
45
- x11-utils \
46
- x11-xserver-utils \
47
- xclip \
48
- xdotool \
49
- xdg-utils \
50
- xfce4 \
51
- xfce4-terminal \
52
- xserver-xorg-core \
53
- xvfb \
21
+ ca-certificates \
22
+ curl \
23
+ fd-find \
24
+ file \
25
+ gh \
26
+ git \
27
+ jq \
28
+ procps \
29
+ python3 \
30
+ python3-venv \
31
+ ripgrep \
32
+ sudo \
33
+ tini \
34
+ tree \
35
+ unzip \
36
+ wget \
37
+ zip \
38
+ && ln -s /usr/bin/fdfind /usr/local/bin/fd \
54
39
  && rm -rf /var/lib/apt/lists/*
55
40
 
56
41
  ARG NPM_VERSION=12.0.2
57
- # npm 12.0.2's lock still selects vulnerable, semver-compatible transitive versions.
58
- # Replace only those bundled copies until a later npm release includes the fixes.
59
42
  RUN npm install --global "npm@$NPM_VERSION" \
60
43
  && npm install --prefix /tmp/npm-security-patches \
61
- --ignore-scripts \
62
- --no-audit \
63
- --no-fund \
64
- --package-lock=false \
65
- brace-expansion@5.0.9 \
66
- ip-address@10.3.1 \
44
+ --ignore-scripts --no-audit --no-fund --package-lock=false \
45
+ brace-expansion@5.0.9 ip-address@10.3.1 tar@7.5.21 \
67
46
  && rm -rf \
68
47
  /usr/local/lib/node_modules/npm/node_modules/brace-expansion \
69
48
  /usr/local/lib/node_modules/npm/node_modules/ip-address \
49
+ /usr/local/lib/node_modules/npm/node_modules/tar \
70
50
  && cp -a /tmp/npm-security-patches/node_modules/brace-expansion \
71
51
  /usr/local/lib/node_modules/npm/node_modules/brace-expansion \
72
52
  && cp -a /tmp/npm-security-patches/node_modules/ip-address \
73
53
  /usr/local/lib/node_modules/npm/node_modules/ip-address \
54
+ && cp -a /tmp/npm-security-patches/node_modules/tar \
55
+ /usr/local/lib/node_modules/npm/node_modules/tar \
74
56
  && rm -rf /tmp/npm-security-patches \
75
57
  && npm cache clean --force
76
58
 
77
59
  RUN groupmod --new-name qubicl node \
78
60
  && usermod --login qubicl --home /home/qubicl --move-home --shell /bin/bash node \
79
- && printf 'qubicl ALL=(ALL) NOPASSWD:ALL\n' >/etc/sudoers.d/qubicl \
80
- && chmod 0440 /etc/sudoers.d/qubicl \
81
- && printf 'CHROMIUM_FLAGS="$CHROMIUM_FLAGS --no-sandbox"\n' >/etc/chromium.d/qubicl-container \
61
+ && rm -f /etc/sudoers.d/qubicl \
82
62
  && install -d -o qubicl -g qubicl /opt/qubicl
83
63
 
84
64
  COPY --chown=qubicl:qubicl control.mjs /opt/qubicl/control.mjs
85
- COPY LICENSE THIRD_PARTY_NOTICES.txt /usr/share/doc/qubicl/
65
+ COPY --chown=qubicl:qubicl web-provider.py /opt/qubicl/web-provider.py
66
+ COPY web-requirements.txt /opt/qubicl/web-requirements.txt
67
+ COPY --chown=qubicl:qubicl skills /opt/qubicl/skills
68
+ COPY LICENSE THIRD_PARTY_NOTICES.txt WEB_THIRD_PARTY_NOTICES.txt /usr/share/doc/qubicl/
86
69
  COPY entrypoint.sh /usr/local/bin/qubicl-entrypoint
87
- RUN chmod 0755 /usr/local/bin/qubicl-entrypoint
70
+ RUN python3 -m venv /opt/qubicl/web-venv \
71
+ && /opt/qubicl/web-venv/bin/pip install --no-cache-dir --requirement /opt/qubicl/web-requirements.txt \
72
+ && install -d /usr/share/doc/qubicl/web-python-licenses \
73
+ && find /opt/qubicl/web-venv/lib -type f \( -iname 'LICENSE*' -o -iname 'COPYING*' \) \
74
+ -exec cp --parents '{}' /usr/share/doc/qubicl/web-python-licenses/ \; \
75
+ && find /opt/qubicl/web-venv -type d -name __pycache__ -prune -exec rm -rf '{}' + \
76
+ && chmod 0755 /usr/local/bin/qubicl-entrypoint /opt/qubicl/web-provider.py \
77
+ && chown -R qubicl:qubicl /opt/qubicl/web-venv
88
78
 
89
- EXPOSE 3212 6080 6081
90
79
  ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/qubicl-entrypoint"]
80
+
81
+ FROM filesystem-base AS display-browser-base
82
+
83
+ COPY --chown=qubicl:qubicl node_modules/playwright-core /opt/qubicl/node_modules/playwright-core
84
+ COPY PLAYWRIGHT_THIRD_PARTY_NOTICES.txt /usr/share/doc/qubicl/
85
+ COPY chromium-wrapper.sh /usr/local/bin/qubicl-chromium
86
+
87
+ # noVNC is static browser content at runtime. Extract Debian's signed package
88
+ # without installing its unnecessary dependency on Debian's second Node stack.
89
+ RUN apt-get update \
90
+ && apt-get install -y --no-install-recommends \
91
+ chromium \
92
+ dbus-x11 \
93
+ fonts-dejavu-core \
94
+ scrot \
95
+ websockify \
96
+ x11-utils \
97
+ x11-xserver-utils \
98
+ x11vnc \
99
+ xclip \
100
+ xdotool \
101
+ xdg-utils \
102
+ xserver-xorg-core \
103
+ xvfb \
104
+ && install -d -m 0755 -o _apt -g root /tmp/qubicl-novnc-package \
105
+ && cd /tmp/qubicl-novnc-package \
106
+ && apt-get download novnc \
107
+ && dpkg-deb --extract ./novnc_*.deb / \
108
+ && cd / \
109
+ && test -s /usr/share/novnc/vnc.html \
110
+ && test -s /usr/share/doc/novnc/copyright \
111
+ && rm -rf /tmp/qubicl-novnc-package /var/lib/apt/lists/* \
112
+ && rm -f /etc/chromium.d/dev-shm \
113
+ && chmod 0755 /usr/local/bin/qubicl-chromium \
114
+ && printf 'CHROMIUM_FLAGS="$CHROMIUM_FLAGS --no-first-run --no-default-browser-check"\n' >/etc/chromium.d/qubicl-container
115
+
116
+ FROM display-browser-base AS document-inspection-base
117
+ RUN apt-get update \
118
+ && apt-get install -y --no-install-recommends \
119
+ poppler-utils \
120
+ tesseract-ocr \
121
+ tesseract-ocr-eng \
122
+ && rm -rf /var/lib/apt/lists/*
123
+
124
+ FROM document-inspection-base AS browser-runtime
125
+ COPY browser-skills-requirements.txt /opt/qubicl/browser-skills-requirements.txt
126
+ COPY BROWSER_SKILLS_THIRD_PARTY_NOTICES.txt /usr/share/doc/qubicl/
127
+ RUN apt-get update \
128
+ && apt-get install -y --no-install-recommends openbox \
129
+ && rm -rf /var/lib/apt/lists/* \
130
+ && python3 -m venv /opt/qubicl/skills-venv \
131
+ && /opt/qubicl/skills-venv/bin/pip install --no-cache-dir --requirement /opt/qubicl/browser-skills-requirements.txt \
132
+ && install -d /usr/share/doc/qubicl/skills-python-licenses \
133
+ && find /opt/qubicl/skills-venv/lib -type f \( -iname 'LICENSE*' -o -iname 'COPYING*' \) \
134
+ -exec cp --parents '{}' /usr/share/doc/qubicl/skills-python-licenses/ \; \
135
+ && find /opt/qubicl/skills-venv -type d -name __pycache__ -prune -exec rm -rf '{}' + \
136
+ && chown -R qubicl:qubicl /opt/qubicl/skills-venv
137
+
138
+ FROM document-inspection-base AS computer-runtime
139
+ COPY skills-requirements.txt /opt/qubicl/skills-requirements.txt
140
+ COPY SKILLS_THIRD_PARTY_NOTICES.txt /usr/share/doc/qubicl/
141
+ RUN apt-get update \
142
+ && apt-get install -y --no-install-recommends \
143
+ mousepad \
144
+ nano \
145
+ openssh-client \
146
+ openssh-server \
147
+ python3-pip \
148
+ thunar \
149
+ vim \
150
+ xfce4-panel \
151
+ xfce4-session \
152
+ xfce4-settings \
153
+ xfce4-terminal \
154
+ xfdesktop4 \
155
+ xfwm4 \
156
+ && rm -rf /var/lib/apt/lists/* \
157
+ && rm -f /etc/ssh/ssh_host_*_key* \
158
+ && python3 -m venv /opt/qubicl/skills-venv \
159
+ && /opt/qubicl/skills-venv/bin/pip install --no-cache-dir --requirement /opt/qubicl/skills-requirements.txt \
160
+ && install -d /usr/share/doc/qubicl/skills-python-licenses \
161
+ && find /opt/qubicl/skills-venv/lib -type f \( -iname 'LICENSE*' -o -iname 'COPYING*' \) \
162
+ -exec cp --parents '{}' /usr/share/doc/qubicl/skills-python-licenses/ \; \
163
+ && find /opt/qubicl/skills-venv -type d -name __pycache__ -prune -exec rm -rf '{}' + \
164
+ && chown -R qubicl:qubicl /opt/qubicl/skills-venv
165
+
166
+ FROM computer-runtime AS workstation-runtime
167
+ RUN apt-get update \
168
+ && apt-get install -y --no-install-recommends \
169
+ build-essential \
170
+ iproute2 \
171
+ libreoffice \
172
+ netcat-openbsd \
173
+ && rm -rf /var/lib/apt/lists/* \
174
+ && install -d -m 0755 /etc/skel/.config/libreoffice/4/user
175
+
176
+ COPY libreoffice-registrymodifications.xcu /etc/skel/.config/libreoffice/4/user/registrymodifications.xcu
177
+
178
+ FROM filesystem-base AS file-system
179
+ ARG QUBICL_MANIFEST_SHA256
180
+ ARG QUBICL_CONTRACT_PRESET
181
+ ARG QUBICL_CONTRACT_COMPATIBILITY
182
+ ARG QUBICL_CONTRACT_CAPABILITIES
183
+ COPY --chown=qubicl:qubicl manifests/file-system.json /opt/qubicl/computer-manifest.json
184
+ ENV QUBICL_IMAGE_STARTUP_PROFILE=file-system
185
+ LABEL dev.qubicl.contract-version="1" \
186
+ dev.qubicl.preset="$QUBICL_CONTRACT_PRESET" \
187
+ dev.qubicl.compatibility="$QUBICL_CONTRACT_COMPATIBILITY" \
188
+ dev.qubicl.capabilities="$QUBICL_CONTRACT_CAPABILITIES" \
189
+ dev.qubicl.manifest-sha256="$QUBICL_MANIFEST_SHA256"
190
+ EXPOSE 3212
191
+
192
+ FROM browser-runtime AS browser
193
+ ARG QUBICL_MANIFEST_SHA256
194
+ ARG QUBICL_CONTRACT_PRESET
195
+ ARG QUBICL_CONTRACT_COMPATIBILITY
196
+ ARG QUBICL_CONTRACT_CAPABILITIES
197
+ COPY --chown=qubicl:qubicl manifests/browser.json /opt/qubicl/computer-manifest.json
198
+ ENV QUBICL_IMAGE_STARTUP_PROFILE=browser
199
+ LABEL dev.qubicl.contract-version="1" \
200
+ dev.qubicl.preset="$QUBICL_CONTRACT_PRESET" \
201
+ dev.qubicl.compatibility="$QUBICL_CONTRACT_COMPATIBILITY" \
202
+ dev.qubicl.capabilities="$QUBICL_CONTRACT_CAPABILITIES" \
203
+ dev.qubicl.manifest-sha256="$QUBICL_MANIFEST_SHA256"
204
+ EXPOSE 3212 6080 6081
205
+
206
+ FROM computer-runtime AS computer
207
+ ARG QUBICL_MANIFEST_SHA256
208
+ ARG QUBICL_CONTRACT_PRESET
209
+ ARG QUBICL_CONTRACT_COMPATIBILITY
210
+ ARG QUBICL_CONTRACT_CAPABILITIES
211
+ COPY --chown=qubicl:qubicl manifests/computer.json /opt/qubicl/computer-manifest.json
212
+ ENV QUBICL_IMAGE_STARTUP_PROFILE=desktop
213
+ LABEL dev.qubicl.contract-version="1" \
214
+ dev.qubicl.preset="$QUBICL_CONTRACT_PRESET" \
215
+ dev.qubicl.compatibility="$QUBICL_CONTRACT_COMPATIBILITY" \
216
+ dev.qubicl.capabilities="$QUBICL_CONTRACT_CAPABILITIES" \
217
+ dev.qubicl.manifest-sha256="$QUBICL_MANIFEST_SHA256"
218
+ EXPOSE 3212 6080 6081
219
+
220
+ FROM workstation-runtime AS workstation
221
+ ARG QUBICL_MANIFEST_SHA256
222
+ ARG QUBICL_CONTRACT_PRESET
223
+ ARG QUBICL_CONTRACT_COMPATIBILITY
224
+ ARG QUBICL_CONTRACT_CAPABILITIES
225
+ COPY --chown=qubicl:qubicl manifests/workstation.json /opt/qubicl/computer-manifest.json
226
+ ENV QUBICL_IMAGE_STARTUP_PROFILE=workstation
227
+ LABEL dev.qubicl.contract-version="1" \
228
+ dev.qubicl.preset="$QUBICL_CONTRACT_PRESET" \
229
+ dev.qubicl.compatibility="$QUBICL_CONTRACT_COMPATIBILITY" \
230
+ dev.qubicl.capabilities="$QUBICL_CONTRACT_CAPABILITIES" \
231
+ dev.qubicl.manifest-sha256="$QUBICL_MANIFEST_SHA256"
232
+ EXPOSE 3212 6080 6081