agim-cli 1.1.5 → 1.1.7
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.
- package/CHANGELOG.md +66 -0
- package/README.md +1 -0
- package/README.zh-CN.md +1 -0
- package/dist/core/message-sink.d.ts.map +1 -1
- package/dist/core/message-sink.js +48 -1
- package/dist/core/message-sink.js.map +1 -1
- package/dist/core/render-router.d.ts +49 -0
- package/dist/core/render-router.d.ts.map +1 -0
- package/dist/core/render-router.js +124 -0
- package/dist/core/render-router.js.map +1 -0
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/router.js +12 -1
- package/dist/core/router.js.map +1 -1
- package/dist/core/viewer-config.d.ts +22 -0
- package/dist/core/viewer-config.d.ts.map +1 -0
- package/dist/core/viewer-config.js +39 -0
- package/dist/core/viewer-config.js.map +1 -0
- package/dist/core/viewer-local.d.ts +34 -0
- package/dist/core/viewer-local.d.ts.map +1 -0
- package/dist/core/viewer-local.js +140 -0
- package/dist/core/viewer-local.js.map +1 -0
- package/dist/web/public/settings.html +128 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +92 -0
- package/dist/web/server.js.map +1 -1
- package/dist/web/viewer-render.d.ts +4 -0
- package/dist/web/viewer-render.d.ts.map +1 -0
- package/dist/web/viewer-render.js +120 -0
- package/dist/web/viewer-render.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// Viewer HTML render — serves a single paste row as a complete HTML page.
|
|
2
|
+
// Mirrors agim-viewer's render.js so the look/feel is identical whether
|
|
3
|
+
// the operator runs the standalone service or this in-process route.
|
|
4
|
+
function escapeHtml(s) {
|
|
5
|
+
if (s == null)
|
|
6
|
+
return '';
|
|
7
|
+
return String(s)
|
|
8
|
+
.replace(/&/g, '&')
|
|
9
|
+
.replace(/</g, '<')
|
|
10
|
+
.replace(/>/g, '>')
|
|
11
|
+
.replace(/"/g, '"')
|
|
12
|
+
.replace(/'/g, ''');
|
|
13
|
+
}
|
|
14
|
+
function fmtDate(unix) {
|
|
15
|
+
return new Date(unix * 1000).toISOString().replace('T', ' ').replace(/\..+$/, ' UTC');
|
|
16
|
+
}
|
|
17
|
+
export function renderPasteHtml(row) {
|
|
18
|
+
const isMd = row.content_type !== 'plain';
|
|
19
|
+
const title = row.title || (isMd ? 'agim · markdown' : 'agim · plaintext');
|
|
20
|
+
// Intentionally do NOT render `source` (thread_key). It contains the IM
|
|
21
|
+
// user id (wxid / telegram id), and the /v/:id URL is anyone-with-link.
|
|
22
|
+
// Source stays in the DB for the operator's own dashboard.
|
|
23
|
+
const created = fmtDate(row.created_at);
|
|
24
|
+
const body = isMd
|
|
25
|
+
? `<pre id="md-src" hidden>${escapeHtml(row.content)}</pre><article id="rendered" class="prose"></article>`
|
|
26
|
+
: `<pre class="plain">${escapeHtml(row.content)}</pre>`;
|
|
27
|
+
return `<!doctype html>
|
|
28
|
+
<html lang="zh">
|
|
29
|
+
<head>
|
|
30
|
+
<meta charset="utf-8">
|
|
31
|
+
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
|
|
32
|
+
<meta name="robots" content="noindex,nofollow">
|
|
33
|
+
<meta name="referrer" content="no-referrer">
|
|
34
|
+
<title>${escapeHtml(title)}</title>
|
|
35
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/github-markdown-css@5.6.1/github-markdown-light.min.css" crossorigin="anonymous">
|
|
36
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/highlight.js@11.10.0/styles/github.min.css" crossorigin="anonymous">
|
|
37
|
+
<style>
|
|
38
|
+
:root{color-scheme:light dark}
|
|
39
|
+
*{box-sizing:border-box}
|
|
40
|
+
html,body{margin:0;padding:0;background:#fafbfc;color:#1f2328;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}
|
|
41
|
+
.wrap{max-width:860px;margin:0 auto;padding:16px}
|
|
42
|
+
header{display:flex;align-items:center;gap:12px;padding:10px 12px;background:#fff;border:1px solid #d0d7de;border-radius:8px;margin-bottom:16px;font-size:13px;color:#656d76}
|
|
43
|
+
header .title{flex:1;font-weight:600;color:#1f2328;font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
44
|
+
header .source{color:#0969da;font-size:12px}
|
|
45
|
+
header .meta{font-size:12px;color:#656d76}
|
|
46
|
+
header button{background:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;padding:5px 10px;font-size:12px;cursor:pointer;color:#1f2328}
|
|
47
|
+
header button:hover{background:#eef0f3}
|
|
48
|
+
.markdown-body{background:transparent;padding:0;font-size:15px;word-wrap:break-word}
|
|
49
|
+
.markdown-body pre{background:#f6f8fa;border-radius:6px;padding:12px;overflow:auto;font-size:13px}
|
|
50
|
+
.markdown-body table{display:block;overflow-x:auto;white-space:nowrap;font-size:13px}
|
|
51
|
+
.markdown-body img{max-width:100%;height:auto}
|
|
52
|
+
.plain{background:#fff;border:1px solid #d0d7de;border-radius:8px;padding:16px;white-space:pre-wrap;word-break:break-word;font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,monospace;font-size:13px;line-height:1.6}
|
|
53
|
+
footer{margin-top:20px;padding:12px;text-align:center;color:#8b949e;font-size:12px}
|
|
54
|
+
footer a{color:#0969da;text-decoration:none}
|
|
55
|
+
@media (prefers-color-scheme: dark){
|
|
56
|
+
html,body{background:#0d1117;color:#e6edf3}
|
|
57
|
+
header{background:#161b22;border-color:#30363d;color:#8d96a0}
|
|
58
|
+
header .title{color:#e6edf3}
|
|
59
|
+
header button{background:#21262d;border-color:#30363d;color:#e6edf3}
|
|
60
|
+
header button:hover{background:#30363d}
|
|
61
|
+
.plain{background:#161b22;border-color:#30363d;color:#e6edf3}
|
|
62
|
+
.markdown-body pre{background:#161b22}
|
|
63
|
+
}
|
|
64
|
+
@media (max-width:600px){
|
|
65
|
+
.wrap{padding:8px}
|
|
66
|
+
header{flex-wrap:wrap;font-size:12px}
|
|
67
|
+
header .meta{flex-basis:100%}
|
|
68
|
+
}
|
|
69
|
+
</style>
|
|
70
|
+
</head>
|
|
71
|
+
<body>
|
|
72
|
+
<div class="wrap">
|
|
73
|
+
<header>
|
|
74
|
+
<div class="title">${escapeHtml(title)}</div>
|
|
75
|
+
<span class="meta">${created}</span>
|
|
76
|
+
<button id="copy-btn" title="copy raw">📋 Copy</button>
|
|
77
|
+
</header>
|
|
78
|
+
${body}
|
|
79
|
+
<footer>
|
|
80
|
+
Generated by <a href="https://github.com/benking007/agim" target="_blank" rel="noopener">agim</a>
|
|
81
|
+
</footer>
|
|
82
|
+
</div>
|
|
83
|
+
${isMd
|
|
84
|
+
? `
|
|
85
|
+
<script src="https://cdn.jsdelivr.net/npm/marked@14.1.3/marked.min.js" crossorigin="anonymous"></script>
|
|
86
|
+
<script src="https://cdn.jsdelivr.net/npm/dompurify@3.1.7/dist/purify.min.js" crossorigin="anonymous"></script>
|
|
87
|
+
<script src="https://cdn.jsdelivr.net/npm/highlight.js@11.10.0/lib/core.min.js" crossorigin="anonymous"></script>
|
|
88
|
+
<script src="https://cdn.jsdelivr.net/npm/highlight.js@11.10.0/lib/common.min.js" crossorigin="anonymous"></script>
|
|
89
|
+
<script>
|
|
90
|
+
(function(){
|
|
91
|
+
var src = document.getElementById('md-src').textContent;
|
|
92
|
+
var rendered = document.getElementById('rendered');
|
|
93
|
+
rendered.classList.add('markdown-body');
|
|
94
|
+
marked.setOptions({ gfm:true, breaks:false, mangle:false });
|
|
95
|
+
rendered.innerHTML = DOMPurify.sanitize(marked.parse(src));
|
|
96
|
+
rendered.querySelectorAll('pre code').forEach(function(b){
|
|
97
|
+
try { hljs.highlightElement(b); } catch(e){}
|
|
98
|
+
});
|
|
99
|
+
})();
|
|
100
|
+
</script>
|
|
101
|
+
`
|
|
102
|
+
: ''}
|
|
103
|
+
<script>
|
|
104
|
+
document.getElementById('copy-btn').addEventListener('click', function(){
|
|
105
|
+
var src = ${isMd ? "document.getElementById('md-src').textContent" : "document.querySelector('.plain').textContent"};
|
|
106
|
+
navigator.clipboard.writeText(src).then(function(){
|
|
107
|
+
var b = document.getElementById('copy-btn');
|
|
108
|
+
var orig = b.textContent;
|
|
109
|
+
b.textContent = '✓ Copied';
|
|
110
|
+
setTimeout(function(){ b.textContent = orig; }, 1500);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
</script>
|
|
114
|
+
</body>
|
|
115
|
+
</html>`;
|
|
116
|
+
}
|
|
117
|
+
export function renderNotFoundHtml() {
|
|
118
|
+
return `<!doctype html><html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="robots" content="noindex,nofollow"><title>Not Found · agim</title><style>body{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;max-width:680px;margin:60px auto;padding:0 20px;color:#333;line-height:1.6}h1{font-size:24px}.muted{color:#888}</style></head><body><h1>内容不存在</h1><p class="muted">This paste does not exist (or was deleted).</p></body></html>`;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=viewer-render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewer-render.js","sourceRoot":"","sources":["../../src/web/viewer-render.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,wEAAwE;AACxE,qEAAqE;AAIrE,SAAS,UAAU,CAAC,CAA4B;IAC9C,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,EAAE,CAAA;IACxB,OAAO,MAAM,CAAC,CAAC,CAAC;SACb,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;AAC3B,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;AACvF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAa;IAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,KAAK,OAAO,CAAA;IACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAA;IAC1E,wEAAwE;IACxE,wEAAwE;IACxE,2DAA2D;IAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IAEvC,MAAM,IAAI,GAAG,IAAI;QACf,CAAC,CAAC,2BAA2B,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,uDAAuD;QAC3G,CAAC,CAAC,sBAAsB,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAA;IAEzD,OAAO;;;;;;;SAOA,UAAU,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAwCD,UAAU,CAAC,KAAK,CAAC;yBACjB,OAAO;;;IAG5B,IAAI;;;;;EAMJ,IAAI;QACF,CAAC,CAAC;;;;;;;;;;;;;;;;;CAiBP;QACK,CAAC,CAAC,EACN;;;cAGY,IAAI,CAAC,CAAC,CAAC,+CAA+C,CAAC,CAAC,CAAC,8CAA8C;;;;;;;;;;QAU7G,CAAA;AACR,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,yfAAyf,CAAA;AAClgB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agim-cli",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.7",
|
|
4
4
|
"description": "Agim (阿吉姆) — universal messenger-to-agent bridge. Connect WeChat / Feishu / DingTalk / Telegram / Discord to Claude Code / Codex / Copilot / OpenCode, or any custom agent via ACP. Installs the `agim` command.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|