@lemoncat7/dsh-partner 2.8.3 → 2.8.4

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.
Files changed (165) hide show
  1. package/README.md +27 -406
  2. package/docs/bark-notifications.md +27 -0
  3. package/docs/concern-workflow.md +39 -0
  4. package/docs/releases/1.12.0.md +16 -0
  5. package/docs/releases/1.14.2.md +8 -0
  6. package/docs/releases/1.15.0.md +15 -0
  7. package/docs/releases/1.16.0.md +15 -0
  8. package/docs/releases/1.16.1.md +12 -0
  9. package/docs/releases/1.16.2.md +12 -0
  10. package/docs/releases/2.0.0.md +19 -0
  11. package/docs/releases/2.1.0.md +8 -0
  12. package/docs/releases/2.2.0.md +8 -0
  13. package/docs/releases/2.3.0.md +8 -0
  14. package/docs/releases/2.4.0.md +8 -0
  15. package/docs/releases/2.5.0.md +8 -0
  16. package/docs/releases/2.8.0.md +6 -0
  17. package/docs/releases/2.8.4.md +35 -0
  18. package/docs/releases/README.md +14 -0
  19. package/lib/agent-runtime.d.ts +1 -0
  20. package/lib/agent-runtime.d.ts.map +1 -1
  21. package/lib/agent-runtime.js +14 -5
  22. package/lib/agent-runtime.js.map +1 -1
  23. package/lib/api/features/push-api.d.ts +4 -0
  24. package/lib/api/features/push-api.d.ts.map +1 -0
  25. package/lib/api/features/push-api.js +47 -0
  26. package/lib/api/features/push-api.js.map +1 -0
  27. package/lib/api.d.ts +2 -0
  28. package/lib/api.d.ts.map +1 -1
  29. package/lib/api.js +5 -1
  30. package/lib/api.js.map +1 -1
  31. package/lib/autonomy.d.ts.map +1 -1
  32. package/lib/autonomy.js +5 -4
  33. package/lib/autonomy.js.map +1 -1
  34. package/lib/client-api.d.ts +1 -0
  35. package/lib/client-api.d.ts.map +1 -1
  36. package/lib/client-api.js.map +1 -1
  37. package/lib/client.d.ts.map +1 -1
  38. package/lib/client.js +1157 -638
  39. package/lib/client.js.map +4 -4
  40. package/lib/collaboration/composition.d.ts.map +1 -1
  41. package/lib/collaboration/composition.js +1 -0
  42. package/lib/collaboration/composition.js.map +1 -1
  43. package/lib/collaboration/ssh-task-access.d.ts +33 -0
  44. package/lib/collaboration/ssh-task-access.d.ts.map +1 -0
  45. package/lib/collaboration/ssh-task-access.js +26 -0
  46. package/lib/collaboration/ssh-task-access.js.map +1 -0
  47. package/lib/companions/removal.d.ts.map +1 -1
  48. package/lib/companions/removal.js +4 -0
  49. package/lib/companions/removal.js.map +1 -1
  50. package/lib/concern-domain.d.ts +2 -0
  51. package/lib/concern-domain.d.ts.map +1 -1
  52. package/lib/concern-domain.js.map +1 -1
  53. package/lib/concern-execution-notes.d.ts +2 -0
  54. package/lib/concern-execution-notes.d.ts.map +1 -1
  55. package/lib/concern-execution-notes.js +9 -2
  56. package/lib/concern-execution-notes.js.map +1 -1
  57. package/lib/concern-execution-receipt.d.ts.map +1 -1
  58. package/lib/concern-execution-receipt.js +3 -2
  59. package/lib/concern-execution-receipt.js.map +1 -1
  60. package/lib/concern-execution.d.ts.map +1 -1
  61. package/lib/concern-execution.js +1 -0
  62. package/lib/concern-execution.js.map +1 -1
  63. package/lib/concern-knowledge-source.d.ts +23 -0
  64. package/lib/concern-knowledge-source.d.ts.map +1 -0
  65. package/lib/concern-knowledge-source.js +30 -0
  66. package/lib/concern-knowledge-source.js.map +1 -0
  67. package/lib/concern-note-source.d.ts +2 -1
  68. package/lib/concern-note-source.d.ts.map +1 -1
  69. package/lib/concern-note-source.js +6 -2
  70. package/lib/concern-note-source.js.map +1 -1
  71. package/lib/concern-store.d.ts.map +1 -1
  72. package/lib/concern-store.js +5 -0
  73. package/lib/concern-store.js.map +1 -1
  74. package/lib/domain.d.ts +2 -0
  75. package/lib/domain.d.ts.map +1 -1
  76. package/lib/domain.js.map +1 -1
  77. package/lib/index.d.ts.map +1 -1
  78. package/lib/index.js +18 -1
  79. package/lib/index.js.map +1 -1
  80. package/lib/notifications/bark-adapter.d.ts +9 -0
  81. package/lib/notifications/bark-adapter.d.ts.map +1 -0
  82. package/lib/notifications/bark-adapter.js +69 -0
  83. package/lib/notifications/bark-adapter.js.map +1 -0
  84. package/lib/notifications/push-config.d.ts +10 -0
  85. package/lib/notifications/push-config.d.ts.map +1 -0
  86. package/lib/notifications/push-config.js +79 -0
  87. package/lib/notifications/push-config.js.map +1 -0
  88. package/lib/notifications/push-credentials.d.ts +9 -0
  89. package/lib/notifications/push-credentials.d.ts.map +1 -0
  90. package/lib/notifications/push-credentials.js +16 -0
  91. package/lib/notifications/push-credentials.js.map +1 -0
  92. package/lib/notifications/push-domain.d.ts +66 -0
  93. package/lib/notifications/push-domain.d.ts.map +1 -0
  94. package/lib/notifications/push-domain.js +6 -0
  95. package/lib/notifications/push-domain.js.map +1 -0
  96. package/lib/notifications/push-observer.d.ts +19 -0
  97. package/lib/notifications/push-observer.d.ts.map +1 -0
  98. package/lib/notifications/push-observer.js +96 -0
  99. package/lib/notifications/push-observer.js.map +1 -0
  100. package/lib/notifications/push-service.d.ts +33 -0
  101. package/lib/notifications/push-service.d.ts.map +1 -0
  102. package/lib/notifications/push-service.js +228 -0
  103. package/lib/notifications/push-service.js.map +1 -0
  104. package/lib/notifications/push-state.d.ts +3 -0
  105. package/lib/notifications/push-state.d.ts.map +1 -0
  106. package/lib/notifications/push-state.js +23 -0
  107. package/lib/notifications/push-state.js.map +1 -0
  108. package/lib/observation-budget.d.ts +3 -2
  109. package/lib/observation-budget.d.ts.map +1 -1
  110. package/lib/observation-budget.js +5 -3
  111. package/lib/observation-budget.js.map +1 -1
  112. package/lib/observation-loop.d.ts +1 -0
  113. package/lib/observation-loop.d.ts.map +1 -1
  114. package/lib/observation-loop.js +129 -21
  115. package/lib/observation-loop.js.map +1 -1
  116. package/lib/observation-model-retry.d.ts +20 -0
  117. package/lib/observation-model-retry.d.ts.map +1 -0
  118. package/lib/observation-model-retry.js +48 -0
  119. package/lib/observation-model-retry.js.map +1 -0
  120. package/lib/observation-progress.d.ts +1 -0
  121. package/lib/observation-progress.d.ts.map +1 -1
  122. package/lib/observation-progress.js +24 -4
  123. package/lib/observation-progress.js.map +1 -1
  124. package/lib/observation-workflow.d.ts +40 -0
  125. package/lib/observation-workflow.d.ts.map +1 -0
  126. package/lib/observation-workflow.js +154 -0
  127. package/lib/observation-workflow.js.map +1 -0
  128. package/lib/recording-snapshot.d.ts.map +1 -1
  129. package/lib/recording-snapshot.js +12 -2
  130. package/lib/recording-snapshot.js.map +1 -1
  131. package/lib/storage/migrate-layout.d.ts.map +1 -1
  132. package/lib/storage/migrate-layout.js +2 -0
  133. package/lib/storage/migrate-layout.js.map +1 -1
  134. package/lib/storage/split-state.js +2 -2
  135. package/lib/storage/split-state.js.map +1 -1
  136. package/lib/store.d.ts.map +1 -1
  137. package/lib/store.js +2 -0
  138. package/lib/store.js.map +1 -1
  139. package/lib/ui/capability-editor.d.ts.map +1 -1
  140. package/lib/ui/capability-editor.js +3 -5
  141. package/lib/ui/capability-editor.js.map +1 -1
  142. package/lib/ui/channels-panel.d.ts.map +1 -1
  143. package/lib/ui/channels-panel.js +7 -1
  144. package/lib/ui/channels-panel.js.map +1 -1
  145. package/lib/ui/push-channels.d.ts +11 -0
  146. package/lib/ui/push-channels.d.ts.map +1 -0
  147. package/lib/ui/push-channels.js +28 -0
  148. package/lib/ui/push-channels.js.map +1 -0
  149. package/lib/ui/push-draft.d.ts +30 -0
  150. package/lib/ui/push-draft.d.ts.map +1 -0
  151. package/lib/ui/push-draft.js +13 -0
  152. package/lib/ui/push-draft.js.map +1 -0
  153. package/lib/ui/push-editor.d.ts +10 -0
  154. package/lib/ui/push-editor.d.ts.map +1 -0
  155. package/lib/ui/push-editor.js +99 -0
  156. package/lib/ui/push-editor.js.map +1 -0
  157. package/lib/ui/runtime-settings.d.ts +18 -0
  158. package/lib/ui/runtime-settings.d.ts.map +1 -0
  159. package/lib/ui/runtime-settings.js +25 -0
  160. package/lib/ui/runtime-settings.js.map +1 -0
  161. package/lib/ui/workspace-components.d.ts +7 -1
  162. package/lib/ui/workspace-components.d.ts.map +1 -1
  163. package/lib/ui/workspace-components.js +8 -4
  164. package/lib/ui/workspace-components.js.map +1 -1
  165. package/package.json +4 -1
