@dsh-enhanced/event-triggers 0.1.23 → 0.1.30

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/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # @dsh-enhanced/event-triggers
2
2
 
3
- 把受限 file、HTTPS/JSON 和 HMAC webhook 边缘条件转换成 `assistant-automations` 的稳定 external occurrence。插件先在自己的 SQLite outbox 持久化 fire,再调用 Automations;下游失败或重启时重放相同 event id,不直接创建 Agent 或发送消息。失败项采用持久退避重试,已删除或禁用 trigger 的遗留事件进入 quarantine,不会阻塞后续事件。
3
+ 把受限 file、HTTPS/JSON、Lark Calendar 和 HMAC webhook 边缘条件转换成 `assistant-automations` 的稳定 external occurrence。插件先在自己的 SQLite outbox 持久化 fire,再调用 Automations;下游失败或重启时重放相同 event id,不直接创建 Agent 或发送消息。失败项采用持久退避重试,已删除或禁用 trigger 的遗留事件进入 quarantine,不会阻塞后续事件。
4
+
5
+ 每个新 outbox 行同时保存不可变 `dsh-external-event/v1` provenance envelope 和摘要:它绑定 trigger 配置摘要、冻结的 automation target、稳定 event id、观测摘要/edge revision 和信任方式,但不包含 file 内容、HTTP 响应、webhook body 或凭据值。重放时会复核摘要与当前 trigger 配置;任何 retarget 或配置变化都会 quarantine 旧行,不会将它投递给新目标。schema v1/v2 的旧 outbox 行没有 provenance,会 quarantine 并要求操作员核对历史目标;它们不会自动重放,也不能被解释为具有新来源证明。
4
6
 
5
7
  ## 安装与默认状态
6
8
 
@@ -11,6 +13,43 @@ dsh --profile web --dump-config
11
13
 
12
14
  默认 `triggers: []`、`pollerEnabled: false`。File/HTTP 需要给 `background:event-triggers:<id>` 的 filesystem/network `observe` 明确 Policy 规则;Webhook 还需要 `external:webhook:<id>` 的 automation `accept` 规则,Automations 本身会再次验证 external `ingest`。
13
15
 
16
+ `github-repository` 来源只读固定 `api.github.com` 的分支 check-runs、目标 PR 和 reviews,以结构化状态摘要产生变化事件;响应内容不进入模型上下文。配置绑定 `repository`、`branch`、`baseBranch` 和 `credentialHandle`。Keychain handle 须允许 consumer `dsh-enhanced-event-triggers`、purpose `github.observe`;每次请求受租约、固定 HTTPS 出口、正文上限和共同 deadline 约束,截断或不一致的提交状态拒绝生成事件。
17
+
18
+ 该来源必须配置 `observer`:准确 workspace/preset、principalId/principalRecordId/principalVersion、ownerRouteId、绝对 expiresAt 和 budgetId。它复用 Automations 的有限 Host 执行器,不调用模型;另需 Delivery 验证 owner route,Policy 授权观测、凭据、来源执行和下游 ingest。Web Owner 的 `repositoryDelivery.events` 可生成这些配置及有限轮询/执行预算。原有未配置 observer 的来源保持既有行为。
19
+
20
+ `lark-calendar` 是独立安装后可选的只读来源,需要同时安装并启用 `@dsh-enhanced/lark-channel`。配置必须提供一个精确 `calendarId` 和有限的 Unix-second `startTime`/`endTime` 窗口,以及 `observer`。它不会调用 Calendar list,也不会枚举或探测其他日历。Lark Channel 的 `allowedCalendarIds` 默认空;该 exact ID 必须同时在其中,且 Event Triggers 必须有 exact `network:lark-calendar:<calendarId>` 的 background `observe` Policy 规则。两个门都通过后,连接器才以其受限 SDK/token 生命周期读取 `GET /open-apis/calendar/v4/calendars/{calendar_id}/events` 的固定窗口分页。app secret、tenant token、page token 和日历正文都不进入 Event Triggers 的配置摘要、SQLite outbox、envelope 或健康日志。
21
+
22
+ ```yaml
23
+ triggers:
24
+ - id: owner-calendar
25
+ kind: lark-calendar
26
+ automationId: owner-calendar-change
27
+ calendarId: cal_exact_owner_selected
28
+ startTime: 1760000000
29
+ endTime: 1760604800
30
+ pageSize: 100
31
+ maxPages: 10
32
+ maxEvents: 1000
33
+ fireWhen: changed
34
+ cooldownMs: 60000
35
+ maxFires: 20
36
+ observer:
37
+ workspace: /absolute/owner-workspace
38
+ preset: primary
39
+ principalId: owner:exact
40
+ principalRecordId: owner-record
41
+ principalVersion: 1
42
+ ownerRouteId: owner-route
43
+ expiresAt: 1760604800000
44
+ budgetId: calendar-observations
45
+ ```
46
+
47
+ 每次读取会在 `maxPages`/`maxEvents` 内消费所有后续页;循环 token、截断、超过上限、非法项目或异常响应均为 unknown,不生成快照或事件。完整集合的规范化摘要会检测添加、修改和窗口中的删除,但分页读取不是远端原子事务:它仅是一个不可信 change nudge。唤醒的目标必须在授权范围内重新读取并独立验收真实日程,不能把此事件当作日历状态证明。首次使用前,操作员应以 `dsh-lark-setup --create-app --calendar-readonly` 为当前应用增量申请只读 Calendar scope,发布/管理员批准后,将实际允许的 Calendar ID 写入 Lark Channel 配置;没有真实应用、scope、日历共享权限和测试日程时,此来源不能视为已验收。
48
+
49
+ 来源摘要和序号先持久化,独立于下游 observer 执行回执,Goals 可以用它们等待变化;事件本身不证明 CI/评审成功,最终必须重新核验实际提交。重启复用来源与授权,不延长期限;来源暂停、授权过期、route 或已协调定义变化后,停止观测并拒绝来源查询/投递。默认 `observerLifetime: shared` 保持既有共享来源行为与配置摘要。显式 `observerLifetime: goal` 将来源限定为一个目标:首次合法 `goal_wait_event` 持久绑定准确 owner/scope、业务目标定义、Session 和原生 Goal;同一目标的后续等待可增加 revision,其他目标不能接管。Goals 的可信只读快照确认该目标 complete 后,来源在等待协调或下一次观测/投递检查时持久退役并暂停对应 observer,重启不再启用;晚到的观测结果不能新增事件。已派发的合法 wake 仍可正常结算并反馈结果。共享来源不会因为某个目标完成而停止。
50
+
51
+ Web Owner 的新 `repositoryDelivery.events` 配置使用 `observerLifetime: goal`,不要求用户预先填写尚未创建的 Goal ID。退役的来源不转移给新目标;新目标需要新的有限来源配置和授权。缺失可信 Goals 状态、定义变化、owner 或来源配置变化都拒绝继续观察,外部事件正文不能自行声明目标完成。
52
+
14
53
  HTTP 网络权限使用精确 HTTPS origin:
