🔥 Sync 2026-09-24 17:48:02

This commit is contained in:
github-actions[bot] committed 2026-09-24 17:48:02 +08:00
1 parent 97fd8c867c
commit aac134b37b
20 files changed
+153 -58

No files matched your search

+4 -4
View File
@@ -10,12 +10,12 @@ AGENTFLOW_ARCH_x86_64:=amd64
AGENTFLOW_ARCH_aarch64:=arm64
AGENTFLOW_ARCH:=$(AGENTFLOW_ARCH_$(ARCH))
AGENTFLOW_HASH_x86_64:=3bdd9b3af7a95c78d6fb6589117931e2be3f2800056fc7836aa95abe48d0a33d
AGENTFLOW_HASH_aarch64:=8962a1ec6f57ee394ddfdf61abd72191f5378644c5ab1ce85040b132b757cc43
AGENTFLOW_HASH_x86_64:=266ceb4bc47d8ef0d2d731594a612266573bb93c4e23e9e329acf00c3bac4087
AGENTFLOW_HASH_aarch64:=7790a94a0a04e57d196165ef96177475125c1b24fe24321f6927a55b2c62211f
PKG_NAME:=agentflow
PKG_VERSION:=0.3.4
PKG_RELEASE:=14
PKG_VERSION:=0.3.5
PKG_RELEASE:=15
AGENTFLOW_URL_FILE:=agentflow-linux-$(AGENTFLOW_ARCH)
AGENTFLOW_DOWNLOAD:=$(AGENTFLOW_URL_FILE)-$(AGENTFLOW_HASH_$(ARCH))
+2 -2
View File
@@ -1,8 +1,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=kai-agent
PKG_VERSION:=linkease-app-entry-runtime-v3.0.22
PKG_RELEASE:=1
PKG_VERSION:=kai-runtime-v0.0.25
PKG_RELEASE:=2
PKG_SOURCE:=kai-agent-bundle-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/kai-runtime-v$(PKG_VERSION)/
PKG_HASH:=skip
+2 -2
View File
@@ -10,8 +10,8 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_kai:=$(ARCH)
PKG_NAME:=kai
PKG_VERSION:=linkease-app-entry-runtime-v3.0.22
PKG_RELEASE:=6
PKG_VERSION:=kai-runtime-v0.0.25
PKG_RELEASE:=7
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/kai-runtime-v$(PKG_VERSION)/
PKG_HASH:=skip
+2 -2
View File
@@ -10,8 +10,8 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_kai_session:=$(ARCH)
PKG_NAME:=kai_session
PKG_VERSION:=linkease-app-entry-runtime-v3.0.22
PKG_RELEASE:=6
PKG_VERSION:=kai-runtime-v0.0.25
PKG_RELEASE:=7
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/kai-runtime-v$(PKG_VERSION)/
PKG_HASH:=skip
+3 -3
View File
@@ -8,8 +8,8 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=linkease-app-entry
# This lightweight runtime is released independently from the full desktop.
PKG_VERSION:=linkease-app-entry-runtime-v3.0.22
PKG_RELEASE:=1
PKG_VERSION:=kai-runtime-v0.0.25
PKG_RELEASE:=2
ARCH_HEXCODE:=
ifeq ($(ARCH),x86_64)
@@ -22,7 +22,7 @@ LINKEASE_RUNTIME_ARCH:=arm64
PKG_HASH:=skip
endif
PKG_SOURCE_VERSION:=d3d23965623e4182de554dde64418bb9a20c9078
PKG_SOURCE_VERSION:=19c81b111a2b26f180422e0e5ab929f8b155abde
PKG_SOURCE:=linkease-app-entry-runtime-$(PKG_VERSION)-linux-$(LINKEASE_RUNTIME_ARCH).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/linkease-app-entry-runtime-v$(PKG_VERSION)/
PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-app-entry-runtime-$(PKG_VERSION)-linux-$(LINKEASE_RUNTIME_ARCH)
+2 -2
View File
@@ -12,7 +12,7 @@ PKG_ARCH_LINKEASE:=$(ARCH)
PKG_NAME:=linkease-common-bin
# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable
PKG_SOURCE_DATE:=1.7.5
PKG_RELEASE:=34
PKG_RELEASE:=35
ARCH_HEXCODE:=
ifeq ($(ARCH),x86_64)
@@ -28,7 +28,7 @@ else ifeq ($(ARCH),mipsel)
ARCH_HEXCODE=1b0c
endif
PKG_SOURCE_VERSION:=8e06ab67451edac1442855713ca3256c72f34be9
PKG_SOURCE_VERSION:=19c81b111a2b26f180422e0e5ab929f8b155abde
PKG_SOURCE:=linkease-common-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/linkease-runtime-v$(PKG_SOURCE_DATE)/
PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-common-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE)
+2 -2
View File
@@ -12,7 +12,7 @@ PKG_ARCH_LINKEASE:=$(ARCH)
PKG_NAME:=linkease
# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable
PKG_SOURCE_DATE:=1.7.5
PKG_RELEASE:=37
PKG_RELEASE:=38
ARCH_HEXCODE:=
ifeq ($(ARCH),x86_64)
@@ -28,7 +28,7 @@ else ifeq ($(ARCH),mipsel)
ARCH_HEXCODE=1b0c
endif
PKG_SOURCE_VERSION:=8e06ab67451edac1442855713ca3256c72f34be9
PKG_SOURCE_VERSION:=19c81b111a2b26f180422e0e5ab929f8b155abde
PKG_SOURCE:=linkease-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/linkease-runtime-v$(PKG_SOURCE_DATE)/
PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE)
+2 -2
View File
@@ -11,7 +11,7 @@ PKG_ARCH_LINKEASE:=$(ARCH)
PKG_NAME:=linkeasefull
# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable
PKG_SOURCE_DATE:=3.0.22
PKG_RELEASE:=36
PKG_RELEASE:=37
ARCH_HEXCODE:=
ifeq ($(ARCH),x86_64)
@@ -24,7 +24,7 @@ LINKEASE_RUNTIME_ARCH:=arm64
PKG_HASH:=skip
endif
PKG_SOURCE_VERSION:=8e06ab67451edac1442855713ca3256c72f34be9
PKG_SOURCE_VERSION:=19c81b111a2b26f180422e0e5ab929f8b155abde
PKG_SOURCE:=linkease-runtime-$(PKG_SOURCE_DATE)-linux-$(LINKEASE_RUNTIME_ARCH).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/linkeasefull-runtime-v$(PKG_SOURCE_DATE)/
PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-runtime-$(PKG_SOURCE_DATE)-linux-$(LINKEASE_RUNTIME_ARCH)
+1 -1
View File
@@ -11,7 +11,7 @@ LUCI_DEPENDS:=+luci-base +luci-lib-jsonc +curl +bandix
PKG_MAINTAINER:=timsaya
PKG_VERSION:=0.12.11
PKG_RELEASE:=10
PKG_RELEASE:=11
include $(TOPDIR)/feeds/luci/luci.mk
@@ -133,6 +133,20 @@ function formatSize(bytes) {
}
// 格式化设备名称
// IPv6 地址按 RFC 3986 用方括号包起来,一是避免 '2600:...:8000::' + ':' + '80' 拼出
// ':::80' 这种分不清边界的写法,二是选中复制出来就是 [addr]:port,可以直接粘去用。
// 地址和端口是行内元素,复制时不会被拆成两行;端口自身 nowrap,不会被折断
function flowEndpointCell(addr, port) {
var text = addr || '-';
if (text.indexOf(':') >= 0) {
text = '[' + text + ']';
}
return E('td', { 'class': 'flows-addr-cell' }, [
E('span', { 'class': 'flows-addr' }, text),
E('span', { 'class': 'flows-port' }, port ? ':' + port : '')
]);
}
function formatDeviceName(device) {
if (device.host && device.host !== '') {
return device.host;
@@ -719,26 +733,52 @@ return view.extend({
.flows-modal-content .flows-table th:nth-child(1),
.flows-modal-content .flows-table td:nth-child(1) { width: 5%; }
.flows-modal-content .flows-table th:nth-child(2),
.flows-modal-content .flows-table td:nth-child(2) { width: 8%; }
.flows-modal-content .flows-table td:nth-child(2) { width: 10%; }
.flows-modal-content .flows-table th:nth-child(3),
.flows-modal-content .flows-table td:nth-child(3) { width: 14%; }
.flows-modal-content .flows-table td:nth-child(3) { width: 14.75%; }
.flows-modal-content .flows-table th:nth-child(4),
.flows-modal-content .flows-table td:nth-child(4) { width: 14%; }
.flows-modal-content .flows-table td:nth-child(4) { width: 14.75%; }
.flows-modal-content .flows-table th:nth-child(5),
.flows-modal-content .flows-table td:nth-child(5) { width: 10%; }
.flows-modal-content .flows-table td:nth-child(5) { width: 9%; }
.flows-modal-content .flows-table th:nth-child(6),
.flows-modal-content .flows-table td:nth-child(6) { width: 14%; }
.flows-modal-content .flows-table td:nth-child(6) { width: 14.75%; }
.flows-modal-content .flows-table th:nth-child(7),
.flows-modal-content .flows-table td:nth-child(7) { width: 14%; }
.flows-modal-content .flows-table td:nth-child(7) { width: 14.75%; }
.flows-modal-content .flows-table th:nth-child(8),
.flows-modal-content .flows-table td:nth-child(8) { width: 10%; }
.flows-modal-content .flows-table td:nth-child(8) { width: 9%; }
.flows-modal-content .flows-table th:nth-child(9),
.flows-modal-content .flows-table td:nth-child(9) { width: 11%; }
.flows-modal-content .flows-table td:nth-child(9) { width: 8%; }
/* IPv6 没有 NAT,回复方向恒为源方向的镜像,隐藏后地址列能放下整条 IPv6 地址 */
.flows-modal-content .flows-table.hide-repl th:nth-child(6),
.flows-modal-content .flows-table.hide-repl td:nth-child(6),
.flows-modal-content .flows-table.hide-repl th:nth-child(7),
.flows-modal-content .flows-table.hide-repl td:nth-child(7) { display: none; }
.flows-modal-content .flows-table.hide-repl th:nth-child(1),
.flows-modal-content .flows-table.hide-repl td:nth-child(1) { width: 4%; }
.flows-modal-content .flows-table.hide-repl th:nth-child(2),
.flows-modal-content .flows-table.hide-repl td:nth-child(2) { width: 10%; }
.flows-modal-content .flows-table.hide-repl th:nth-child(3),
.flows-modal-content .flows-table.hide-repl td:nth-child(3) { width: 31%; }
.flows-modal-content .flows-table.hide-repl th:nth-child(4),
.flows-modal-content .flows-table.hide-repl td:nth-child(4) { width: 31%; }
.flows-modal-content .flows-table.hide-repl th:nth-child(5),
.flows-modal-content .flows-table.hide-repl td:nth-child(5) { width: 9.5%; }
.flows-modal-content .flows-table.hide-repl th:nth-child(8),
.flows-modal-content .flows-table.hide-repl td:nth-child(8) { width: 9.5%; }
.flows-modal-content .flows-table.hide-repl th:nth-child(9),
.flows-modal-content .flows-table.hide-repl td:nth-child(9) { width: 5%; }
/* 紧凑模式下再降一档字号,最长的 IPv6 地址才能完整落在一行里 */
.flows-modal-content .flows-table.hide-repl .flows-addr-cell {
font-size: 11px;
}
.flows-modal-content .flows-table th,
.flows-modal-content .flows-table td {
padding: 8px 12px;
text-align: left;
vertical-align: top;
border-bottom: 1px solid rgba(0,0,0,0.08);
}
@@ -749,7 +789,32 @@ return view.extend({
.flows-modal-content .flows-addr-cell {
word-break: break-all;
font-size: 0.8rem;
font-size: 12px;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
line-height: 1.35;
}
.flows-modal-content .flows-addr-cell .flows-port {
opacity: 0.6;
white-space: nowrap;
}
/* ESTABLISHED 是单个长单词,宽度不够时必须允许断开,否则会压到相邻列上 */
.flows-modal-content .flows-table td.flows-state-cell {
overflow-wrap: anywhere;
word-break: break-word;
}
.flows-modal-content .flows-repl-toggle {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 0.85rem;
cursor: pointer;
}
.flows-modal-content .flows-repl-toggle input {
margin: 0;
}
.flows-modal-content .flows-protocol-tcp {
@@ -1091,25 +1156,25 @@ return view.extend({
var pageInfo = E('span', { 'style': 'font-size: 0.85rem; opacity: 0.85; margin: 0 14px;' }, '');
var prevPageBtn = E('button', { 'class': 'cbi-button cbi-button-action', 'style': 'margin-right: 8px;' }, _('Previous'));
var nextPageBtn = E('button', { 'class': 'cbi-button cbi-button-action' }, _('Next'));
var replToggle = E('input', { 'type': 'checkbox', 'id': 'flows-show-repl', 'checked': 'checked' });
var tableBody = E('tbody', { 'class': 'flows-table-body' });
var tableWrap = E('div', { 'class': 'flows-table-wrap' }, [
E('table', { 'class': 'flows-table' }, [
E('thead', {}, [
E('tr', {}, [
E('th', {}, _('Protocol')),
E('th', {}, _('State')),
E('th', {}, _('Orig Src')),
E('th', {}, _('Orig Dst')),
E('th', {}, _('Send')),
E('th', {}, _('Repl Src')),
E('th', {}, _('Repl Dst')),
E('th', {}, _('Reply')),
E('th', {}, _('Flags'))
])
]),
tableBody
])
var flowsTable = E('table', { 'class': 'flows-table' }, [
E('thead', {}, [
E('tr', {}, [
E('th', {}, _('Protocol')),
E('th', {}, _('State')),
E('th', {}, _('Orig Src')),
E('th', {}, _('Orig Dst')),
E('th', {}, _('Send')),
E('th', {}, _('Repl Src')),
E('th', {}, _('Repl Dst')),
E('th', {}, _('Reply')),
E('th', {}, _('Flags'))
])
]),
tableBody
]);
var tableWrap = E('div', { 'class': 'flows-table-wrap' }, [flowsTable]);
function updatePaginationUi() {
if (pageInfo) {
@@ -1186,22 +1251,18 @@ return view.extend({
else if (f.state.indexOf('TIME_WAIT') >= 0) stateCls = 'flows-state-wait';
else if (f.state.indexOf('CLOSE') >= 0) stateCls = 'flows-state-close';
}
var origSrc = f.orig ? (f.orig.src || '-') + ':' + (f.orig.sport || '-') : '-';
var origDst = f.orig ? (f.orig.dst || '-') + ':' + (f.orig.dport || '-') : '-';
var replSrc = f.repl ? (f.repl.src || '-') + ':' + (f.repl.sport || '-') : '-';
var replDst = f.repl ? (f.repl.dst || '-') + ':' + (f.repl.dport || '-') : '-';
var sendStr = (f.orig_packets || 0) + ' ' + _('pkts') + ' / ' + formatSize(f.orig_bytes || 0);
var replyStr = (f.repl_packets || 0) + ' ' + _('pkts') + ' / ' + formatSize(f.repl_bytes || 0);
var flagsStr = (f.flags && f.flags.length) ? f.flags.join(' ') : '-';
var protoCls = (f.protocol || '').toLowerCase() === 'tcp' ? 'flows-protocol-tcp' : 'flows-protocol-udp';
tableBody.appendChild(E('tr', {}, [
E('td', { 'class': protoCls }, (f.protocol || '-').toUpperCase()),
E('td', { 'class': stateCls }, f.state || '-'),
E('td', { 'class': 'flows-addr-cell' }, origSrc),
E('td', { 'class': 'flows-addr-cell' }, origDst),
E('td', { 'class': 'flows-state-cell ' + stateCls }, f.state || '-'),
flowEndpointCell(f.orig && f.orig.src, f.orig && f.orig.sport),
flowEndpointCell(f.orig && f.orig.dst, f.orig && f.orig.dport),
E('td', {}, sendStr),
E('td', { 'class': 'flows-addr-cell' }, replSrc),
E('td', { 'class': 'flows-addr-cell' }, replDst),
flowEndpointCell(f.repl && f.repl.src, f.repl && f.repl.sport),
flowEndpointCell(f.repl && f.repl.dst, f.repl && f.repl.dport),
E('td', {}, replyStr),
E('td', { 'style': 'font-size: 0.8rem;' }, flagsStr)
]));
@@ -1253,6 +1314,10 @@ return view.extend({
protocolSelect,
E('label', {}, _('State') + ':'),
stateSelect,
E('label', { 'class': 'flows-repl-toggle', 'for': 'flows-show-repl' }, [
replToggle,
E('span', {}, _('Show reply direction'))
]),
E('button', { 'class': 'cbi-button cbi-button-apply', 'click': loadFlows }, _('Refresh'))
]),
tableWrap,
@@ -1271,6 +1336,16 @@ return view.extend({
if (stateSelect && stateSelect.addEventListener) {
stateSelect.addEventListener('change', onFilterChange);
}
if (replToggle && replToggle.addEventListener) {
replToggle.addEventListener('change', function () {
// 关掉回复方向后,两个地址列各占 27%,整条 IPv6 地址能放进一行
if (replToggle.checked) {
flowsTable.classList.remove('hide-repl');
} else {
flowsTable.classList.add('hide-repl');
}
});
}
var overlay = document.getElementById('flows-modal-overlay');
if (!overlay) {
+3
View File
@@ -1348,3 +1348,6 @@ msgstr "No se pudieron cargar las cuotas de tráfico"
msgid "Unavailable"
msgstr "No disponible"
msgid "Show reply direction"
msgstr "Mostrar la dirección de respuesta"
+3
View File
@@ -1348,3 +1348,6 @@ msgstr "Impossible de charger les quotas de trafic"
msgid "Unavailable"
msgstr "Indisponible"
msgid "Show reply direction"
msgstr "Afficher la direction de réponse"
+3
View File
@@ -1348,3 +1348,6 @@ msgstr "トラフィッククォータを読み込めませんでした"
msgid "Unavailable"
msgstr "利用不可"
msgid "Show reply direction"
msgstr "応答方向を表示"
+3
View File
@@ -1348,3 +1348,6 @@ msgstr "Nie udało się wczytać limitów transferu"
msgid "Unavailable"
msgstr "Niedostępne"
msgid "Show reply direction"
msgstr "Pokaż kierunek odpowiedzi"
+3
View File
@@ -1348,3 +1348,6 @@ msgstr "Не удалось загрузить квоты трафика"
msgid "Unavailable"
msgstr "Недоступно"
msgid "Show reply direction"
msgstr "Показывать обратное направление"
+3
View File
@@ -1375,3 +1375,6 @@ msgstr "每分钟配额"
msgid "Minute"
msgstr "每分钟"
msgid "Show reply direction"
msgstr "显示回复方向"
+3
View File
@@ -1348,3 +1348,6 @@ msgstr "載入流量配額失敗"
msgid "Unavailable"
msgstr "無法使用"
msgid "Show reply direction"
msgstr "顯示回覆方向"
+1 -1
View File
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=Argon Theme
LUCI_DEPENDS:=+USE_APK:wget-any +!USE_APK:wget +jsonfilter
PKG_VERSION:=2.4.7
PKG_RELEASE:=18
PKG_RELEASE:=19
CONFIG_LUCI_CSSTIDY:=
@@ -137,7 +137,6 @@
{% else %}
<!-- Image Background Start -->
{% online_wallpaper = cfg.get_first('argon', 'global', 'online_wallpaper') ?? 'default' %}
<div class="main-bg" id="main-bg"><img src="{{ entityencode(bgArry.bgUrl, true) }}" data-fallback="{{ media }}/img/bg1.jpg" onerror="this.onerror=null;this.src=this.dataset.fallback" alt=""></div>
<div class="main-bg" id="main-bg">{% if (online_wallpaper != 'default'): %}<img src="{{ entityencode(bgArry.bgUrl, true) }}" data-fallback="{{ media }}/img/bg1.jpg" onerror="this.onerror=null;this.src=this.dataset.fallback" alt="">{% endif %}</div>
<!-- Image Background End -->
{% endif %}
+1 -1
View File
@@ -12,7 +12,7 @@ define KernelPackage/oaf
SUBMENU:=Netfilter Extensions
TITLE:=OAF netfilter module
FILES:=$(PKG_BUILD_DIR)/oaf.ko
DEPENDS:=+kmod-ipt-conntrack
DEPENDS:=+kmod-nf-conntrack +kmod-nf-reject
KCONFIG:=
endef