@@ -0,0 +1,228 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { httpError } from '../api/http.js';
3
+ import { parsePushChannel } from './push-config.js';
4
+ import { barkAdapter, PushSendError } from './bark-adapter.js';
5
+ import { pushSummary } from './push-domain.js';
6
+ /** Durable outbox independent of chat routing, pairing and conversation speed. */
7
+ export class PushService {
8
+ store;
9
+ vault;
10
+ report;
11
+ adapters;
12
+ shutdown = new AbortController();
13
+ timer;
14
+ running;
15
+ writes = Promise.resolve();
16
+ constructor(store, vault, report, adapters = { bark: barkAdapter }) {
17
+ this.store = store;
18
+ this.vault = vault;
19
+ this.report = report;
20
+ this.adapters = adapters;
21
+ }
22
+ views(companionId) {
23
+ const state = this.store.snapshot();
24
+ return (state.pushChannels ?? []).filter(c => !companionId || c.companionId === companionId).map(c => {
25
+ const rows = (state.pushDeliveries ?? []).filter(r => r.channelId === c.id).sort((a, b) => b.updatedAt - a.updatedAt);
26
+ const last = rows[0];
27
+ return { ...c, targets: c.targets.map(({ id, name, enabled }) => ({ id, name, enabled, configured: true })),
28
+ pending: rows.filter(r => ['pending', 'sending'].includes(r.status)).length, failed: rows.filter(r => r.status === 'failed').length,
29
+ ...(last ? { lastDelivery: { status: last.status, updatedAt: last.updatedAt, ...(last.lastError ? { lastError: last.lastError } : {}) } } : {}) };
30
+ });
31
+ }
32
+ require(id) {
33
+ const channel = this.store.snapshot().pushChannels?.find(c => c.id === id);
34
+ if (!channel)
35
+ throw httpError(404, '推送渠道不存在');
36
+ return channel;
37
+ }
38
+ serial(fn) {
39
+ const result = this.writes.then(fn);
40
+ this.writes = result.catch(() => { });
41
+ return result;
42
+ }
43
+ save(companionId, raw, id) {
44
+ return this.serial(async () => {
45
+ const state = this.store.snapshot(), previous = id ? this.require(id) : undefined;
46
+ if (!state.companions.some(c => c.id === companionId) || this.store.isCompanionRemoving(companionId))
47
+ throw httpError(404, '伙伴不存在或正在删除');
48
+ if (previous && previous.companionId !== companionId)
49
+ throw httpError(400, '渠道不属于该伙伴');
50
+ if (previous && raw.revision !== previous.revision)
51
+ throw httpError(409, '渠道已更新,请重新打开配置');
52
+ if (!previous && (state.pushChannels ?? []).filter(c => c.companionId === companionId).length >= 20)
53
+ throw httpError(400, '每位伙伴最多配置 20 个推送服务器');
54
+ const { channel, secrets } = parsePushChannel(raw, companionId, previous);
55
+ try {
56
+ for (const secret of secrets)
57
+ await this.vault.write(secret.id, secret.key);
58
+ await this.store.update(draft => {
59
+ if (!draft.companions.some(c => c.id === companionId) || this.store.isCompanionRemoving(companionId))
60
+ throw httpError(409, '伙伴正在删除');
61
+ if (previous && draft.pushChannels?.find(c => c.id === id)?.revision !== previous.revision)
62
+ throw httpError(409, '渠道已更新,请重新打开配置');
63
+ draft.pushChannels = [...(draft.pushChannels ?? []).filter(c => c.id !== channel.id), channel];
64
+ for (const row of draft.pushDeliveries ?? [])
65
+ if (row.channelId === channel.id && ['pending', 'sending', 'failed'].includes(row.status)) {
66
+ row.status = 'canceled';
67
+ row.updatedAt = Date.now();
68
+ row.lastError = '渠道配置已修改,旧通知已取消,避免发给新目标';
69
+ }
70
+ });
71
+ }
72
+ catch (error) {
73
+ await Promise.all(secrets.map(s => this.vault.delete(s.id).catch(() => { })));
74
+ throw error;
75
+ }
76
+ for (const target of previous?.targets ?? [])
77
+ if (!channel.targets.some(t => t.credentialId === target.credentialId))
78
+ await this.vault.delete(target.credentialId).catch(() => this.report('旧推送凭据清理失败'));
79
+ return this.views(companionId).find(c => c.id === channel.id);
80
+ });
81
+ }
82
+ remove(id) {
83
+ return this.serial(async () => {
84
+ const channel = this.require(id);
85
+ await this.store.update(state => {
86
+ state.pushChannels = (state.pushChannels ?? []).filter(c => c.id !== id);
87
+ state.pushDeliveries = (state.pushDeliveries ?? []).filter(r => r.channelId !== id);
88
+ });
89
+ await Promise.all(channel.targets.map(t => this.vault.delete(t.credentialId).catch(() => this.report('推送凭据清理失败'))));
90
+ });
91
+ }
92
+ async removeOwner(id) {
93
+ for (const channel of this.store.snapshot().pushChannels ?? [])
94
+ if (channel.companionId === id)
95
+ await this.remove(channel.id);
96
+ }
97
+ deliveries(id) { this.require(id); return (this.store.snapshot().pushDeliveries ?? []).filter(r => r.channelId === id).sort((a, b) => b.createdAt - a.createdAt).slice(0, 100); }
98
+ async clearHistory(id) {
99
+ this.require(id);
100
+ await this.store.update(state => { state.pushDeliveries = (state.pushDeliveries ?? []).filter(r => r.channelId !== id || !['accepted', 'canceled'].includes(r.status)); });
101
+ }
102
+ async retry(id, rowId) {
103
+ await this.store.update(state => {
104
+ const channel = state.pushChannels?.find(c => c.id === id);
105
+ const row = state.pushDeliveries?.find(r => r.id === rowId && r.channelId === id);
106
+ if (!row || row.status !== 'failed')
107
+ throw httpError(400, '仅可重试失败的通知');
108
+ if (!channel?.enabled || channel.revision !== row.revision || !channel.targets.some(t => t.id === row.targetId && t.enabled))
109
+ throw httpError(400, '原接收目标已失效,不能重试');
110
+ row.status = 'pending';
111
+ row.attempts = 0;
112
+ row.nextAttemptAt = Date.now();
113
+ row.updatedAt = Date.now();
114
+ row.expiresAt = Date.now() + 86400_000;
115
+ delete row.lastError;
116
+ });
117
+ this.kick();
118
+ }
119
+ async test(id, targetId) {
120
+ const channel = this.require(id), target = channel.targets.find(t => t.id === targetId);
121
+ if (!target)
122
+ throw httpError(404, '发送目标不存在');
123
+ await this.adapters[channel.platform].send(channel, await this.vault.read(target.credentialId), {
124
+ title: 'DSH 伙伴 · Bark 测试', body: `这是一条测试通知,来自“${channel.name}”。能看到此消息说明手机推送可达。`,
125
+ }, this.shutdown.signal);
126
+ }
127
+ async enqueue(event) {
128
+ if (this.shutdown.signal.aborted)
129
+ return;
130
+ const eligible = (this.store.snapshot().pushChannels ?? []).some(c => c.companionId === event.companionId && c.enabled);
131
+ if (!eligible)
132
+ return;
133
+ await this.store.update(state => {
134
+ const rows = state.pushDeliveries ??= [], seen = new Set();
135
+ for (const c of state.pushChannels ?? []) {
136
+ if (!c.enabled || c.companionId !== event.companionId || event.createdAt < c.createdAt || (event.outcome === 'problem' && !c.notifyProblems))
137
+ continue;
138
+ for (const t of c.targets.filter(t => t.enabled)) {
139
+ const recipient = `${c.baseUrl}:${t.fingerprint}`;
140
+ if (seen.has(recipient))
141
+ continue;
142
+ seen.add(recipient);
143
+ const id = createHash('sha256').update(JSON.stringify([event.id, event.companionId, recipient])).digest('hex');
144
+ if (rows.some(r => r.id === id))
145
+ continue;
146
+ while (rows.length >= 1000) {
147
+ const index = rows.findIndex(r => ['accepted', 'canceled'].includes(r.status) && r.createdAt < Date.now() - 7 * 86400_000);
148
+ if (index < 0)
149
+ throw Error('Bark 通知记录已满,请清理发送记录');
150
+ rows.splice(index, 1);
151
+ }
152
+ rows.push({ id, companionId: event.companionId, eventId: event.id, channelId: c.id, targetId: t.id, revision: c.revision,
153
+ title: event.title.slice(0, 120), body: c.content === 'title' ? '请返回 DSH 查看伙伴会话。' : pushSummary(event.text) || '本轮已完成,请查看会话。',
154
+ createdAt: event.createdAt, updatedAt: Date.now(), nextAttemptAt: Date.now(), status: 'pending', attempts: 0 });
155
+ }
156
+ }
157
+ });
158
+ this.kick();
159
+ }
160
+ async start() {
161
+ if (this.store.snapshot().pushDeliveries?.some(r => r.status === 'sending'))
162
+ await this.store.update(state => { for (const row of state.pushDeliveries ?? [])
163
+ if (row.status === 'sending') {
164
+ row.status = 'pending';
165
+ row.nextAttemptAt = Date.now();
166
+ } });
167
+ this.timer = setInterval(() => this.kick(), 15_000);
168
+ this.timer.unref();
169
+ this.kick();
170
+ }
171
+ kick() { if (!this.running && !this.shutdown.signal.aborted) {
172
+ this.running = this.flush().catch(() => this.report('推送队列处理失败,将自动重试')).finally(() => { delete this.running; });
173
+ } }
174
+ async flush() {
175
+ const rows = (this.store.snapshot().pushDeliveries ?? []).filter(r => r.status === 'pending' && r.nextAttemptAt <= Date.now()).slice(0, 30);
176
+ let cursor = 0;
177
+ await Promise.all(Array.from({ length: Math.min(3, rows.length) }, async () => {
178
+ while (!this.shutdown.signal.aborted && cursor < rows.length)
179
+ await this.send(rows[cursor++]);
180
+ }));
181
+ }
182
+ async send(row) {
183
+ if (Date.now() > (row.expiresAt ?? row.createdAt + 86400_000)) {
184
+ await this.patch(row.id, r => { if (r.status === 'pending') {
185
+ r.status = 'failed';
186
+ r.lastError = '通知已超过 24 小时,停止自动补发';
187
+ } });
188
+ return;
189
+ }
190
+ const state = this.store.snapshot(), channel = state.pushChannels?.find(c => c.id === row.channelId), target = channel?.targets.find(t => t.id === row.targetId);
191
+ if (!channel?.enabled || !target?.enabled || channel.revision !== row.revision || !state.companions.some(c => c.id === row.companionId) || this.store.isCompanionRemoving(row.companionId)) {
192
+ await this.patch(row.id, r => { r.status = 'canceled'; r.lastError = '原渠道或接收目标已停用'; });
193
+ return;
194
+ }
195
+ let claimed = false;
196
+ await this.patch(row.id, r => { if (r.status === 'pending' && r.revision === channel.revision) {
197
+ r.status = 'sending';
198
+ r.attempts++;
199
+ claimed = true;
200
+ } });
201
+ if (!claimed)
202
+ return;
203
+ try {
204
+ const key = await this.vault.read(target.credentialId);
205
+ await this.adapters[channel.platform].send(channel, key, row, this.shutdown.signal);
206
+ await this.patch(row.id, r => { if (r.status === 'sending') {
207
+ r.status = 'accepted';
208
+ delete r.lastError;
209
+ } });
210
+ }
211
+ catch (error) {
212
+ await this.patch(row.id, r => {
213
+ if (r.status !== 'sending')
214
+ return;
215
+ const retry = this.shutdown.signal.aborted || (error instanceof PushSendError && error.retryable && r.attempts < 5);
216
+ r.status = retry ? 'pending' : 'failed';
217
+ r.nextAttemptAt = Date.now() + Math.min(300_000, 15_000 * 2 ** (r.attempts - 1));
218
+ r.lastError = error instanceof PushSendError ? error.message : '推送凭据或配置不可用,请检查后重试';
219
+ });
220
+ }
221
+ }
222
+ async patch(id, change) { await this.store.update(state => { const row = state.pushDeliveries?.find(r => r.id === id); if (row) {
223
+ change(row);
224
+ row.updatedAt = Date.now();
225
+ } }); }
226
+ async close() { this.shutdown.abort(); clearInterval(this.timer); await this.running; await this.writes; }
227
+ }
228
+ //# sourceMappingURL=push-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-service.js","sourceRoot":"","sources":["../../src/notifications/push-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PartnerState } from '../domain.js';
2
+ export declare function validatePushState(state: Partial<PartnerState>): void;
3
+ //# sourceMappingURL=push-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-state.d.ts","sourceRoot":"","sources":["../../src/notifications/push-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAiBpE"}
@@ -0,0 +1,23 @@
1
+ export function validatePushState(state) {
2
+ if (state.pushChannels !== undefined && !Array.isArray(state.pushChannels))
3
+ throw Error('invalid push channels');
4
+ const ids = new Set();
5
+ for (const c of state.pushChannels ?? []) {
6
+ if (!c || typeof c.id !== 'string' || ids.has(c.id) || c.platform !== 'bark' || !state.companions?.some(owner => owner.id === c.companionId)
7
+ || typeof c.name !== 'string' || typeof c.baseUrl !== 'string' || typeof c.enabled !== 'boolean' || !Number.isSafeInteger(c.revision)
8
+ || !Array.isArray(c.targets) || c.targets.length > 50 || !c.targets.length
9
+ || c.targets.some(t => !t || typeof t.id !== 'string' || typeof t.name !== 'string' || typeof t.enabled !== 'boolean' || !/^push-[a-z0-9-]+$/.test(t.credentialId) || !/^[a-f0-9]{64}$/.test(t.fingerprint)))
10
+ throw Error('invalid push channel configuration');
11
+ ids.add(c.id);
12
+ }
13
+ if (state.pushDeliveries !== undefined && (!Array.isArray(state.pushDeliveries) || state.pushDeliveries.length > 1000))
14
+ throw Error('invalid push outbox');
15
+ for (const r of state.pushDeliveries ?? []) {
16
+ if (!r || typeof r.id !== 'string' || typeof r.companionId !== 'string' || typeof r.channelId !== 'string' || typeof r.targetId !== 'string'
17
+ || typeof r.title !== 'string' || typeof r.body !== 'string' || !Number.isFinite(r.createdAt) || !Number.isFinite(r.nextAttemptAt)
18
+ || (r.expiresAt !== undefined && !Number.isFinite(r.expiresAt))
19
+ || !['pending', 'sending', 'accepted', 'failed', 'canceled'].includes(r.status) || !Number.isSafeInteger(r.attempts))
20
+ throw Error('invalid push delivery');
21
+ }
22
+ }
23
+ //# sourceMappingURL=push-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-state.js","sourceRoot":"","sources":["../../src/notifications/push-state.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  /** Per concern: bounded reasoning rounds, with an independent final response. */
2
2
  export declare const OBSERVATION_CHECK_ROUNDS = 12;