15
54
 
16
55
  ```yaml
@@ -33,11 +72,17 @@ sha256=HMAC_SHA256(secret, timestamp + "\n" + nonce + "\n" + rawBody)
33
72
 
34
73
  - 文件系统:私有 SQLite(WAL/FULL、目录 `0700`、文件 `0600`);只读取 `allowedFileRoots` 内 regular non-symlink 文件,按 `maxBodyBytes` 限制。被 file trigger 使用的 root 必须在 service 初始化时已存在且为目录;此时一次性固定其配置路径与物理 realpath 的 dev/ino,后续每次读取都复核。文件使用 `O_NOFOLLOW | O_NONBLOCK` 打开,并在 descriptor 上复查 regular file、dev/ino 与固定 root,覆盖跨 poll 以及同一读取内的 leaf、祖先目录、root symlink/FIFO swap。`requestTimeoutMs` 也作为每个 file observation 的 service deadline;底层不可取消的文件系统调用超时后仅保留每 trigger 一个纯读取,结果会丢弃,后续轮询和销毁不会等待它或在关库后回写。
35
74
  - 网络:HTTP sensor 仅允许精确 HTTPS origin。每次请求最多接受 16 个去重 DNS answer,只允许 global-unicast IPv4,并校验保留地址。IPv6 默认 `ipv6Mode: deny`,因为任意网络都可能使用无法仅从地址识别的自定义 NAT64/翻译前缀;只有运维方确认出口为纯原生 IPv6、不会把任何 IPv6 前缀翻译到 IPv4 时,才可显式设为 `native-only`。启用后仍会拒绝 mapped、6to4、ISATAP 等可识别的内嵌非公网 IPv4。生产 socket 固定到本次单次解析的已验证地址,同时保留原 hostname 做 TLS SNI/证书校验,并以 `agent: false` 禁止复用全局 keep-alive socket 绕过本次 pin。一个 deadline 覆盖 DNS、连接、响应和正文;禁止 redirect,拒绝响应会取消正文,正文受 `maxBodyBytes` 限制。若底层 resolver/fetch/body 不响应取消,service 会维持该 trigger 的 single-flight 记录直到真实底层 operation 结束,不会每轮重复累积资源。
36
- - 凭据:只有 webhook 配置存在时才需要 `credentials-keychain`;secret 只在 HMAC callback 内短暂可见,不落库/日志/事件。
75
+ - 凭据:webhook 配置需要 `credentials-keychain`;secret 只在 HMAC callback 内短暂可见,不落库/日志/事件。Lark Calendar 不向本插件授予或暴露 app secret/token;它只能调用已启用 Lark Channel 的 exact-ID 只读桥,桥本身仍受 channel credential lifecycle 与 `allowedCalendarIds` 限制。
37
76
  - 子进程、浏览器、任意 shell、安装脚本:无。
38
77
  - 外部 body:验签后也不会成为 Agent prompt;只生成不含正文的 occurrence。
39
78
 
40
- `health()` 会返回 pending/retrying/quarantined/delivered 数、失败 trigger 数以及最近的有界错误摘要。SQLite schema v2 会从 v1 原位迁移并保留已有 pending event;poller 即使关闭,独立 outbox flush 仍会运行。每轮 flush 分页处理并对失败项持久退避,因此 poison/stale 事件不会造成队头永久阻塞。
79
+ `health()` 会返回 pending/retrying/quarantined/delivered 数、失败 trigger 数以及最近的有界错误摘要。SQLite 当前 schema v4 沿既有版本链迁移;没有 provenance 的历史 pending event 按上述规则隔离。poller 即使关闭,独立 outbox flush 仍会运行。每轮 flush 分页处理并对失败项持久退避,因此 poison/stale 事件不会造成队头永久阻塞。
80
+
81
+ ## Host 事件读取
82
+
83
+ 可信 Host 可调用 `sourceSnapshot(triggerId)` 冻结来源标识、配置摘要、automation target 和 `highWaterSequence`,再以 `firstEventAfter(snapshot, sequence, deadlineAt)` 读取快照后的首个匹配事件。返回值包含持久序号及不含正文的 envelope;来源禁用或配置改变会拒绝旧快照。`subscribeSourceChanges(listener)` 返回 disposer,通知只提示重新扫描,不携带执行权限。可选的 [assistant-goals](../assistant-goals/README.md) 使用此接口等待事件后恢复 owner 授权的原目标。
84
+
85
+ SQLite schema v4 为 outbox 增加持久单调序号,从 v3 原位迁移并保留已投递的 provenance 日志。序号高水位不因删除最高事件或 VACUUM 回退;没有来源证明的旧行不参与匹配。读取事件不消费、重定向或禁用已有 automation 投递。进程重启后的消费者从已保存快照扫描,不能仅依靠内存通知。
41
86
 
42
87
  ## 限制
43
88
 
@@ -45,4 +90,4 @@ sha256=HMAC_SHA256(secret, timestamp + "\n" + nonce + "\n" + rawBody)
45
90
 
46
91
  ## 兼容性与参考
47
92
 
48
- 以 DSH rc.8 `141eb6fef83422698aef7a981029e843e8161534` 验证。设计借鉴 `dsh-sentinel@833a4e9` 的 baseline/edge/cooldown 与 fire-before-delivery watermark,但没有安装或复制其 JSONL、shell command、弱租约或 capability URL 设计。
93
+ 以 DSH `0.1.2-rc.1` 验证。设计借鉴 `dsh-sentinel@833a4e9` 的 baseline/edge/cooldown 与 fire-before-delivery watermark,但没有安装或复制其 JSONL、shell command、弱租约或 capability URL 设计。
package/lib/config.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import Schema from '@deepseek-ai/schemastery';
2
+ import type { EventObserverConfig } from './observer.js';
2
3
  export type FireWhen = 'changed' | 'truthy';
3
4
  export type Ipv6Mode = 'deny' | 'native-only';
5
+ export type ObserverLifetime = 'shared' | 'goal';
4
6
  interface TriggerBase {
5
7
  id: string;
6
8
  automationId: string;
@@ -8,6 +10,9 @@ interface TriggerBase {
8
10
  cooldownMs?: number;
9
11
  maxFires?: number;
10
12
  ttlMs?: number;
13
+ observer?: EventObserverConfig;
14
+ /** A goal lifetime is claimed by the first exact owner-authorized event wait. */
15
+ observerLifetime?: ObserverLifetime;
11
16
  }
12
17
  export interface FileTriggerConfig extends TriggerBase {
13
18
  kind: 'file';
@@ -28,7 +33,34 @@ export interface WebhookTriggerConfig extends TriggerBase {
28
33
  credentialHandle: string;
29
34
  maxSkewMs?: number;
30
35
  }
31
- export type EventTriggerConfig = FileTriggerConfig | HttpJsonTriggerConfig | WebhookTriggerConfig;
36
+ export interface GitHubRepositoryTriggerConfig extends TriggerBase {
37
+ kind: 'github-repository';
38
+ repository: string;
39
+ branch: string;
40
+ baseBranch: string;
41
+ credentialHandle: string;
42
+ fireWhen?: FireWhen;
43
+ debounceMs?: number;
44
+ observer: EventObserverConfig;
45
+ }
46
+ /**
47
+ * An exact, owner-selected Lark calendar. The channel service owns the app
48
+ * credential and token cache; this trigger never receives either value.
49
+ */
50
+ export interface LarkCalendarTriggerConfig extends TriggerBase {
51
+ kind: 'lark-calendar';
52
+ calendarId: string;
53
+ /** Inclusive Unix-second bounds sent to Lark's Calendar v4 list API. */
54
+ startTime: number;
55
+ endTime: number;
56
+ pageSize?: number;
57
+ maxPages?: number;
58
+ maxEvents?: number;
59
+ fireWhen?: FireWhen;
60
+ debounceMs?: number;
61
+ observer: EventObserverConfig;
62
+ }
63
+ export type EventTriggerConfig = FileTriggerConfig | HttpJsonTriggerConfig | WebhookTriggerConfig | GitHubRepositoryTriggerConfig | LarkCalendarTriggerConfig;
32
64
  export interface Config {
33
65
  databasePath: string;
34
66
  allowedFileRoots?: string[];
@@ -47,11 +79,18 @@ export interface Config {
47
79
  */
48
80
  ipv6Mode?: Ipv6Mode;
49
81
  }
50
- export type NormalizedTrigger = (Required<Omit<FileTriggerConfig, 'ttlMs'>> & {
82
+ export type NormalizedTrigger = (Required<Omit<FileTriggerConfig, 'ttlMs' | 'observer'>> & {
83
+ ttlMs?: number;
84
+ observer?: EventObserverConfig;
85
+ }) | (Required<Omit<HttpJsonTriggerConfig, 'ttlMs' | 'observer'>> & {
86
+ ttlMs?: number;
87
+ observer?: EventObserverConfig;
88
+ }) | (Required<Omit<WebhookTriggerConfig, 'ttlMs' | 'observer'>> & {
51
89
  ttlMs?: number;
52
- }) | (Required<Omit<HttpJsonTriggerConfig, 'ttlMs'>> & {
90
+ observer?: EventObserverConfig;
91
+ }) | (Required<Omit<GitHubRepositoryTriggerConfig, 'ttlMs'>> & {
53
92
  ttlMs?: number;
54
- }) | (Required<Omit<WebhookTriggerConfig, 'ttlMs'>> & {
93
+ }) | (Required<Omit<LarkCalendarTriggerConfig, 'ttlMs'>> & {
55
94
  ttlMs?: number;
56
95
  });
57
96
  export interface NormalizedConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/lib/config.js CHANGED
@@ -1,5 +1,10 @@
1
1
  import { isAbsolute, relative, resolve } from 'node:path';
2
2
  import Schema from '@deepseek-ai/schemastery';
3
+ const observerSchema = () => Schema.object({
4
+ workspace: Schema.string().required(), preset: Schema.string().required(), principalId: Schema.string().required(),
5
+ principalRecordId: Schema.string().required(), principalVersion: Schema.number().step(1).min(1).required(),
6
+ ownerRouteId: Schema.string().required(), expiresAt: Schema.number().step(1).min(1).required(), budgetId: Schema.string().required(),
7
+ });
3
8
  const base = {
4
9
  id: Schema.string().required(),
5
10
  automationId: Schema.string().required(),
@@ -7,8 +12,18 @@ const base = {
7
12
  cooldownMs: Schema.number().step(1).min(0).max(86_400_000).default(0),
8
13
  maxFires: Schema.number().step(1).min(1).max(1_000_000).default(100),
9
14
  ttlMs: Schema.number().step(1).min(1_000).max(31_536_000_000),
15
+ observer: Schema.any(),
16
+ observerLifetime: Schema.union(['shared', 'goal']).default('shared'),
10
17
  };
11
18
  const triggerSchema = Schema.union([
19
+ Schema.object({ ...base, kind: Schema.const('github-repository').required(), repository: Schema.string().required(),
20
+ branch: Schema.string().required(), baseBranch: Schema.string().required(), credentialHandle: Schema.string().required(),
21
+ fireWhen: Schema.union(['changed', 'truthy']).default('changed'), debounceMs: Schema.number().step(1).min(0).max(86_400_000).default(0), observer: observerSchema().required() }),
22
+ Schema.object({ ...base, kind: Schema.const('lark-calendar').required(), calendarId: Schema.string().required(),
23
+ startTime: Schema.number().step(1).min(0).required(), endTime: Schema.number().step(1).min(1).required(),
24
+ pageSize: Schema.number().step(1).min(1).max(1_000).default(100), maxPages: Schema.number().step(1).min(1).max(100).default(10),
25
+ maxEvents: Schema.number().step(1).min(1).max(10_000).default(1_000),
26
+ fireWhen: Schema.union(['changed', 'truthy']).default('changed'), debounceMs: Schema.number().step(1).min(0).max(86_400_000).default(0), observer: observerSchema().required() }),
12
27
  Schema.object({
13
28
  ...base,
14
29
  kind: Schema.const('file').required(),
@@ -101,6 +116,33 @@ export function normalizeEventTriggersConfig(input) {
101
116
  ])];
102
117
  const triggers = parsed.triggers.map(raw => {
103
118
  const trigger = { ...raw, id: id(raw.id, 'trigger id'), automationId: id(raw.automationId, 'automationId') };
119
+ if (trigger.observer !== undefined) {
120
+ const owner = observerSchema()(trigger.observer);
121
+ if (Object.keys(owner).some(key => !['workspace', 'preset', 'principalId', 'principalRecordId', 'principalVersion', 'ownerRouteId', 'expiresAt', 'budgetId'].includes(key)))
122
+ throw new Error('event-triggers: invalid observer fields');
123
+ trigger.observer = owner;
124
+ if (!isAbsolute(owner.workspace) || !Number.isSafeInteger(owner.principalVersion) || !Number.isSafeInteger(owner.expiresAt)
125
+ || [owner.preset, owner.principalId, owner.principalRecordId, owner.ownerRouteId, owner.budgetId].some(value => value.length === 0 || value.length > 256 || value.trim() !== value || /[\p{Cc}]/u.test(value)))
126
+ throw new Error('event-triggers: invalid observer owner');
127
+ Object.freeze(owner);
128
+ }
129
+ if (trigger.observerLifetime === 'goal' && trigger.observer === undefined) {
130
+ throw new Error('event-triggers: goal observer lifetime requires an observer owner');
131
+ }
132
+ if (trigger.kind === 'github-repository') {
133
+ if (!/^[A-Za-z0-9][A-Za-z0-9-]*\/[A-Za-z0-9][A-Za-z0-9._-]*$/u.test(trigger.repository)
134
+ || trigger.baseBranch === trigger.branch || [trigger.branch, trigger.baseBranch].some(value => value.length === 0 || value.length > 256 || value.trim() !== value || /[\p{Cc}]/u.test(value)))
135
+ throw new Error('event-triggers: invalid GitHub repository scope');
136
+ return Object.freeze({ ...trigger, credentialHandle: id(trigger.credentialHandle, 'credentialHandle') });
137
+ }
138
+ if (trigger.kind === 'lark-calendar') {
139
+ if (!Number.isSafeInteger(trigger.startTime) || !Number.isSafeInteger(trigger.endTime)
140
+ || trigger.calendarId.length === 0 || trigger.calendarId.length > 512 || trigger.calendarId.trim() !== trigger.calendarId || /[\p{Cc}]/u.test(trigger.calendarId)
141
+ || trigger.endTime <= trigger.startTime || trigger.endTime - trigger.startTime > 31_536_000) {
142
+ throw new Error('event-triggers: invalid Lark calendar scope');
143
+ }
144
+ return Object.freeze(trigger);
145
+ }
104
146
  if (trigger.kind === 'file') {
105
147
  if (!isAbsolute(trigger.path) || !contained(trigger.path, roots)) {
106
148
  throw new Error('event-triggers: file path is outside allowedFileRoots');
package/lib/config.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type Fetcher, type Lookup, type OperationTracker, type SensorObservation } from './sensors.js';
2
+ /** Reads only fixed, untrusted GitHub state for a repository-change nudge. */
3
+ export declare function readGitHubRepositoryObservation(input: {
4
+ repository: string;
5
+ branch: string;
6
+ baseBranch: string;
7
+ token: string;
8
+ maxBodyBytes: number;
9
+ timeoutMs: number;
10
+ signal: AbortSignal;
11
+ lookup?: Lookup;
12
+ fetcher?: Fetcher;
13
+ allowIpv6?: boolean;
14
+ trackOperation?: OperationTracker;
15
+ beforeRequest?: () => void | Promise<void>;
16
+ }): Promise<SensorObservation>;
17
+ //# sourceMappingURL=github-sensor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-sensor.d.ts","sourceRoot":"","sources":["../src/github-sensor.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAA;AA0C1H,8EAA8E;AAC9E,wBAAsB,+BAA+B,CAAC,KAAK,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkBxW"}
@@ -0,0 +1,87 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readHttpJsonValue } from './sensors.js';
3
+ const API = 'https://api.github.com';
4
+ const repositoryPattern = /^[A-Za-z0-9][A-Za-z0-9-]*\/[A-Za-z0-9][A-Za-z0-9._-]*$/u;
5
+ const oid = (value) => typeof value === 'string' && /^[0-9a-f]{40,128}$/iu.test(value);
6
+ const positive = (value) => typeof value === 'number' && Number.isSafeInteger(value) && value > 0;
7
+ const plain = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
8
+ const fail = () => { throw new Error('event-triggers: GitHub repository observation is unavailable'); };
9
+ const fingerprint = (value) => `sha256:${createHash('sha256').update(JSON.stringify(value)).digest('hex')}`;
10
+ const record = (value) => plain(value) ? value : fail();
11
+ function text(value, maximum = 256) { if (typeof value !== 'string' || value.length === 0 || value.length > maximum || value.trim() !== value || /\p{Cc}/u.test(value))
12
+ fail(); return value; }
13
+ function pullRequest(value, repository, branch, baseBranch) {
14
+ const item = record(value), head = record(item.head), base = record(item.base), headRepository = record(head.repo), baseRepository = record(base.repo);
15
+ if (!positive(item.number) || item.state !== 'open' || head.ref !== branch || base.ref !== baseBranch || !oid(head.sha) || headRepository.full_name !== repository || baseRepository.full_name !== repository)
16
+ fail();
17
+ return { number: item.number, headOid: head.sha };
18
+ }
19
+ function list(value) { if (!Array.isArray(value) || value.length >= 100)
20
+ fail(); return value; }
21
+ function checkRuns(value) {
22
+ const body = record(value), raw = body.check_runs;
23
+ if (!Array.isArray(raw) || !Number.isSafeInteger(body.total_count))
24
+ fail();
25
+ const total = body.total_count, items = raw;
26
+ if (total !== items.length || total > 100 || items.length >= 100)
27
+ fail();
28
+ const checks = items.map(item => {
29
+ const check = record(item), app = record(check.app);
30
+ if (!positive(check.id) || typeof check.name !== 'string' || !positive(app.id) || !oid(check.head_sha) || typeof check.status !== 'string' || (check.conclusion !== null && typeof check.conclusion !== 'string'))
31
+ fail();
32
+ return { id: check.id, name: check.name, appId: app.id, headOid: check.head_sha, status: check.status, conclusion: check.conclusion };
33
+ }).sort((a, b) => a.id - b.id);
34
+ const heads = new Set(checks.map(check => check.headOid));
35
+ if (heads.size > 1)
36
+ fail();
37
+ return { headOid: checks[0]?.headOid ?? null, checks };
38
+ }
39
+ function reviews(value, headOid) {
40
+ const ids = new Set();
41
+ return list(value).map(item => {
42
+ const review = record(item), user = record(review.user);
43
+ if (!positive(review.id) || ids.has(review.id) || !positive(user.id) || !oid(review.commit_id) || !['APPROVED', 'CHANGES_REQUESTED', 'COMMENTED', 'DISMISSED', 'PENDING'].includes(String(review.state)))
44
+ fail();
45
+ ids.add(review.id);
46
+ return { id: review.id, userId: user.id, commitOid: review.commit_id, state: review.state, currentHead: review.commit_id === headOid };
47
+ });
48
+ }
49
+ /** Reads only fixed, untrusted GitHub state for a repository-change nudge. */
50
+ export async function readGitHubRepositoryObservation(input) {
51
+ if (!repositoryPattern.test(input.repository) || !text(input.branch) || !text(input.baseBranch) || input.branch === input.baseBranch || typeof input.token !== 'string' || input.token.length === 0 || input.token.length > 8192 || !Number.isSafeInteger(input.maxBodyBytes) || input.maxBodyBytes < 1 || !Number.isSafeInteger(input.timeoutMs) || input.timeoutMs < 1)
52
+ fail();
53
+ const owner = input.repository.split('/')[0], controller = new AbortController(), abort = () => controller.abort(input.signal.reason ?? new Error('event-triggers: GitHub sensor was aborted'));
54
+ if (input.signal.aborted)
55
+ abort();
56
+ else
57
+ input.signal.addEventListener('abort', abort, { once: true });
58
+ const timer = setTimeout(() => controller.abort(new Error('event-triggers: GitHub sensor timeout')), input.timeoutMs);
59
+ timer.unref?.();
60
+ const options = { ...(input.lookup === undefined ? {} : { lookup: input.lookup }), ...(input.fetcher === undefined ? {} : { fetcher: input.fetcher }), ...(input.allowIpv6 === undefined ? {} : { allowIpv6: input.allowIpv6 }), ...(input.trackOperation === undefined ? {} : { trackOperation: input.trackOperation }) };
61
+ const read = async (path) => {
62
+ await input.beforeRequest?.();
63
+ const value = await readHttpJsonValue({ url: `${API}/repos/${input.repository.split('/').map(encodeURIComponent).join('/')}${path}`, maxBodyBytes: input.maxBodyBytes, timeoutMs: input.timeoutMs,
64
+ allowedOrigins: new Set([API]), signal: controller.signal, rejectPagination: true, ...options, headers: { accept: 'application/vnd.github+json', 'user-agent': 'dsh-enhanced-event-triggers', authorization: `Bearer ${input.token}` } });
65
+ await input.beforeRequest?.();
66
+ return value;
67
+ };
68
+ try {
69
+ const checks = checkRuns(await read(`/commits/${encodeURIComponent(input.branch)}/check-runs?per_page=100`));
70
+ const query = new URLSearchParams({ state: 'open', head: `${owner}:${input.branch}`, base: input.baseBranch, per_page: '100' });
71
+ const candidates = list(await read(`/pulls?${query.toString()}`)).map(item => pullRequest(item, input.repository, input.branch, input.baseBranch));
72
+ if (candidates.length > 1)
73
+ fail();
74
+ const pull = candidates[0], review = pull === undefined ? [] : reviews(await read(`/pulls/${pull.number}/reviews?per_page=100`), pull.headOid);
75
+ if (pull !== undefined && checks.headOid !== null && checks.headOid !== pull.headOid)
76
+ fail();
77
+ return Object.freeze({ fingerprint: fingerprint({ repository: input.repository, branch: input.branch, baseBranch: input.baseBranch, checks, pullRequest: pull ?? null, reviews: review }), truthy: true });
78
+ }
79
+ catch {
80
+ throw new Error('event-triggers: GitHub repository observation is unavailable');
81
+ }
82
+ finally {
83
+ clearTimeout(timer);
84
+ input.signal.removeEventListener('abort', abort);
85
+ }
86
+ }
87
+ //# sourceMappingURL=github-sensor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-sensor.js","sourceRoot":"","sources":["../src/github-sensor.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -5,6 +5,14 @@ export declare const name = "dsh-enhanced-event-triggers";
5
5
  export { Config, EventTriggersService, version };
6
6
  export * from './config.js';
7
7
  export * from './service.js';
8
+ export * from './source.js';
9
+ export * from './observer.js';
10
+ export * from './lark-calendar-sensor.js';
8
11
  export declare function apply(ctx: Context, config: import('./config.js').Config): void;
9
- export default EventTriggersService;
12
+ declare const _default: {
13
+ name: string;
14
+ Config: import("@deepseek-ai/schemastery").default<import("./config.js").Config>;
15
+ apply: typeof apply;
16
+ };
17
+ export default _default;
10
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE3D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,eAAO,MAAM,IAAI,gCAAgC,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAA;AAChD,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAE5B,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,aAAa,EAAE,MAAM,GAAG,IAAI,CAS9E;AAED,eAAe,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE3D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,eAAO,MAAM,IAAI,gCAAgC,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAA;AAChD,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,2BAA2B,CAAA;AAEzC,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,aAAa,EAAE,MAAM,GAAG,IAAI,CAa9E;;;;;;AAID,wBAAsC"}
package/lib/index.js CHANGED
@@ -5,15 +5,27 @@ export const name = 'dsh-enhanced-event-triggers';
5
5
  export { Config, EventTriggersService, version };
6
6
  export * from './config.js';
7
7
  export * from './service.js';
8
+ export * from './source.js';
9
+ export * from './observer.js';
10
+ export * from './lark-calendar-sensor.js';
8
11
  export function apply(ctx, config) {
9
12
  const normalized = normalizeEventTriggersConfig(config);
10
- if (normalized.triggers.some(trigger => trigger.kind === 'webhook')) {
11
- ctx.inject(['credentialsKeychain'], (credentialsCtx) => {
13
+ const dependencies = [];
14
+ if (normalized.triggers.some(trigger => trigger.kind === 'webhook' || trigger.kind === 'github-repository'))
15
+ dependencies.push('credentialsKeychain');
16
+ if (normalized.triggers.some(trigger => trigger.kind === 'lark-calendar'))
17
+ dependencies.push('larkChannel');
18
+ if (normalized.triggers.some(trigger => trigger.observer !== undefined))
19
+ dependencies.push('assistantDelivery');
20
+ if (dependencies.length) {
21
+ ctx.inject(dependencies, (credentialsCtx) => {
12
22
  new EventTriggersService(credentialsCtx, config);
13
23
  });
14
24
  return;
15
25
  }
16
26
  new EventTriggersService(ctx, config);
17
27
  }
18
- export default EventTriggersService;
28
+ // DSH unwraps default exports. Keep the consumer identity and conditional
29
+ // credential/owner-route injection on the object actually mounted by it.
30
+ export default { name, Config, apply };
19
31
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,IAAI,GAAG,6BAA6B,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAA;AAChD,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAE5B,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,MAAoC;IACtE,MAAM,UAAU,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAA;IACvD,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE;YACrD,IAAI,oBAAoB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QACF,OAAM;IACR,CAAC;IACD,IAAI,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC;AAED,eAAe,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,IAAI,GAAG,6BAA6B,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAA;AAChD,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,2BAA2B,CAAA;AAEzC,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,MAAoC;IACtE,MAAM,UAAU,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAA;IACvD,MAAM,YAAY,GAAa,EAAE,CAAA;IACjC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,mBAAmB,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IACrJ,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,eAAe,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC3G,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAC/G,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,GAAG,CAAC,MAAM,CAAC,YAAqB,EAAE,CAAC,cAAc,EAAE,EAAE;YACnD,IAAI,oBAAoB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QACF,OAAM;IACR,CAAC;IACD,IAAI,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC;AAED,0EAA0E;AAC1E,yEAAyE;AACzE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA"}
@@ -0,0 +1,29 @@
1
+ import type { SensorObservation } from './sensors.js';
2
+ /** Narrow read-only bridge implemented by lark-channel. It never exposes tokens. */
3
+ export interface LarkCalendarPageReader {
4
+ readCalendarEventPage(input: Readonly<{
5
+ calendarId: string;
6
+ startTime: number;
7
+ endTime: number;
8
+ pageSize: number;
9
+ pageToken?: string;
10
+ signal: AbortSignal;
11
+ }>): Promise<unknown>;
12
+ }
13
+ export interface LarkCalendarObservationInput {
14
+ calendarId: string;
15
+ startTime: number;
16
+ endTime: number;
17
+ pageSize: number;
18
+ maxPages: number;
19
+ maxEvents: number;
20
+ signal: AbortSignal;
21
+ beforeRequest?: () => void | Promise<void>;
22
+ }
23
+ /**
24
+ * Reads every page in a finite Calendar v4 window and retains only an opaque
25
+ * hash of a stable, privacy-minimised projection. A missing previous event
26
+ * changes the collection hash just as an added or changed event does.
27
+ */
28
+ export declare function readLarkCalendarObservation(reader: LarkCalendarPageReader, input: LarkCalendarObservationInput): Promise<SensorObservation>;
29
+ //# sourceMappingURL=lark-calendar-sensor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lark-calendar-sensor.d.ts","sourceRoot":"","sources":["../src/lark-calendar-sensor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAErD,oFAAoF;AACpF,MAAM,WAAW,sBAAsB;IACrC,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC;QACpC,UAAU,EAAE,MAAM,CAAA;QAClB,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,MAAM,EAAE,WAAW,CAAA;KACpB,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACtB;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,WAAW,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3C;AAmDD;;;;GAIG;AACH,wBAAsB,2BAA2B,CAAC,MAAM,EAAE,sBAAsB,EAAE,KAAK,EAAE,4BAA4B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA8BjJ"}
@@ -0,0 +1,99 @@
1
+ import { createHash } from 'node:crypto';
2
+ const unavailable = () => { throw new Error('event-triggers: Lark calendar observation is unavailable'); };
3
+ const plain = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
4
+ const text = (value, maximum = 1_024) => {
5
+ if (typeof value !== 'string' || value.length === 0 || value.length > maximum || value.trim() !== value || /[\p{Cc}]/u.test(value))
6
+ unavailable();
7
+ return value;
8
+ };
9
+ const optionalText = (value, maximum = 8_192) => {
10
+ if (value === undefined)
11
+ return undefined;
12
+ if (typeof value !== 'string' || value.length > maximum || /[\p{Cc}]/u.test(value))
13
+ unavailable();
14
+ return value;
15
+ };
16
+ const optionalBoolean = (value) => value === undefined ? undefined : typeof value === 'boolean' ? value : unavailable();
17
+ function event(value) {
18
+ const raw = plain(value) ? value : unavailable();
19
+ const time = (input) => {
20
+ if (input === undefined)
21
+ return undefined;
22
+ const source = plain(input) ? input : unavailable();
23
+ const date = optionalText(source.date, 64), timestamp = optionalText(source.timestamp, 32), timezone = optionalText(source.timezone, 128);
24
+ if (date === undefined && timestamp === undefined)
25
+ unavailable();
26
+ return Object.freeze({ ...(date === undefined ? {} : { date }), ...(timestamp === undefined ? {} : { timestamp }), ...(timezone === undefined ? {} : { timezone }) });
27
+ };
28
+ const status = optionalText(raw.status, 32);
29
+ if (status !== undefined && !['tentative', 'confirmed', 'cancelled'].includes(status))
30
+ unavailable();
31
+ return Object.freeze({
32
+ eventId: text(raw.event_id),
33
+ ...(time(raw.start_time) === undefined ? {} : { start: time(raw.start_time) }),
34
+ ...(time(raw.end_time) === undefined ? {} : { end: time(raw.end_time) }),
35
+ ...(status === undefined ? {} : { status }),
36
+ ...(optionalText(raw.summary) === undefined ? {} : { summary: optionalText(raw.summary) }),
37
+ ...(optionalText(raw.recurrence) === undefined ? {} : { recurrence: optionalText(raw.recurrence) }),
38
+ ...(optionalBoolean(raw.is_exception) === undefined ? {} : { isException: optionalBoolean(raw.is_exception) }),
39
+ ...(optionalText(raw.recurring_event_id) === undefined ? {} : { recurringEventId: optionalText(raw.recurring_event_id) }),
40
+ ...(optionalText(raw.create_time, 32) === undefined ? {} : { createTime: optionalText(raw.create_time, 32) }),
41
+ ...(optionalText(raw.organizer_calendar_id) === undefined ? {} : { organizerCalendarId: optionalText(raw.organizer_calendar_id) }),
42
+ });
43
+ }
44
+ function page(value, maxEvents) {
45
+ const raw = plain(value) ? value : unavailable();
46
+ if (typeof raw.has_more !== 'boolean' || !Array.isArray(raw.items))
47
+ unavailable();
48
+ const items = raw.items;
49
+ // Calendar v4 may include an empty terminal token. It is not a continuation.
50
+ if (items.length > maxEvents)
51
+ unavailable();
52
+ const pageToken = raw.page_token === undefined || (raw.page_token === '' && !raw.has_more) ? undefined : text(raw.page_token, 4_096);
53
+ if (raw.has_more && pageToken === undefined)
54
+ unavailable();
55
+ return Object.freeze({ hasMore: raw.has_more, ...(pageToken === undefined ? {} : { pageToken }), items: Object.freeze(items.map(event)) });
56
+ }
57
+ /**
58
+ * Reads every page in a finite Calendar v4 window and retains only an opaque
59
+ * hash of a stable, privacy-minimised projection. A missing previous event
60
+ * changes the collection hash just as an added or changed event does.
61
+ */
62
+ export async function readLarkCalendarObservation(reader, input) {
63
+ if (!Number.isSafeInteger(input.startTime) || !Number.isSafeInteger(input.endTime) || input.startTime < 0 || input.endTime <= input.startTime
64
+ || !Number.isSafeInteger(input.pageSize) || input.pageSize < 1 || !Number.isSafeInteger(input.maxPages) || input.maxPages < 1
65
+ || !Number.isSafeInteger(input.maxEvents) || input.maxEvents < 1 || input.signal.aborted)
66
+ unavailable();
67
+ const tokens = new Set(), eventIds = new Set(), values = [];
68
+ let pageToken;
69
+ for (let pageNumber = 0; pageNumber < input.maxPages; pageNumber += 1) {
70
+ await input.beforeRequest?.();
71
+ if (input.signal.aborted)
72
+ unavailable();
73
+ const response = await reader.readCalendarEventPage({ calendarId: input.calendarId, startTime: input.startTime, endTime: input.endTime,
74
+ pageSize: input.pageSize, ...(pageToken === undefined ? {} : { pageToken }), signal: input.signal });
75
+ await input.beforeRequest?.();
76
+ if (input.signal.aborted)
77
+ unavailable();
78
+ const current = page(response, input.maxEvents - values.length);
79
+ for (const item of current.items) {
80
+ const eventId = item.eventId;
81
+ if (eventIds.has(eventId))
82
+ unavailable();
83
+ eventIds.add(eventId);
84
+ }
85
+ values.push(...current.items);
86
+ if (values.length > input.maxEvents)
87
+ unavailable();
88
+ if (!current.hasMore) {
89
+ const canonical = JSON.stringify(values.map(value => JSON.stringify(value)).sort((left, right) => left < right ? -1 : left > right ? 1 : 0));
90
+ return Object.freeze({ fingerprint: `sha256:${createHash('sha256').update(canonical).digest('hex')}`, truthy: true });
91
+ }
92
+ pageToken = current.pageToken;
93
+ if (pageToken === undefined || tokens.has(pageToken))
94
+ unavailable();
95
+ tokens.add(pageToken);
96
+ }
97
+ return unavailable();
98
+ }
99
+ //# sourceMappingURL=lark-calendar-sensor.js.map