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
- // A resumed session deliberately retains its original creation time. Its
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
- // A resumed session deliberately retains its original creation time. Its
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 sessionStartedAt = finiteTime(status.session?.startedAt);
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 sessionStartedAt = status.session && typeof status.session === "object"
1603
- ? Date.parse(String(status.session.startedAt || "")) : Number.NaN;
1604
- const sessionCurrent = Number.isFinite(sessionStartedAt) && sessionStartedAt >= Date.parse(daemonStartedAt);
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 sessionStartedAt = status.session && typeof status.session === "object"
1690
- ? Date.parse(String(status.session.startedAt || "")) : Number.NaN;
1691
- const sessionCurrent = Number.isFinite(sessionStartedAt) && sessionStartedAt >= Date.parse(daemonStartedAt);
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 sessionStartedAt = status.session && typeof status.session === "object"
1562
- ? Date.parse(String(status.session.startedAt || "")) : Number.NaN;
1563
- const sessionCurrent = Number.isFinite(sessionStartedAt) && sessionStartedAt >= Date.parse(daemonStartedAt);
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 sessionStartedAt = status.session && typeof status.session === "object"
1649
- ? Date.parse(String(status.session.startedAt || "")) : Number.NaN;
1650
- const sessionCurrent = Number.isFinite(sessionStartedAt) && sessionStartedAt >= Date.parse(daemonStartedAt);
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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "larkin",
3
- "version": "0.5.15",
3
+ "version": "0.5.16",
4
4
  "private": false,
5
5
  "larkinPackageRole": "npm-published",
6
6
  "files": [