@seqyuan/annovibe 0.8.65 → 0.8.66
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/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +5 -5
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.js +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/agent/runtime/route.js +1 -1
- package/.next/server/app/api/im/cancel/route.js +1 -1
- package/.next/server/app/api/im/gateway-status/route.js +3 -1
- package/.next/server/app/api/im/gateway-token/route.js +3 -1
- package/.next/server/app/api/im/project/route.js +3 -1
- package/.next/server/app/api/im/projects/route.js +3 -1
- package/.next/server/app/api/im/session-ids/route.js +1 -1
- package/.next/server/app/api/im/turn/route.js +4 -2
- package/.next/server/app/api/internal/runtime/route.js +1 -1
- package/.next/server/app/api/version/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +1 -1
- package/.next/server/app/login.rsc +1 -1
- package/.next/server/app/login.segments/_full.segment.rsc +1 -1
- package/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/.next/server/app/login.segments/_index.segment.rsc +1 -1
- package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/.next/server/app/page.js +3 -3
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/smoke/page_client-reference-manifest.js +1 -1
- package/.next/server/app/smoke.html +1 -1
- package/.next/server/app/smoke.rsc +1 -1
- package/.next/server/app/smoke.segments/_full.segment.rsc +1 -1
- package/.next/server/app/smoke.segments/_head.segment.rsc +1 -1
- package/.next/server/app/smoke.segments/_index.segment.rsc +1 -1
- package/.next/server/app/smoke.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/smoke.segments/smoke/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/smoke.segments/smoke.segment.rsc +1 -1
- package/.next/server/app-paths-manifest.json +5 -5
- package/.next/server/chunks/1761.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/next-font-manifest.js +1 -1
- package/.next/server/next-font-manifest.json +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/app/{page-ef274c19b774b6e8.js → page-85499519228afae8.js} +3 -3
- package/bin/annovibe-im-gateway.js +80 -23
- package/package.json +1 -1
- /package/.next/static/{gYvnLqalIPArJaeJwBKwI → kSOfQw2tkIvT6TUDYFA26}/_buildManifest.js +0 -0
- /package/.next/static/{gYvnLqalIPArJaeJwBKwI → kSOfQw2tkIvT6TUDYFA26}/_ssgManifest.js +0 -0
|
@@ -86,27 +86,41 @@ function getBaseUrl() {
|
|
|
86
86
|
return `http://127.0.0.1:${getAnnovibePort()}`;
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
function
|
|
90
|
-
|
|
89
|
+
function getGatewayStatePath() {
|
|
90
|
+
return path.join(getAgentDir(), "im", "gateway.json");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function readGatewayState() {
|
|
91
94
|
try {
|
|
92
|
-
|
|
93
|
-
return typeof state.token === "string" ? state.token.trim() : "";
|
|
95
|
+
return JSON.parse(fs.readFileSync(getGatewayStatePath(), "utf8"));
|
|
94
96
|
} catch {
|
|
95
|
-
return
|
|
97
|
+
return {};
|
|
96
98
|
}
|
|
97
99
|
}
|
|
98
100
|
|
|
101
|
+
function readGatewayToken() {
|
|
102
|
+
const state = readGatewayState();
|
|
103
|
+
return typeof state.token === "string" ? state.token.trim() : "";
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function writeGatewayState(patch) {
|
|
107
|
+
const statePath = getGatewayStatePath();
|
|
108
|
+
try { fs.mkdirSync(path.dirname(statePath), { recursive: true }); } catch {}
|
|
109
|
+
const state = readGatewayState();
|
|
110
|
+
fs.writeFileSync(statePath, JSON.stringify({ ...state, ...patch }, null, 2), "utf8");
|
|
111
|
+
}
|
|
112
|
+
|
|
99
113
|
// ── HTTP helpers ────────────────────────────────────────────────────
|
|
100
114
|
|
|
101
115
|
function getToken() {
|
|
102
116
|
return process.env.ANNOVIBE_GATEWAY_TOKEN?.trim() || readGatewayToken();
|
|
103
117
|
}
|
|
104
118
|
|
|
105
|
-
function
|
|
119
|
+
function requestJsonRaw(method, pathname, body, options = {}) {
|
|
106
120
|
const url = new URL(pathname, getBaseUrl());
|
|
107
121
|
const payload = body === undefined ? undefined : JSON.stringify(body);
|
|
108
122
|
const lib = url.protocol === "https:" ? https : http;
|
|
109
|
-
const token = getToken();
|
|
123
|
+
const token = options.skipAuth ? "" : getToken();
|
|
110
124
|
|
|
111
125
|
return new Promise((resolve, reject) => {
|
|
112
126
|
const req = lib.request(
|
|
@@ -143,6 +157,10 @@ function requestJson(method, pathname, body) {
|
|
|
143
157
|
});
|
|
144
158
|
}
|
|
145
159
|
|
|
160
|
+
function requestJson(method, pathname, body) {
|
|
161
|
+
return requestJsonRaw(method, pathname, body);
|
|
162
|
+
}
|
|
163
|
+
|
|
146
164
|
function formatImApiError(statusCode, message) {
|
|
147
165
|
if (statusCode === 401) {
|
|
148
166
|
return `${message}. Ensure annovibe is running in this Linux account and gateway token is synced (restart annovibe-im-gateway after saving IM settings).`;
|
|
@@ -153,6 +171,18 @@ function formatImApiError(statusCode, message) {
|
|
|
153
171
|
return message;
|
|
154
172
|
}
|
|
155
173
|
|
|
174
|
+
async function syncGatewayTokenFromServer() {
|
|
175
|
+
try {
|
|
176
|
+
const payload = await requestJsonRaw("GET", "/api/im/gateway-token", undefined, { skipAuth: true });
|
|
177
|
+
const serverToken = typeof payload.token === "string" ? payload.token.trim() : "";
|
|
178
|
+
if (!serverToken || readGatewayToken() === serverToken) return;
|
|
179
|
+
writeGatewayState({ token: serverToken });
|
|
180
|
+
console.error("[im] synced gateway token from annovibe server");
|
|
181
|
+
} catch (error) {
|
|
182
|
+
console.error(`[im] could not sync gateway token: ${String(error)}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
156
186
|
/**
|
|
157
187
|
* Consume SSE turn stream, yielding deltas and status changes to callbacks.
|
|
158
188
|
*/
|
|
@@ -546,8 +576,42 @@ class ProjectWeComBridge {
|
|
|
546
576
|
};
|
|
547
577
|
|
|
548
578
|
try {
|
|
579
|
+
let lastPushAt = 0;
|
|
580
|
+
let pendingText = null;
|
|
581
|
+
let pushTimer = null;
|
|
582
|
+
let pushChain = Promise.resolve();
|
|
583
|
+
const pushIntervalMs = 300;
|
|
584
|
+
|
|
585
|
+
const pushImmediate = async (text) => {
|
|
586
|
+
pushChain = pushChain.then(() => pushText(text));
|
|
587
|
+
await pushChain;
|
|
588
|
+
lastPushAt = Date.now();
|
|
589
|
+
};
|
|
590
|
+
|
|
591
|
+
const schedulePush = (text) => {
|
|
592
|
+
pendingText = text;
|
|
593
|
+
const now = Date.now();
|
|
594
|
+
if (now - lastPushAt >= pushIntervalMs) {
|
|
595
|
+
void flushPush();
|
|
596
|
+
return;
|
|
597
|
+
}
|
|
598
|
+
if (pushTimer) return;
|
|
599
|
+
pushTimer = setTimeout(() => { void flushPush(); }, pushIntervalMs - (now - lastPushAt));
|
|
600
|
+
};
|
|
601
|
+
|
|
602
|
+
const flushPush = async () => {
|
|
603
|
+
if (pushTimer) {
|
|
604
|
+
clearTimeout(pushTimer);
|
|
605
|
+
pushTimer = null;
|
|
606
|
+
}
|
|
607
|
+
const text = pendingText;
|
|
608
|
+
if (text === null) return;
|
|
609
|
+
pendingText = null;
|
|
610
|
+
await pushImmediate(text);
|
|
611
|
+
};
|
|
612
|
+
|
|
549
613
|
// Start processing
|
|
550
|
-
await
|
|
614
|
+
await pushImmediate("(working 1s)");
|
|
551
615
|
|
|
552
616
|
refreshTimer = setInterval(() => {
|
|
553
617
|
if (toolsRunning) {
|
|
@@ -565,8 +629,7 @@ class ProjectWeComBridge {
|
|
|
565
629
|
onDelta(text) {
|
|
566
630
|
toolsRunning = false;
|
|
567
631
|
lastText = text;
|
|
568
|
-
|
|
569
|
-
void pushText(text).catch(() => undefined);
|
|
632
|
+
schedulePush(text);
|
|
570
633
|
},
|
|
571
634
|
},
|
|
572
635
|
);
|
|
@@ -578,6 +641,8 @@ class ProjectWeComBridge {
|
|
|
578
641
|
: "No reply from annovibe.";
|
|
579
642
|
const cleaned = cleanImReplyText(lastText || rawReply);
|
|
580
643
|
const finishTextStr = cleaned || "No reply from annovibe.";
|
|
644
|
+
if (pushTimer) clearTimeout(pushTimer);
|
|
645
|
+
pendingText = null;
|
|
581
646
|
await finishText(finishTextStr);
|
|
582
647
|
} catch (error) {
|
|
583
648
|
if (refreshTimer) clearInterval(refreshTimer);
|
|
@@ -597,21 +662,14 @@ class ImGateway {
|
|
|
597
662
|
console.error("[im] Annovibe IM Gateway starting...");
|
|
598
663
|
|
|
599
664
|
// Write gateway state
|
|
600
|
-
const
|
|
601
|
-
|
|
602
|
-
const token = crypto.randomBytes(32).toString("hex");
|
|
603
|
-
fs.writeFileSync(
|
|
604
|
-
path.join(imDir, "gateway.json"),
|
|
605
|
-
JSON.stringify({
|
|
606
|
-
token,
|
|
607
|
-
startedAt: new Date().toISOString(),
|
|
608
|
-
pid: process.pid,
|
|
609
|
-
}, null, 2),
|
|
610
|
-
);
|
|
665
|
+
const token = readGatewayToken() || crypto.randomBytes(32).toString("hex");
|
|
666
|
+
writeGatewayState({ token, startedAt: new Date().toISOString(), pid: process.pid });
|
|
611
667
|
|
|
612
668
|
console.error(`[im] Gateway token: ${token.slice(0, 8)}...`);
|
|
613
669
|
console.error(`[im] Annovibe port: ${getAnnovibePort()}`);
|
|
614
670
|
|
|
671
|
+
await syncGatewayTokenFromServer();
|
|
672
|
+
|
|
615
673
|
// Start config poll
|
|
616
674
|
await this.refreshProjects();
|
|
617
675
|
this.pollTimer = setInterval(() => this.refreshProjects(), 30000);
|
|
@@ -657,8 +715,7 @@ class ImGateway {
|
|
|
657
715
|
this.bridges.clear();
|
|
658
716
|
|
|
659
717
|
try {
|
|
660
|
-
|
|
661
|
-
fs.writeFileSync(statePath, JSON.stringify({ token: "" }, null, 2));
|
|
718
|
+
writeGatewayState({ token: "" });
|
|
662
719
|
} catch {}
|
|
663
720
|
}
|
|
664
721
|
}
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|