3
+ export declare const OBSERVATION_PREPARATION_ROUNDS = 8;
3
4
  export declare const OBSERVATION_MODEL_TIMEOUT_MS = 180000;
4
5
  export declare const OBSERVATION_TOOL_TIMEOUT_MS = 60000;
5
- export declare function observationBudget(round: number): {
6
+ export declare function observationBudget(round: number, preparationRounds?: number): {
6
7
  checking: boolean;
7
8
  };
8
- export declare const observationFinalInstruction = "\u68C0\u67E5\u9636\u6BB5\u5DF2\u7ED3\u675F\u3002\u53EA\u57FA\u4E8E\u5DF2\u5B8C\u6574\u8FD4\u56DE\u7684\u8BC1\u636E\u8F93\u51FA\u7EA6\u5B9A JSON\uFF0C\u4E0D\u8C03\u7528\u5DE5\u5177\uFF0C\u4E0D\u8865\u9020\u8BC1\u636E\u3002\u5FC5\u8981\u6B65\u9AA4\u672A\u5B8C\u6210\u7684\u5173\u6CE8\u5FC5\u987B\u6807\u8BB0 blocked\uFF0C\u5E76\u8BF4\u660E\u672A\u5B8C\u6210\u6B65\u9AA4\uFF1B\u5DF2\u6838\u5B9E\u7684\u5173\u6CE8\u53EF\u6B63\u5E38\u8FD4\u56DE\u3002\u672A\u6210\u529F\u5199\u5165\u8BB0\u5F55\u4E0D\u5F97\u58F0\u79F0\u5DF2\u8BB0\u5F55\u3002";
9
+ export declare const observationFinalInstruction = "\u68C0\u67E5\u9636\u6BB5\u5DF2\u7ED3\u675F\u3002\u53EA\u57FA\u4E8E\u5DF2\u5B8C\u6574\u8FD4\u56DE\u7684\u8BC1\u636E\u8F93\u51FA\u7EA6\u5B9A JSON\uFF0C\u4E0D\u8C03\u7528\u5DE5\u5177\uFF0C\u4E0D\u8865\u9020\u8BC1\u636E\u3002\u6BCF\u9879 observations \u53EF\u7528 workflowChecks \u6570\u7EC4\u4E00\u6B21\u767B\u8BB0\u5DF2\u89C4\u5212\u7684\u68C0\u67E5\u6B65\u9AA4\uFF0C\u6BCF\u9879\u4E3A {stepId,status:\"completed\"|\"blocked\",evidence}\uFF1B\u5DF2\u7ECF\u6838\u5B9E\u4F46\u672A\u8C03\u7528 update \u767B\u8BB0\u7684\u6B65\u9AA4\u5728\u6B64\u63D0\u4EA4\u5373\u53EF\uFF0C\u4E0D\u5E94\u4EC5\u56E0\u5C11\u4E00\u6B21\u767B\u8BB0\u8C03\u7528\u5224\u4E3A\u53D7\u963B\u3002\u5FC5\u8981\u6838\u9A8C\u672A\u5B9E\u9645\u5B8C\u6210\u7684\u5173\u6CE8\u4ECD\u987B\u6807\u8BB0 blocked\uFF1Bexecute \u9636\u6BB5\u5C1A\u672A\u6267\u884C\u4E0D\u662F\u68C0\u67E5\u53D7\u963B\u3002\u672A\u6210\u529F\u5199\u5165\u8BB0\u5F55\u4E0D\u5F97\u58F0\u79F0\u5DF2\u8BB0\u5F55\u3002";
9
10
  //# sourceMappingURL=observation-budget.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"observation-budget.d.ts","sourceRoot":"","sources":["../src/observation-budget.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,eAAO,MAAM,wBAAwB,KAAK,CAAA;AAC1C,eAAO,MAAM,4BAA4B,SAAU,CAAA;AACnD,eAAO,MAAM,2BAA2B,QAAS,CAAA;AACjD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM;;EAE9C;AAED,eAAO,MAAM,2BAA2B,4hBAAyG,CAAA"}
1
+ {"version":3,"file":"observation-budget.d.ts","sourceRoot":"","sources":["../src/observation-budget.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,eAAO,MAAM,wBAAwB,KAAK,CAAA;AAC1C,eAAO,MAAM,8BAA8B,IAAI,CAAA;AAC/C,eAAO,MAAM,4BAA4B,SAAU,CAAA;AACnD,eAAO,MAAM,2BAA2B,QAAS,CAAA;AACjD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,iBAAiB,SAAI;;EAGrE;AAED,eAAO,MAAM,2BAA2B,27BAA2P,CAAA"}
@@ -1,9 +1,11 @@
1
1
  /** Per concern: bounded reasoning rounds, with an independent final response. */
2
2
  export const OBSERVATION_CHECK_ROUNDS = 12;
3
+ export const OBSERVATION_PREPARATION_ROUNDS = 8;
3
4
  export const OBSERVATION_MODEL_TIMEOUT_MS = 180_000;
4
5
  export const OBSERVATION_TOOL_TIMEOUT_MS = 60_000;
5
- export function observationBudget(round) {
6
- return { checking: round < OBSERVATION_CHECK_ROUNDS };
6
+ export function observationBudget(round, preparationRounds = 0) {
7
+ const preparation = Math.max(0, Math.min(OBSERVATION_PREPARATION_ROUNDS, preparationRounds));
8
+ return { checking: round - preparation < OBSERVATION_CHECK_ROUNDS && round < OBSERVATION_CHECK_ROUNDS + OBSERVATION_PREPARATION_ROUNDS };
7
9
  }
8
- export const observationFinalInstruction = '检查阶段已结束。只基于已完整返回的证据输出约定 JSON,不调用工具,不补造证据。必要步骤未完成的关注必须标记 blocked,并说明未完成步骤;已核实的关注可正常返回。未成功写入记录不得声称已记录。';
10
+ export const observationFinalInstruction = '检查阶段已结束。只基于已完整返回的证据输出约定 JSON,不调用工具,不补造证据。每项 observations 可用 workflowChecks 数组一次登记已规划的检查步骤,每项为 {stepId,status:"completed"|"blocked",evidence};已经核实但未调用 update 登记的步骤在此提交即可,不应仅因少一次登记调用判为受阻。必要核验未实际完成的关注仍须标记 blocked;execute 阶段尚未执行不是检查受阻。未成功写入记录不得声称已记录。';
9
11
  //# sourceMappingURL=observation-budget.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"observation-budget.js","sourceRoot":"","sources":["../src/observation-budget.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAA;AAC1C,MAAM,CAAC,MAAM,4BAA4B,GAAG,OAAO,CAAA;AACnD,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAA;AACjD,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,EAAE,QAAQ,EAAE,KAAK,GAAG,wBAAwB,EAAE,CAAA;AACvD,CAAC;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,sGAAsG,CAAA"}
1
+ {"version":3,"file":"observation-budget.js","sourceRoot":"","sources":["../src/observation-budget.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAA;AAC1C,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAA;AAC/C,MAAM,CAAC,MAAM,4BAA4B,GAAG,OAAO,CAAA;AACnD,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAA;AACjD,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,iBAAiB,GAAG,CAAC;IACpE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,8BAA8B,EAAE,iBAAiB,CAAC,CAAC,CAAA;IAC5F,OAAO,EAAE,QAAQ,EAAE,KAAK,GAAG,WAAW,GAAG,wBAAwB,IAAI,KAAK,GAAG,wBAAwB,GAAG,8BAA8B,EAAE,CAAA;AAC1I,CAAC;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,wPAAwP,CAAA"}
@@ -20,5 +20,6 @@ export declare function executeObservationLoop(options: {
20
20
  parse(output: string, ids: Set<string>): HeartbeatExecution['candidates'];
21
21
  checkpoint?(item: PartnerConcern, snapshot: RecordingSnapshot): Promise<void>;
22
22
  saveProgress?(item: PartnerConcern, progress: ObservationProgress | null): Promise<void>;
23
+ assertCurrent?(item: PartnerConcern): Promise<void>;
23
24
  }): Promise<HeartbeatExecution>;
24
25
  //# sourceMappingURL=observation-loop.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"observation-loop.d.ts","sourceRoot":"","sources":["../src/observation-loop.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAGnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAU5D,OAAO,EAAyC,KAAK,iBAAiB,EAAC,MAAM,yBAAyB,CAAA;AACtG,OAAO,EAA+H,KAAK,mBAAmB,EAAC,MAAM,2BAA2B,CAAA;AAEhM;kFACkF;AAClF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAK/H;AAGD,iGAAiG;AACjG,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,GAAG,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,cAAc,EAAE,CAAA;IACnF,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;IACtD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAA;IACzE,UAAU,CAAC,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7E,YAAY,CAAC,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,mBAAmB,GAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACvF,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsK9B"}
1
+ {"version":3,"file":"observation-loop.d.ts","sourceRoot":"","sources":["../src/observation-loop.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAGnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAW5D,OAAO,EAAyC,KAAK,iBAAiB,EAAC,MAAM,yBAAyB,CAAA;AACtG,OAAO,EAA+H,KAAK,mBAAmB,EAAC,MAAM,2BAA2B,CAAA;AAEhM;kFACkF;AAClF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAK/H;AAGD,iGAAiG;AACjG,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,GAAG,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,cAAc,EAAE,CAAA;IACnF,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;IACtD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAA;IACzE,UAAU,CAAC,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7E,YAAY,CAAC,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,mBAAmB,GAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtF,aAAa,CAAC,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACpD,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAiQ9B"}