larkin 0.5.15 → 0.5.16
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.
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isRuntimeReadinessCurrent = isRuntimeReadinessCurrent;
|
|
4
|
+
exports.isSessionCurrent = isSessionCurrent;
|
|
4
5
|
exports.isCurrentOwnedDaemon = isCurrentOwnedDaemon;
|
|
5
6
|
exports.isChannelReconnecting = isChannelReconnecting;
|
|
6
7
|
exports.projectAgentReadiness = projectAgentReadiness;
|
|
@@ -16,6 +17,14 @@ function isRuntimeReadinessCurrent(readiness, daemonStartedAt) {
|
|
|
16
17
|
const epoch = timestamp(daemonStartedAt);
|
|
17
18
|
return observedAt !== null && epoch !== null && observedAt >= epoch;
|
|
18
19
|
}
|
|
20
|
+
function isSessionCurrent(session, daemonStartedAt) {
|
|
21
|
+
// A resumed session deliberately retains its original creation time. Its
|
|
22
|
+
// current daemon-epoch proof is the fresh session observation, not that
|
|
23
|
+
// historic creation timestamp.
|
|
24
|
+
const epoch = timestamp(daemonStartedAt);
|
|
25
|
+
const sessionObservedAt = timestamp(session?.lastSeenAt) ?? timestamp(session?.startedAt);
|
|
26
|
+
return epoch !== null && sessionObservedAt !== null && sessionObservedAt >= epoch;
|
|
27
|
+
}
|
|
19
28
|
function isCurrentOwnedDaemon(daemon) {
|
|
20
29
|
return daemon?.state === "owned"
|
|
21
30
|
&& Number(daemon.pid) > 0
|
|
@@ -34,11 +43,7 @@ function projectAgentReadiness(input) {
|
|
|
34
43
|
const daemonOwned = isCurrentOwnedDaemon(input.daemon) && (0, process_state_js_1.daemonHasAgent)(input.daemon, input.agentId);
|
|
35
44
|
const daemonStartedAt = timestamp(input.daemon.startedAt);
|
|
36
45
|
const connectedAt = timestamp(status?.connectedAt);
|
|
37
|
-
|
|
38
|
-
// current daemon-epoch proof is the fresh session observation, not that
|
|
39
|
-
// historic creation timestamp.
|
|
40
|
-
const sessionObservedAt = timestamp(status?.session?.lastSeenAt) ?? timestamp(status?.session?.startedAt);
|
|
41
|
-
const sessionCurrent = daemonStartedAt !== null && sessionObservedAt !== null && sessionObservedAt >= daemonStartedAt;
|
|
46
|
+
const sessionCurrent = isSessionCurrent(status?.session, input.daemon.startedAt);
|
|
42
47
|
const channelConnected = daemonOwned
|
|
43
48
|
&& status?.connectedVia === "channel"
|
|
44
49
|
&& daemonStartedAt !== null
|
|
@@ -10,6 +10,14 @@ export function isRuntimeReadinessCurrent(readiness, daemonStartedAt) {
|
|
|
10
10
|
const epoch = timestamp(daemonStartedAt);
|
|
11
11
|
return observedAt !== null && epoch !== null && observedAt >= epoch;
|
|
12
12
|
}
|
|
13
|
+
export function isSessionCurrent(session, daemonStartedAt) {
|
|
14
|
+
// A resumed session deliberately retains its original creation time. Its
|
|
15
|
+
// current daemon-epoch proof is the fresh session observation, not that
|
|
16
|
+
// historic creation timestamp.
|
|
17
|
+
const epoch = timestamp(daemonStartedAt);
|
|
18
|
+
const sessionObservedAt = timestamp(session?.lastSeenAt) ?? timestamp(session?.startedAt);
|
|
19
|
+
return epoch !== null && sessionObservedAt !== null && sessionObservedAt >= epoch;
|
|
20
|
+
}
|
|
13
21
|
export function isCurrentOwnedDaemon(daemon) {
|
|
14
22
|
return daemon?.state === "owned"
|
|
15
23
|
&& Number(daemon.pid) > 0
|
|
@@ -28,11 +36,7 @@ export function projectAgentReadiness(input) {
|
|
|
28
36
|
const daemonOwned = isCurrentOwnedDaemon(input.daemon) && daemonHasAgent(input.daemon, input.agentId);
|
|
29
37
|
const daemonStartedAt = timestamp(input.daemon.startedAt);
|
|
30
38
|
const connectedAt = timestamp(status?.connectedAt);
|
|
31
|
-
|
|
32
|
-
// current daemon-epoch proof is the fresh session observation, not that
|
|
33
|
-
// historic creation timestamp.
|
|
34
|
-
const sessionObservedAt = timestamp(status?.session?.lastSeenAt) ?? timestamp(status?.session?.startedAt);
|
|
35
|
-
const sessionCurrent = daemonStartedAt !== null && sessionObservedAt !== null && sessionObservedAt >= daemonStartedAt;
|
|
39
|
+
const sessionCurrent = isSessionCurrent(status?.session, input.daemon.startedAt);
|
|
36
40
|
const channelConnected = daemonOwned
|
|
37
41
|
&& status?.connectedVia === "channel"
|
|
38
42
|
&& daemonStartedAt !== null
|
|
@@ -7,7 +7,7 @@ import path from "node:path";
|
|
|
7
7
|
import { StringDecoder } from "node:string_decoder";
|
|
8
8
|
import { fileURLToPath } from "node:url";
|
|
9
9
|
import { readJson, readProcessState } from "../platform/process-state.mjs";
|
|
10
|
-
import { isRuntimeReadinessCurrent } from "../app/agent-readiness.mjs";
|
|
10
|
+
import { isRuntimeReadinessCurrent, isSessionCurrent } from "../app/agent-readiness.mjs";
|
|
11
11
|
import { isAllowedDashboardAvatarUrl } from "./dashboard-avatar.mjs";
|
|
12
12
|
import { collectWorkspaceEntry as collectTypedWorkspaceEntry } from "./dashboard-workspace.mjs";
|
|
13
13
|
import { buildFingerprint, packageVersion } from "../platform/build-info.mjs";
|
|
@@ -480,9 +480,7 @@ async function collectAgentStatus(a, configDir, daemonStartedAt, piModelResolver
|
|
|
480
480
|
// 本 agent 专属时间线:三路历史合并按时间倒序,不是全局一条汇总——每个 agent 只看自己的故事。
|
|
481
481
|
const { recentErrors, lastActivity, lastDeliver, feed } = projectStatusTimeline(status);
|
|
482
482
|
const statusReadiness = status.runtimeReadiness;
|
|
483
|
-
const
|
|
484
|
-
const daemonEpoch = finiteTime(daemonStartedAt);
|
|
485
|
-
const sessionCurrent = sessionStartedAt !== null && daemonEpoch !== null && sessionStartedAt >= daemonEpoch;
|
|
483
|
+
const sessionCurrent = isSessionCurrent(status.session, daemonStartedAt);
|
|
486
484
|
const runtimeReadiness = sessionCurrent && isRuntimeReadinessCurrent(statusReadiness, daemonStartedAt)
|
|
487
485
|
|| statusReadiness?.state !== "ready"
|
|
488
486
|
? statusReadiness || null
|
|
@@ -1599,9 +1599,9 @@ function createHostShell({ env = process.env, runtimeHost, channelPackage, event
|
|
|
1599
1599
|
const status = hostState.readStatus(agent);
|
|
1600
1600
|
const turns = status.session && typeof status.session === "object"
|
|
1601
1601
|
? Math.max(0, Number(status.session.turns) || 0) : 0;
|
|
1602
|
-
const
|
|
1603
|
-
?
|
|
1604
|
-
|
|
1602
|
+
const sessionCurrent = (0, agent_readiness_js_1.isSessionCurrent)(status.session && typeof status.session === "object"
|
|
1603
|
+
? status.session
|
|
1604
|
+
: null, daemonStartedAt);
|
|
1605
1605
|
const runtimeReady = sessionCurrent && (0, agent_readiness_js_1.isRuntimeReadinessCurrent)(status.runtimeReadiness, daemonStartedAt);
|
|
1606
1606
|
const pendingCount = stateStore(agent).withInboxTransaction(() => stateStore(agent).readNdjson("inbox").length);
|
|
1607
1607
|
return { turns, runtimeReady, ...connectionState(status), pendingCount };
|
|
@@ -1686,9 +1686,9 @@ function createHostShell({ env = process.env, runtimeHost, channelPackage, event
|
|
|
1686
1686
|
const status = hostState.readStatus(agent);
|
|
1687
1687
|
const turns = status.session && typeof status.session === "object"
|
|
1688
1688
|
? Math.max(0, Number(status.session.turns) || 0) : 0;
|
|
1689
|
-
const
|
|
1690
|
-
?
|
|
1691
|
-
|
|
1689
|
+
const sessionCurrent = (0, agent_readiness_js_1.isSessionCurrent)(status.session && typeof status.session === "object"
|
|
1690
|
+
? status.session
|
|
1691
|
+
: null, daemonStartedAt);
|
|
1692
1692
|
const runtimeReady = sessionCurrent && (0, agent_readiness_js_1.isRuntimeReadinessCurrent)(status.runtimeReadiness, daemonStartedAt);
|
|
1693
1693
|
const pendingCount = stateStore(agent).withInboxTransaction(() => stateStore(agent).readNdjson("inbox").length);
|
|
1694
1694
|
return { turns, runtimeReady, ...connectionState(status), pendingCount };
|
|
@@ -23,7 +23,7 @@ import { readDocumentCommentSubscription, verifyCallbackProbe } from "../platfor
|
|
|
23
23
|
import { loadConfig, resolveInboxAuditSchedule, resolveMentionPolicy } from "../platform/config.mjs";
|
|
24
24
|
import { processCommandToken } from "../app/internal-command.mjs";
|
|
25
25
|
import { managedOfficialLarkCli } from "../app/agent-lark-cli-workspace.mjs";
|
|
26
|
-
import { isChannelReconnecting, isRuntimeReadinessCurrent } from "../app/agent-readiness.mjs";
|
|
26
|
+
import { isChannelReconnecting, isRuntimeReadinessCurrent, isSessionCurrent } from "../app/agent-readiness.mjs";
|
|
27
27
|
import { documentCommentMessageId, documentCommentNoticeType, projectDocumentCommentEnvelope, resolveDocumentCommentContext, } from "./document-comment.mjs";
|
|
28
28
|
import { isOpenPlatformHost, requireOpenDomain } from "./platform-hosts.mjs";
|
|
29
29
|
const PENDING_DOCUMENT_COMMENT_LIMIT = 256;
|
|
@@ -1558,9 +1558,9 @@ export function createHostShell({ env = process.env, runtimeHost, channelPackage
|
|
|
1558
1558
|
const status = hostState.readStatus(agent);
|
|
1559
1559
|
const turns = status.session && typeof status.session === "object"
|
|
1560
1560
|
? Math.max(0, Number(status.session.turns) || 0) : 0;
|
|
1561
|
-
const
|
|
1562
|
-
?
|
|
1563
|
-
|
|
1561
|
+
const sessionCurrent = isSessionCurrent(status.session && typeof status.session === "object"
|
|
1562
|
+
? status.session
|
|
1563
|
+
: null, daemonStartedAt);
|
|
1564
1564
|
const runtimeReady = sessionCurrent && isRuntimeReadinessCurrent(status.runtimeReadiness, daemonStartedAt);
|
|
1565
1565
|
const pendingCount = stateStore(agent).withInboxTransaction(() => stateStore(agent).readNdjson("inbox").length);
|
|
1566
1566
|
return { turns, runtimeReady, ...connectionState(status), pendingCount };
|
|
@@ -1645,9 +1645,9 @@ export function createHostShell({ env = process.env, runtimeHost, channelPackage
|
|
|
1645
1645
|
const status = hostState.readStatus(agent);
|
|
1646
1646
|
const turns = status.session && typeof status.session === "object"
|
|
1647
1647
|
? Math.max(0, Number(status.session.turns) || 0) : 0;
|
|
1648
|
-
const
|
|
1649
|
-
?
|
|
1650
|
-
|
|
1648
|
+
const sessionCurrent = isSessionCurrent(status.session && typeof status.session === "object"
|
|
1649
|
+
? status.session
|
|
1650
|
+
: null, daemonStartedAt);
|
|
1651
1651
|
const runtimeReady = sessionCurrent && isRuntimeReadinessCurrent(status.runtimeReadiness, daemonStartedAt);
|
|
1652
1652
|
const pendingCount = stateStore(agent).withInboxTransaction(() => stateStore(agent).readNdjson("inbox").length);
|
|
1653
1653
|
return { turns, runtimeReady, ...connectionState(status), pendingCount };
|