reflectt-node 0.1.7 → 0.1.8
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 +13 -0
- package/defaults/gitignore.template +23 -0
- package/dist/boardHealthWorker.d.ts +4 -0
- package/dist/boardHealthWorker.d.ts.map +1 -1
- package/dist/boardHealthWorker.js +36 -1
- package/dist/boardHealthWorker.js.map +1 -1
- package/dist/buildInfo.d.ts.map +1 -1
- package/dist/buildInfo.js +47 -10
- package/dist/buildInfo.js.map +1 -1
- package/dist/chat.d.ts +4 -0
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +6 -2
- package/dist/chat.js.map +1 -1
- package/dist/cli.js +37 -12
- package/dist/cli.js.map +1 -1
- package/dist/cloud.d.ts.map +1 -1
- package/dist/cloud.js +131 -64
- package/dist/cloud.js.map +1 -1
- package/dist/continuity-loop.d.ts.map +1 -1
- package/dist/continuity-loop.js +297 -29
- package/dist/continuity-loop.js.map +1 -1
- package/dist/deploy-monitor.d.ts +18 -0
- package/dist/deploy-monitor.d.ts.map +1 -0
- package/dist/deploy-monitor.js +165 -0
- package/dist/deploy-monitor.js.map +1 -0
- package/dist/executionSweeper.d.ts +1 -0
- package/dist/executionSweeper.d.ts.map +1 -1
- package/dist/executionSweeper.js +43 -7
- package/dist/executionSweeper.js.map +1 -1
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +17 -3
- package/dist/files.js.map +1 -1
- package/dist/fingerprint.d.ts +30 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +122 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/github-webhook-attribution.d.ts +38 -0
- package/dist/github-webhook-attribution.d.ts.map +1 -0
- package/dist/github-webhook-attribution.js +123 -0
- package/dist/github-webhook-attribution.js.map +1 -0
- package/dist/inbox.d.ts.map +1 -1
- package/dist/inbox.js +4 -0
- package/dist/inbox.js.map +1 -1
- package/dist/index.js +37 -1
- package/dist/index.js.map +1 -1
- package/dist/pulse.d.ts +7 -0
- package/dist/pulse.d.ts.map +1 -1
- package/dist/pulse.js +15 -0
- package/dist/pulse.js.map +1 -1
- package/dist/review-state.d.ts +9 -0
- package/dist/review-state.d.ts.map +1 -0
- package/dist/review-state.js +17 -0
- package/dist/review-state.js.map +1 -0
- package/dist/schedule.d.ts +60 -0
- package/dist/schedule.d.ts.map +1 -0
- package/dist/schedule.js +176 -0
- package/dist/schedule.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +486 -14
- package/dist/server.js.map +1 -1
- package/dist/suppression-ledger.d.ts.map +1 -1
- package/dist/suppression-ledger.js +12 -3
- package/dist/suppression-ledger.js.map +1 -1
- package/dist/system-loop-state.d.ts +1 -1
- package/dist/system-loop-state.d.ts.map +1 -1
- package/dist/system-loop-state.js +1 -0
- package/dist/system-loop-state.js.map +1 -1
- package/dist/tasks.d.ts +9 -1
- package/dist/tasks.d.ts.map +1 -1
- package/dist/tasks.js +193 -41
- package/dist/tasks.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/usage-tracking.d.ts +26 -0
- package/dist/usage-tracking.d.ts.map +1 -1
- package/dist/usage-tracking.js +91 -4
- package/dist/usage-tracking.js.map +1 -1
- package/package.json +1 -1
- package/public/dashboard.js +119 -37
- package/public/docs.md +18 -0
package/dist/pulse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pulse.d.ts","sourceRoot":"","sources":["../src/pulse.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IACnE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAClG,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAA;IAClG,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAC9D,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IACzF,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,cAAc,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1E,cAAc,CAAC,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"pulse.d.ts","sourceRoot":"","sources":["../src/pulse.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IACnE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAClG,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAA;IAClG,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAC9D,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IACzF,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,cAAc,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1E,cAAc,CAAC,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1E,eAAe,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACnG;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB;AAiCD,wBAAgB,aAAa,IAAI,aAAa,CA2E7C;AAED,wBAAgB,oBAAoB,IAAI,YAAY,CAkDnD"}
|
package/dist/pulse.js
CHANGED
|
@@ -84,6 +84,18 @@ export function generatePulse() {
|
|
|
84
84
|
todayStart.setHours(0, 0, 0, 0);
|
|
85
85
|
const recentMessages = chatManager.getMessages({ since: oneHourAgo });
|
|
86
86
|
const tasksCompletedToday = allTasks.filter(t => t.status === 'done' && (t.updatedAt || 0) >= todayStart.getTime()).length;
|
|
87
|
+
// High-bounce tasks: any non-done task with bounce_count >= 1
|
|
88
|
+
const highBounceTasks = allTasks
|
|
89
|
+
.filter(t => t.status !== 'done' && t.status !== 'cancelled')
|
|
90
|
+
.map(t => ({
|
|
91
|
+
taskId: t.id,
|
|
92
|
+
title: t.title,
|
|
93
|
+
bounceCount: typeof t.metadata?.bounce_count === 'number' ? t.metadata.bounce_count : 0,
|
|
94
|
+
assignee: t.assignee,
|
|
95
|
+
}))
|
|
96
|
+
.filter(t => t.bounceCount >= 1)
|
|
97
|
+
.sort((a, b) => b.bounceCount - a.bounceCount)
|
|
98
|
+
.slice(0, 10);
|
|
87
99
|
return {
|
|
88
100
|
ts: Date.now(),
|
|
89
101
|
deploy: getDeployInfo(),
|
|
@@ -96,6 +108,7 @@ export function generatePulse() {
|
|
|
96
108
|
messagesLastHour: recentMessages.length,
|
|
97
109
|
tasksCompletedToday,
|
|
98
110
|
},
|
|
111
|
+
highBounceTasks: highBounceTasks.length > 0 ? highBounceTasks : undefined,
|
|
99
112
|
};
|
|
100
113
|
}
|
|
101
114
|
export function generateCompactPulse() {
|
|
@@ -126,6 +139,7 @@ export function generateCompactPulse() {
|
|
|
126
139
|
return `${a.agent}:${a.status}${taskInfo}`;
|
|
127
140
|
});
|
|
128
141
|
const reviewStrs = pulse.pendingReviews.map(r => `${r.taskId.slice(-12)}→${r.reviewer}`);
|
|
142
|
+
const bounceWarnings = (pulse.highBounceTasks || []).map(t => `${t.taskId.slice(-12)}(bounces:${t.bounceCount})→${t.assignee || 'unassigned'}`);
|
|
129
143
|
return {
|
|
130
144
|
ts: pulse.ts,
|
|
131
145
|
deploy: deployStr,
|
|
@@ -134,6 +148,7 @@ export function generateCompactPulse() {
|
|
|
134
148
|
board: boardStr,
|
|
135
149
|
agents: agentStrs,
|
|
136
150
|
reviews: reviewStrs,
|
|
151
|
+
...(bounceWarnings.length > 0 ? { highBounce: bounceWarnings } : {}),
|
|
137
152
|
};
|
|
138
153
|
}
|
|
139
154
|
//# sourceMappingURL=pulse.js.map
|
package/dist/pulse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pulse.js","sourceRoot":"","sources":["../src/pulse.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,4BAA4B;AAE5B;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"pulse.js","sourceRoot":"","sources":["../src/pulse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function getReviewState(meta: Record<string, unknown>): string;
|
|
2
|
+
export declare function hasReviewerDecision(meta: Record<string, unknown>): boolean;
|
|
3
|
+
/**
|
|
4
|
+
* Canonical reviewer-SLA precedence rule:
|
|
5
|
+
* once a reviewer decision exists, reviewer-facing SLA paging stops.
|
|
6
|
+
* Tasks in needs_author are also waiting on the assignee/author, not the reviewer.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isWaitingOnAuthor(meta: Record<string, unknown>): boolean;
|
|
9
|
+
//# sourceMappingURL=review-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-state.d.ts","sourceRoot":"","sources":["../src/review-state.ts"],"names":[],"mappings":"AAGA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAEpE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAE1E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAExE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) Reflectt AI
|
|
3
|
+
export function getReviewState(meta) {
|
|
4
|
+
return typeof meta.review_state === 'string' ? meta.review_state : '';
|
|
5
|
+
}
|
|
6
|
+
export function hasReviewerDecision(meta) {
|
|
7
|
+
return meta.reviewer_decision != null;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Canonical reviewer-SLA precedence rule:
|
|
11
|
+
* once a reviewer decision exists, reviewer-facing SLA paging stops.
|
|
12
|
+
* Tasks in needs_author are also waiting on the assignee/author, not the reviewer.
|
|
13
|
+
*/
|
|
14
|
+
export function isWaitingOnAuthor(meta) {
|
|
15
|
+
return getReviewState(meta) === 'needs_author' || hasReviewerDecision(meta);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=review-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-state.js","sourceRoot":"","sources":["../src/review-state.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,4BAA4B;AAE5B,MAAM,UAAU,cAAc,CAAC,IAA6B;IAC1D,OAAO,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAA;AACvE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAA6B;IAC/D,OAAO,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAA;AACvC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA6B;IAC7D,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,cAAc,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAA;AAC7E,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export type ScheduleKind = 'deploy_window' | 'focus_block' | 'scheduled_task';
|
|
2
|
+
export interface ScheduleEntry {
|
|
3
|
+
id: string;
|
|
4
|
+
kind: ScheduleKind;
|
|
5
|
+
title: string;
|
|
6
|
+
/** Epoch ms — start of window */
|
|
7
|
+
start: number;
|
|
8
|
+
/** Epoch ms — end of window */
|
|
9
|
+
end: number;
|
|
10
|
+
/** Agent or team identifier that owns / created this entry */
|
|
11
|
+
owner: string;
|
|
12
|
+
/** Optional task ID for scheduled_task entries */
|
|
13
|
+
task_id: string | null;
|
|
14
|
+
/** deploy_window: 'open'|'closed'; focus_block: 'active'; scheduled_task: 'pending'|'done' */
|
|
15
|
+
status: string;
|
|
16
|
+
/** Free-form metadata (JSON string) */
|
|
17
|
+
meta: string | null;
|
|
18
|
+
created_at: number;
|
|
19
|
+
updated_at: number;
|
|
20
|
+
}
|
|
21
|
+
export interface CreateScheduleEntryInput {
|
|
22
|
+
kind: ScheduleKind;
|
|
23
|
+
title: string;
|
|
24
|
+
start: number;
|
|
25
|
+
end: number;
|
|
26
|
+
owner: string;
|
|
27
|
+
task_id?: string | null;
|
|
28
|
+
status?: string;
|
|
29
|
+
meta?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
export interface UpdateScheduleEntryInput {
|
|
32
|
+
title?: string;
|
|
33
|
+
start?: number;
|
|
34
|
+
end?: number;
|
|
35
|
+
status?: string;
|
|
36
|
+
meta?: Record<string, unknown>;
|
|
37
|
+
}
|
|
38
|
+
export interface ScheduleFeedOptions {
|
|
39
|
+
/** Only return entries starting/ending after this epoch ms (default: now) */
|
|
40
|
+
after?: number;
|
|
41
|
+
/** Only return entries starting before this epoch ms */
|
|
42
|
+
before?: number;
|
|
43
|
+
/** Filter by kind(s) */
|
|
44
|
+
kinds?: ScheduleKind[];
|
|
45
|
+
/** Filter by owner */
|
|
46
|
+
owner?: string;
|
|
47
|
+
/** Max entries to return (default: 50) */
|
|
48
|
+
limit?: number;
|
|
49
|
+
}
|
|
50
|
+
export declare function createScheduleEntry(input: CreateScheduleEntryInput): ScheduleEntry;
|
|
51
|
+
export declare function getScheduleEntry(id: string): ScheduleEntry | null;
|
|
52
|
+
export declare function updateScheduleEntry(id: string, input: UpdateScheduleEntryInput): ScheduleEntry | null;
|
|
53
|
+
export declare function deleteScheduleEntry(id: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Returns upcoming schedule entries in chronological order.
|
|
56
|
+
* Default: all entries ending after now, ordered by start asc.
|
|
57
|
+
*/
|
|
58
|
+
export declare function getScheduleFeed(options?: ScheduleFeedOptions): ScheduleEntry[];
|
|
59
|
+
export declare function _resetScheduleStore(): void;
|
|
60
|
+
//# sourceMappingURL=schedule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,aAAa,GAAG,gBAAgB,CAAA;AAE7E,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,YAAY,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAA;IACb,kDAAkD;IAClD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,8FAA8F;IAC9F,MAAM,EAAE,MAAM,CAAA;IACd,uCAAuC;IACvC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,YAAY,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,wBAAwB;IACxB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAA;IACtB,sBAAsB;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AA+CD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,aAAa,CAsClF;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAIjE;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,GAAG,aAAa,GAAG,IAAI,CA0BrG;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAKvD;AAID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,mBAAwB,GAAG,aAAa,EAAE,CAqClF;AAID,wBAAgB,mBAAmB,IAAI,IAAI,CAM1C"}
|
package/dist/schedule.js
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) Reflectt AI
|
|
3
|
+
/**
|
|
4
|
+
* Schedule — Shared time-awareness feed for the team
|
|
5
|
+
*
|
|
6
|
+
* Provides canonical records for team-wide scheduling primitives:
|
|
7
|
+
* - deploy_window: when deploys are safe/unsafe
|
|
8
|
+
* - focus_block: team-wide quiet periods (low interruptions)
|
|
9
|
+
* - scheduled_task: task work scheduled for a specific time window
|
|
10
|
+
*
|
|
11
|
+
* Intentionally NOT in scope (MVP):
|
|
12
|
+
* - No full calendar UI
|
|
13
|
+
* - No iCal/RRULE integration (use calendar.ts for per-agent recurring blocks)
|
|
14
|
+
* - No reminder/notification engine (use calendar-reminder-engine.ts)
|
|
15
|
+
* - No per-agent availability (use calendar.ts + getAvailability())
|
|
16
|
+
* - No recurring rules — one-off windows only in v1
|
|
17
|
+
*
|
|
18
|
+
* The /schedule/feed endpoint returns upcoming items chronologically so agents
|
|
19
|
+
* can read shared timing data instead of coordinating via chat.
|
|
20
|
+
*/
|
|
21
|
+
import { getDb } from './db.js';
|
|
22
|
+
// ── Valid values ───────────────────────────────────────────────────────────
|
|
23
|
+
const VALID_KINDS = ['deploy_window', 'focus_block', 'scheduled_task'];
|
|
24
|
+
const DEFAULT_STATUS = {
|
|
25
|
+
deploy_window: 'open',
|
|
26
|
+
focus_block: 'active',
|
|
27
|
+
scheduled_task: 'pending',
|
|
28
|
+
};
|
|
29
|
+
// ── Database setup ─────────────────────────────────────────────────────────
|
|
30
|
+
let initialized = false;
|
|
31
|
+
function ensureTable() {
|
|
32
|
+
if (initialized)
|
|
33
|
+
return;
|
|
34
|
+
const db = getDb();
|
|
35
|
+
db.exec(`
|
|
36
|
+
CREATE TABLE IF NOT EXISTS schedule_entries (
|
|
37
|
+
id TEXT PRIMARY KEY,
|
|
38
|
+
kind TEXT NOT NULL CHECK(kind IN ('deploy_window', 'focus_block', 'scheduled_task')),
|
|
39
|
+
title TEXT NOT NULL,
|
|
40
|
+
start INTEGER NOT NULL,
|
|
41
|
+
end INTEGER NOT NULL,
|
|
42
|
+
owner TEXT NOT NULL,
|
|
43
|
+
task_id TEXT,
|
|
44
|
+
status TEXT NOT NULL DEFAULT 'open',
|
|
45
|
+
meta TEXT,
|
|
46
|
+
created_at INTEGER NOT NULL,
|
|
47
|
+
updated_at INTEGER NOT NULL
|
|
48
|
+
)
|
|
49
|
+
`);
|
|
50
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_schedule_start ON schedule_entries(start)`);
|
|
51
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_schedule_kind ON schedule_entries(kind)`);
|
|
52
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_schedule_owner ON schedule_entries(owner)`);
|
|
53
|
+
initialized = true;
|
|
54
|
+
}
|
|
55
|
+
// ── CRUD ───────────────────────────────────────────────────────────────────
|
|
56
|
+
function generateId(kind) {
|
|
57
|
+
const prefix = kind === 'deploy_window' ? 'dw' : kind === 'focus_block' ? 'fb' : 'st';
|
|
58
|
+
return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
59
|
+
}
|
|
60
|
+
export function createScheduleEntry(input) {
|
|
61
|
+
ensureTable();
|
|
62
|
+
const db = getDb();
|
|
63
|
+
const now = Date.now();
|
|
64
|
+
if (!VALID_KINDS.includes(input.kind)) {
|
|
65
|
+
throw new Error(`kind must be one of: ${VALID_KINDS.join(', ')}`);
|
|
66
|
+
}
|
|
67
|
+
if (!input.title?.trim())
|
|
68
|
+
throw new Error('title is required');
|
|
69
|
+
if (typeof input.start !== 'number' || isNaN(input.start))
|
|
70
|
+
throw new Error('start must be epoch ms');
|
|
71
|
+
if (typeof input.end !== 'number' || isNaN(input.end))
|
|
72
|
+
throw new Error('end must be epoch ms');
|
|
73
|
+
if (input.end <= input.start)
|
|
74
|
+
throw new Error('end must be after start');
|
|
75
|
+
if (!input.owner?.trim())
|
|
76
|
+
throw new Error('owner is required');
|
|
77
|
+
const entry = {
|
|
78
|
+
id: generateId(input.kind),
|
|
79
|
+
kind: input.kind,
|
|
80
|
+
title: input.title.trim(),
|
|
81
|
+
start: input.start,
|
|
82
|
+
end: input.end,
|
|
83
|
+
owner: input.owner.trim(),
|
|
84
|
+
task_id: input.task_id ?? null,
|
|
85
|
+
status: input.status ?? DEFAULT_STATUS[input.kind],
|
|
86
|
+
meta: input.meta ? JSON.stringify(input.meta) : null,
|
|
87
|
+
created_at: now,
|
|
88
|
+
updated_at: now,
|
|
89
|
+
};
|
|
90
|
+
db.prepare(`
|
|
91
|
+
INSERT INTO schedule_entries (id, kind, title, start, end, owner, task_id, status, meta, created_at, updated_at)
|
|
92
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
93
|
+
`).run(entry.id, entry.kind, entry.title, entry.start, entry.end, entry.owner, entry.task_id, entry.status, entry.meta, entry.created_at, entry.updated_at);
|
|
94
|
+
return entry;
|
|
95
|
+
}
|
|
96
|
+
export function getScheduleEntry(id) {
|
|
97
|
+
ensureTable();
|
|
98
|
+
const db = getDb();
|
|
99
|
+
return db.prepare('SELECT * FROM schedule_entries WHERE id = ?').get(id) ?? null;
|
|
100
|
+
}
|
|
101
|
+
export function updateScheduleEntry(id, input) {
|
|
102
|
+
ensureTable();
|
|
103
|
+
const db = getDb();
|
|
104
|
+
const existing = getScheduleEntry(id);
|
|
105
|
+
if (!existing)
|
|
106
|
+
return null;
|
|
107
|
+
const now = Date.now();
|
|
108
|
+
const updated = {
|
|
109
|
+
...existing,
|
|
110
|
+
title: input.title?.trim() ?? existing.title,
|
|
111
|
+
start: input.start ?? existing.start,
|
|
112
|
+
end: input.end ?? existing.end,
|
|
113
|
+
status: input.status ?? existing.status,
|
|
114
|
+
meta: input.meta ? JSON.stringify(input.meta) : existing.meta,
|
|
115
|
+
updated_at: now,
|
|
116
|
+
};
|
|
117
|
+
if (updated.end <= updated.start)
|
|
118
|
+
throw new Error('end must be after start');
|
|
119
|
+
db.prepare(`
|
|
120
|
+
UPDATE schedule_entries
|
|
121
|
+
SET title = ?, start = ?, end = ?, status = ?, meta = ?, updated_at = ?
|
|
122
|
+
WHERE id = ?
|
|
123
|
+
`).run(updated.title, updated.start, updated.end, updated.status, updated.meta, now, id);
|
|
124
|
+
return updated;
|
|
125
|
+
}
|
|
126
|
+
export function deleteScheduleEntry(id) {
|
|
127
|
+
ensureTable();
|
|
128
|
+
const db = getDb();
|
|
129
|
+
const result = db.prepare('DELETE FROM schedule_entries WHERE id = ?').run(id);
|
|
130
|
+
return result.changes > 0;
|
|
131
|
+
}
|
|
132
|
+
// ── Feed query ─────────────────────────────────────────────────────────────
|
|
133
|
+
/**
|
|
134
|
+
* Returns upcoming schedule entries in chronological order.
|
|
135
|
+
* Default: all entries ending after now, ordered by start asc.
|
|
136
|
+
*/
|
|
137
|
+
export function getScheduleFeed(options = {}) {
|
|
138
|
+
ensureTable();
|
|
139
|
+
const db = getDb();
|
|
140
|
+
const now = Date.now();
|
|
141
|
+
const after = options.after ?? now;
|
|
142
|
+
const before = options.before;
|
|
143
|
+
const limit = Math.min(options.limit ?? 50, 200);
|
|
144
|
+
const conditions = ['end > ?'];
|
|
145
|
+
const params = [after];
|
|
146
|
+
if (before !== undefined) {
|
|
147
|
+
conditions.push('start < ?');
|
|
148
|
+
params.push(before);
|
|
149
|
+
}
|
|
150
|
+
if (options.kinds?.length) {
|
|
151
|
+
conditions.push(`kind IN (${options.kinds.map(() => '?').join(', ')})`);
|
|
152
|
+
params.push(...options.kinds);
|
|
153
|
+
}
|
|
154
|
+
if (options.owner) {
|
|
155
|
+
conditions.push('owner = ?');
|
|
156
|
+
params.push(options.owner);
|
|
157
|
+
}
|
|
158
|
+
params.push(limit);
|
|
159
|
+
const rows = db.prepare(`
|
|
160
|
+
SELECT * FROM schedule_entries
|
|
161
|
+
WHERE ${conditions.join(' AND ')}
|
|
162
|
+
ORDER BY start ASC
|
|
163
|
+
LIMIT ?
|
|
164
|
+
`).all(...params);
|
|
165
|
+
return rows;
|
|
166
|
+
}
|
|
167
|
+
// ── Test reset ─────────────────────────────────────────────────────────────
|
|
168
|
+
export function _resetScheduleStore() {
|
|
169
|
+
initialized = false;
|
|
170
|
+
try {
|
|
171
|
+
const db = getDb();
|
|
172
|
+
db.exec('DELETE FROM schedule_entries');
|
|
173
|
+
}
|
|
174
|
+
catch { /* ok in tests */ }
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=schedule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAA;AAo3D9D,wBAAsB,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,CA8wW7D"}
|