helloagents 3.0.35 → 3.0.38

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.
@@ -17,6 +17,19 @@ const PAYLOAD_SESSION_KEYS = [
17
17
  'tab',
18
18
  ]
19
19
 
20
+ const PROJECT_PAYLOAD_SESSION_KEYS = [
21
+ 'sessionId',
22
+ 'session_id',
23
+ 'session',
24
+ 'conversationId',
25
+ 'conversation_id',
26
+ 'conversation',
27
+ 'threadId',
28
+ 'thread_id',
29
+ 'thread-id',
30
+ 'thread',
31
+ ]
32
+
20
33
  const ENV_SESSION_KEYS = [
21
34
  'HELLOAGENTS_NOTIFY_SESSION_ID',
22
35
  'WT_SESSION',
@@ -28,6 +41,21 @@ const ENV_SESSION_KEYS = [
28
41
  'TAB_ID',
29
42
  ]
30
43
 
44
+ const PROJECT_ENV_SESSION_KEYS = [
45
+ 'HELLOAGENTS_NOTIFY_SESSION_ID',
46
+ ]
47
+
48
+ const PROJECT_ALIAS_ENV_SESSION_KEYS = [
49
+ 'HELLOAGENTS_NOTIFY_SESSION_ID',
50
+ 'WT_SESSION',
51
+ 'TERM_SESSION_ID',
52
+ 'KITTY_WINDOW_ID',
53
+ 'ALACRITTY_WINDOW_ID',
54
+ 'WINDOWID',
55
+ 'WEZTERM_PANE',
56
+ 'TAB_ID',
57
+ ]
58
+
31
59
  function readStringCandidate(input, key) {
32
60
  if (!input || typeof input !== 'object') return ''
33
61
  const value = input[key]
@@ -50,23 +78,48 @@ export function sanitizeSessionToken(value = '') {
50
78
  return cleaned.slice(0, 8)
51
79
  }
52
80
 
81
+ function resolveTokenFromKeys(input, keys = []) {
82
+ for (const key of keys) {
83
+ const value = sanitizeSessionToken(readStringCandidate(input, key))
84
+ if (value) return value
85
+ }
86
+ return ''
87
+ }
88
+
53
89
  export function resolveSessionToken({
54
90
  payload = {},
55
91
  env = process.env,
56
92
  ppid = process.ppid,
57
93
  allowPpidFallback = true,
58
94
  } = {}) {
59
- for (const key of PAYLOAD_SESSION_KEYS) {
60
- const value = sanitizeSessionToken(readStringCandidate(payload, key))
61
- if (value) return value
62
- }
95
+ const payloadToken = resolveTokenFromKeys(payload, PAYLOAD_SESSION_KEYS)
96
+ if (payloadToken) return payloadToken
63
97
 
64
- for (const key of ENV_SESSION_KEYS) {
65
- const value = sanitizeSessionToken(env?.[key] || '')
66
- if (value) return value
67
- }
98
+ const envToken = resolveTokenFromKeys(env, ENV_SESSION_KEYS)
99
+ if (envToken) return envToken
68
100
 
69
101
  return allowPpidFallback && ppid ? String(ppid) : ''
70
102
  }
71
103
 
72
- export { ENV_SESSION_KEYS, PAYLOAD_SESSION_KEYS }
104
+ export function resolveProjectSessionToken({
105
+ payload = {},
106
+ env = process.env,
107
+ } = {}) {
108
+ const payloadToken = resolveTokenFromKeys(payload, PROJECT_PAYLOAD_SESSION_KEYS)
109
+ if (payloadToken) return payloadToken
110
+ return resolveTokenFromKeys(env, PROJECT_ENV_SESSION_KEYS)
111
+ }
112
+
113
+ export function resolveProjectSessionAliasToken({
114
+ env = process.env,
115
+ } = {}) {
116
+ return resolveTokenFromKeys(env, PROJECT_ALIAS_ENV_SESSION_KEYS)
117
+ }
118
+
119
+ export {
120
+ ENV_SESSION_KEYS,
121
+ PAYLOAD_SESSION_KEYS,
122
+ PROJECT_ALIAS_ENV_SESSION_KEYS,
123
+ PROJECT_ENV_SESSION_KEYS,
124
+ PROJECT_PAYLOAD_SESSION_KEYS,
125
+ }
@@ -3,6 +3,7 @@ import { dirname } from 'node:path'
3
3
 
4
4
  const STATE_META_BEGIN = '<!-- HELLOAGENTS_STATE_META'
5
5
  const STATE_META_END = 'HELLOAGENTS_STATE_META -->'
6
+ export const AUTO_CREATED_STATE_MARKER = '由运行时自动创建;后续按实际任务重写'
6
7
 
7
8
  function normalizeText(content = '') {
8
9
  return String(content || '').replace(/^\uFEFF/, '')
@@ -62,13 +63,11 @@ export function readStateDocument(filePath) {
62
63
 
63
64
  export function composeStateDocument({ metadata = {}, body = '' } = {}) {
64
65
  const normalizedBody = normalizeText(body).replace(/^\n+/, '')
65
- return [
66
- STATE_META_BEGIN,
67
- JSON.stringify(metadata, null, 2),
68
- STATE_META_END,
69
- '',
70
- normalizedBody,
71
- ].join('\n').replace(/\n+$/, '\n')
66
+ return normalizedBody ? `${normalizedBody.replace(/\n+$/, '')}\n` : ''
67
+ }
68
+
69
+ export function looksLikeAutoCreatedState(body = '') {
70
+ return normalizeText(body).includes(AUTO_CREATED_STATE_MARKER)
72
71
  }
73
72
 
74
73
  export function writeStateDocument(filePath, { metadata = {}, body = '' } = {}) {
@@ -5,7 +5,6 @@ import { fileURLToPath } from 'node:url'
5
5
  import {
6
6
  appendSessionEvent,
7
7
  clearCapsuleSection,
8
- getSessionCapsulePath,
9
8
  getRuntimeScope,
10
9
  readCapsuleSection,
11
10
  writeCapsuleSection,
@@ -108,7 +107,7 @@ export function readTurnState(cwd = process.cwd(), { now = Date.now(), ...option
108
107
  return {
109
108
  cwd: normalizePath(entry.cwd),
110
109
  key: entry.key || '',
111
- path: getSessionCapsulePath(cwd, options),
110
+ path: getRuntimeScope(cwd, options).statePath,
112
111
  updatedAt: entry.updatedAt,
113
112
  ...normalized,
114
113
  }
@@ -288,7 +287,7 @@ function main() {
288
287
  const payload = writeTurnState(cwd, input)
289
288
  process.stdout.write(JSON.stringify({
290
289
  suppressOutput: true,
291
- path: getSessionCapsulePath(cwd, input),
290
+ path: getRuntimeScope(cwd, input).statePath,
292
291
  payload,
293
292
  }))
294
293
  return
@@ -15,10 +15,7 @@ export function getTargetPlans(snapshot) {
15
15
  }
16
16
 
17
17
  function describeStateLabel(state) {
18
- if (state.stateSessionMode === 'default') {
19
- return '当前工作区默认位置的状态文件'
20
- }
21
- return '当前会话的状态文件'
18
+ return '当前工作区状态文件'
22
19
  }
23
20
 
24
21
  export function classifyPlan(plan) {
@@ -188,7 +188,7 @@ export function readStateSnapshot(cwd, options = {}) {
188
188
  stateSessionToken: stateScope.stateSessionToken,
189
189
  stateSessionMode: stateScope.stateSessionMode,
190
190
  stateWorkspace: stateScope.stateWorkspace,
191
- sessionScoped: stateScope.stateScope === 'session',
191
+ sessionScoped: true,
192
192
  exists,
193
193
  content,
194
194
  sections,
File without changes