@glows777/vela-channels 0.0.0-stage → 0.5.0

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 (96) hide show
  1. package/CHANGELOG.md +263 -0
  2. package/LICENSE +21 -0
  3. package/README.md +4 -2
  4. package/dist/admission.d.ts +15 -0
  5. package/dist/admission.d.ts.map +1 -0
  6. package/dist/admission.js +31 -0
  7. package/dist/admission.js.map +1 -0
  8. package/dist/atomic-json.d.ts +3 -0
  9. package/dist/atomic-json.d.ts.map +1 -0
  10. package/dist/atomic-json.js +23 -0
  11. package/dist/atomic-json.js.map +1 -0
  12. package/dist/commands.d.ts +47 -0
  13. package/dist/commands.d.ts.map +1 -0
  14. package/dist/commands.js +130 -0
  15. package/dist/commands.js.map +1 -0
  16. package/dist/directory.d.ts +144 -0
  17. package/dist/directory.d.ts.map +1 -0
  18. package/dist/directory.js +309 -0
  19. package/dist/directory.js.map +1 -0
  20. package/dist/event-receiver.d.ts +19 -0
  21. package/dist/event-receiver.d.ts.map +1 -0
  22. package/dist/event-receiver.js +192 -0
  23. package/dist/event-receiver.js.map +1 -0
  24. package/dist/events.d.ts +40 -0
  25. package/dist/events.d.ts.map +1 -0
  26. package/dist/events.js +247 -0
  27. package/dist/events.js.map +1 -0
  28. package/dist/feedback.d.ts +61 -0
  29. package/dist/feedback.d.ts.map +1 -0
  30. package/dist/feedback.js +470 -0
  31. package/dist/feedback.js.map +1 -0
  32. package/dist/gateway.d.ts +76 -0
  33. package/dist/gateway.d.ts.map +1 -0
  34. package/dist/gateway.js +536 -0
  35. package/dist/gateway.js.map +1 -0
  36. package/dist/generic-events.d.ts +9 -0
  37. package/dist/generic-events.d.ts.map +1 -0
  38. package/dist/generic-events.js +33 -0
  39. package/dist/generic-events.js.map +1 -0
  40. package/dist/github-events.d.ts +11 -0
  41. package/dist/github-events.d.ts.map +1 -0
  42. package/dist/github-events.js +118 -0
  43. package/dist/github-events.js.map +1 -0
  44. package/dist/handoff.d.ts +28 -0
  45. package/dist/handoff.d.ts.map +1 -0
  46. package/dist/handoff.js +189 -0
  47. package/dist/handoff.js.map +1 -0
  48. package/dist/index.d.ts +8 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +5 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/log.d.ts +2 -0
  53. package/dist/log.d.ts.map +1 -0
  54. package/dist/log.js +2 -0
  55. package/dist/log.js.map +1 -0
  56. package/dist/recovery.d.ts +19 -0
  57. package/dist/recovery.d.ts.map +1 -0
  58. package/dist/recovery.js +190 -0
  59. package/dist/recovery.js.map +1 -0
  60. package/dist/routine-time.d.ts +8 -0
  61. package/dist/routine-time.d.ts.map +1 -0
  62. package/dist/routine-time.js +114 -0
  63. package/dist/routine-time.js.map +1 -0
  64. package/dist/routines.d.ts +126 -0
  65. package/dist/routines.d.ts.map +1 -0
  66. package/dist/routines.js +370 -0
  67. package/dist/routines.js.map +1 -0
  68. package/dist/scope.d.ts +11 -0
  69. package/dist/scope.d.ts.map +1 -0
  70. package/dist/scope.js +26 -0
  71. package/dist/scope.js.map +1 -0
  72. package/dist/session-id.d.ts +6 -0
  73. package/dist/session-id.d.ts.map +1 -0
  74. package/dist/session-id.js +21 -0
  75. package/dist/session-id.js.map +1 -0
  76. package/dist/sessions.d.ts +13 -0
  77. package/dist/sessions.d.ts.map +1 -0
  78. package/dist/sessions.js +40 -0
  79. package/dist/sessions.js.map +1 -0
  80. package/dist/testing.d.ts +4 -0
  81. package/dist/testing.d.ts.map +1 -0
  82. package/dist/testing.js +8 -0
  83. package/dist/testing.js.map +1 -0
  84. package/dist/types.d.ts +177 -0
  85. package/dist/types.d.ts.map +1 -0
  86. package/dist/types.js +2 -0
  87. package/dist/types.js.map +1 -0
  88. package/dist/usage.d.ts +31 -0
  89. package/dist/usage.d.ts.map +1 -0
  90. package/dist/usage.js +151 -0
  91. package/dist/usage.js.map +1 -0
  92. package/dist/vela.d.ts +38 -0
  93. package/dist/vela.d.ts.map +1 -0
  94. package/dist/vela.js +112 -0
  95. package/dist/vela.js.map +1 -0
  96. package/package.json +41 -4
@@ -0,0 +1,130 @@
1
+ /** Match only a complete normalized topic message, before history or sender decoration. */
2
+ function topicCommand(msg) {
3
+ const text = msg.text.trim();
4
+ if (text === '!routines')
5
+ return 'routines';
6
+ if (!msg.topic)
7
+ return;
8
+ if (text === '!stop')
9
+ return 'stop';
10
+ if (text === '!restart')
11
+ return 'restart';
12
+ if (text === '!status')
13
+ return 'status';
14
+ }
15
+ /** Topic command barriers and preparation cancellation; the gateway owns normal message queues. */
16
+ export class TopicCommands {
17
+ options;
18
+ commands = new Map();
19
+ processing = new Map();
20
+ active = new Set();
21
+ constructor(options) {
22
+ this.options = options;
23
+ }
24
+ begin(key) {
25
+ const state = { stopped: false };
26
+ this.processing.set(key, state);
27
+ return state;
28
+ }
29
+ end(key, state) {
30
+ if (this.processing.get(key) === state)
31
+ this.processing.delete(key);
32
+ }
33
+ receive(key, name, msg, admit, previous) {
34
+ const command = topicCommand(msg);
35
+ const barrier = this.commands.get(key);
36
+ // Only Stop/Restart cancel preparation; read-only commands leave live work alone.
37
+ const processing = !barrier &&
38
+ command &&
39
+ (command === 'stop' || command === 'restart') &&
40
+ this.processing.get(key);
41
+ if (processing && !this.options.stopped())
42
+ processing.stopped = true;
43
+ const stopping = processing ? this.options.feedback.stop(key) : undefined;
44
+ void stopping?.catch(() => { });
45
+ const admitted = admit();
46
+ if (command) {
47
+ const next = this.handleCommand(key, name, msg, command, admitted, previous, barrier, stopping);
48
+ const blocks = command === 'stop' || command === 'restart';
49
+ this.commands.set(key, next);
50
+ this.active.add(next);
51
+ void next.then(() => {
52
+ this.active.delete(next);
53
+ if (this.commands.get(key) === next)
54
+ this.commands.delete(key);
55
+ });
56
+ return { command: next, blocks, blocked: !!barrier, available: admitted };
57
+ }
58
+ // Later messages must not steer the generation being archived.
59
+ const available = barrier
60
+ ? admitted.then(async (accepted) => {
61
+ await barrier;
62
+ return accepted;
63
+ })
64
+ : admitted;
65
+ return { blocked: !!barrier, available };
66
+ }
67
+ async handleCommand(key, name, msg, command, admitted, previous, barrier, stopping) {
68
+ const o = this.options;
69
+ try {
70
+ if (!(await admitted))
71
+ return;
72
+ await barrier;
73
+ if (o.stopped())
74
+ return;
75
+ let stopped = false;
76
+ if (command === 'stop' || command === 'restart') {
77
+ const processing = this.processing.get(key);
78
+ if (processing)
79
+ processing.stopped = true;
80
+ stopped = (await (stopping ?? o.feedback.stop(key))) || !!processing;
81
+ await previous;
82
+ }
83
+ await o.closing(key);
84
+ if (o.stopped())
85
+ return;
86
+ const channel = o.channel(name);
87
+ if (!channel)
88
+ return;
89
+ const session = command === 'status'
90
+ ? (o.find(key) ?? (await o.admission.admit(key, channel, msg)))
91
+ : o.find(key);
92
+ await this.finish(command, key, channel, msg, stopped, session);
93
+ }
94
+ catch (error) {
95
+ await o.feedback.feedbackError(name, msg, error);
96
+ }
97
+ }
98
+ /** Stop/Restart arrive after the old run's normal delivery and finish path has drained. */
99
+ async finish(command, key, channel, msg, stopped, session) {
100
+ const { directory, feedback, usage } = this.options;
101
+ const inputs = feedback.acknowledge(channel, msg);
102
+ let outcome = 'failed';
103
+ try {
104
+ await Promise.all(inputs.map((input) => input.ready));
105
+ let text = stopped ? '' : 'No run is currently active.';
106
+ if (command === 'restart') {
107
+ // Save before closing: a save failure must retain the old live session.
108
+ await session?.save();
109
+ await session?.close();
110
+ directory.observe(key, channel.name, msg);
111
+ await directory.restart(key);
112
+ text = 'Restarted with a fresh session';
113
+ }
114
+ else if (command === 'routines') {
115
+ text = this.options.routines(channel.name, msg.channelId);
116
+ }
117
+ else if (command === 'status' && session) {
118
+ text = usage.status(key, channel.name, msg.channelId, session);
119
+ }
120
+ if (text)
121
+ await channel.send({ ...msg, recipientId: msg.senderId, text });
122
+ await directory.forget(key, msg.replyToId ? [msg.replyToId] : []);
123
+ outcome = 'done';
124
+ }
125
+ finally {
126
+ await Promise.all(inputs.map((input) => input.finish(outcome)));
127
+ }
128
+ }
129
+ }
130
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ import { z } from 'zod';
2
+ import type { ChannelTopic, IncomingMessage } from './types.ts';
3
+ declare const recordSchema: z.ZodObject<{
4
+ key: z.ZodString;
5
+ channel: z.ZodString;
6
+ legacyKey: z.ZodOptional<z.ZodString>;
7
+ storageKey: z.ZodOptional<z.ZodString>;
8
+ chatId: z.ZodString;
9
+ chatKind: z.ZodEnum<{
10
+ group: "group";
11
+ direct: "direct";
12
+ }>;
13
+ rootId: z.ZodOptional<z.ZodString>;
14
+ threadId: z.ZodOptional<z.ZodString>;
15
+ requester: z.ZodObject<{
16
+ id: z.ZodString;
17
+ name: z.ZodString;
18
+ }, z.core.$strip>;
19
+ replyTarget: z.ZodOptional<z.ZodString>;
20
+ task: z.ZodString;
21
+ activeSessionId: z.ZodString;
22
+ previousSessionIds: z.ZodArray<z.ZodString>;
23
+ state: z.ZodEnum<{
24
+ running: "running";
25
+ waiting: "waiting";
26
+ done: "done";
27
+ stopped: "stopped";
28
+ }>;
29
+ waitingReason: z.ZodOptional<z.ZodString>;
30
+ passive: z.ZodOptional<z.ZodBoolean>;
31
+ handoff: z.ZodOptional<z.ZodObject<{
32
+ id: z.ZodString;
33
+ from: z.ZodString;
34
+ depth: z.ZodNumber;
35
+ }, z.core.$strip>>;
36
+ routine: z.ZodOptional<z.ZodObject<{
37
+ id: z.ZodString;
38
+ scheduledAt: z.ZodString;
39
+ creator: z.ZodOptional<z.ZodObject<{
40
+ id: z.ZodString;
41
+ name: z.ZodString;
42
+ }, z.core.$strip>>;
43
+ }, z.core.$strip>>;
44
+ pendingMessageIds: z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
45
+ id: z.ZodString;
46
+ passive: z.ZodLiteral<true>;
47
+ }, z.core.$strip>]>>;
48
+ createdAt: z.ZodString;
49
+ updatedAt: z.ZodString;
50
+ }, z.core.$strip>;
51
+ export declare const channelIndexSchema: z.ZodObject<{
52
+ version: z.ZodLiteral<1>;
53
+ createdAt: z.ZodString;
54
+ records: z.ZodArray<z.ZodObject<{
55
+ key: z.ZodString;
56
+ channel: z.ZodString;
57
+ legacyKey: z.ZodOptional<z.ZodString>;
58
+ storageKey: z.ZodOptional<z.ZodString>;
59
+ chatId: z.ZodString;
60
+ chatKind: z.ZodEnum<{
61
+ group: "group";
62
+ direct: "direct";
63
+ }>;
64
+ rootId: z.ZodOptional<z.ZodString>;
65
+ threadId: z.ZodOptional<z.ZodString>;
66
+ requester: z.ZodObject<{
67
+ id: z.ZodString;
68
+ name: z.ZodString;
69
+ }, z.core.$strip>;
70
+ replyTarget: z.ZodOptional<z.ZodString>;
71
+ task: z.ZodString;
72
+ activeSessionId: z.ZodString;
73
+ previousSessionIds: z.ZodArray<z.ZodString>;
74
+ state: z.ZodEnum<{
75
+ running: "running";
76
+ waiting: "waiting";
77
+ done: "done";
78
+ stopped: "stopped";
79
+ }>;
80
+ waitingReason: z.ZodOptional<z.ZodString>;
81
+ passive: z.ZodOptional<z.ZodBoolean>;
82
+ handoff: z.ZodOptional<z.ZodObject<{
83
+ id: z.ZodString;
84
+ from: z.ZodString;
85
+ depth: z.ZodNumber;
86
+ }, z.core.$strip>>;
87
+ routine: z.ZodOptional<z.ZodObject<{
88
+ id: z.ZodString;
89
+ scheduledAt: z.ZodString;
90
+ creator: z.ZodOptional<z.ZodObject<{
91
+ id: z.ZodString;
92
+ name: z.ZodString;
93
+ }, z.core.$strip>>;
94
+ }, z.core.$strip>>;
95
+ pendingMessageIds: z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
96
+ id: z.ZodString;
97
+ passive: z.ZodLiteral<true>;
98
+ }, z.core.$strip>]>>;
99
+ createdAt: z.ZodString;
100
+ updatedAt: z.ZodString;
101
+ }, z.core.$strip>>;
102
+ notes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
103
+ }, z.core.$strip>;
104
+ export type ChannelRecord = z.infer<typeof recordSchema>;
105
+ /** Hand-off notes exist only in groups and address the group session without a service message. */
106
+ export declare function isGroupInput(msg: IncomingMessage): boolean;
107
+ /** Passive metadata travels with the existing pending ID, never in a second ID registry. */
108
+ export declare function pendingMessageId(input: ChannelRecord['pendingMessageIds'][number]): string;
109
+ /** One directory for recovery and topic discovery. No input text is copied here except the task label. */
110
+ export declare class ChannelDirectory {
111
+ private records;
112
+ private notes;
113
+ private loaded?;
114
+ private writing;
115
+ private readonly path?;
116
+ private createdAt;
117
+ constructor(dataDir?: string);
118
+ load(): Promise<void>;
119
+ private read;
120
+ get(key: string): ChannelRecord | undefined;
121
+ storageKey(channel: string, chatId: string): string | undefined;
122
+ sessionId(key: string): string;
123
+ keyForSession(id: string): string;
124
+ restart(key: string): Promise<void>;
125
+ entries(channel: string): ChannelRecord[];
126
+ get coverage(): string;
127
+ observe(key: string, channel: string, msg: IncomingMessage, task?: string): ChannelRecord;
128
+ admit(key: string, channel: string, msg: IncomingMessage): Promise<void>;
129
+ begin(key: string, msg: IncomingMessage): Promise<void>;
130
+ forget(key: string, ids: string[]): Promise<void>;
131
+ waitForInput(key: string, reason: string): Promise<void>;
132
+ finish(key: string, state: ChannelRecord['state'], answered?: boolean): Promise<void>;
133
+ list(channel: string, chatId: string, state: (id: string) => ChannelTopic['state']): ChannelTopic[];
134
+ /** Status lines for a group session's next run, oldest first. */
135
+ pendingNotes(key: string): readonly string[];
136
+ addNote(key: string, line: string): Promise<void>;
137
+ /** Drops these delivered notes once a session has saved them; newer ones stay. */
138
+ dropNotes(key: string, delivered: readonly string[]): Promise<void>;
139
+ flush(): Promise<void>;
140
+ private save;
141
+ private write;
142
+ }
143
+ export {};
144
+ //# sourceMappingURL=directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory.d.ts","sourceRoot":"","sources":["../src/directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,309 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { z } from 'zod';
5
+ import { writeAtomicJson } from "./atomic-json.js";
6
+ const recordSchema = z
7
+ .object({
8
+ key: z.string(),
9
+ channel: z.string(),
10
+ legacyKey: z.string().optional(),
11
+ storageKey: z
12
+ .string()
13
+ .regex(/^[A-Za-z0-9_.-]+$/)
14
+ .refine((key) => key !== '.' && key !== '..')
15
+ .optional(),
16
+ chatId: z.string(),
17
+ chatKind: z.enum(['group', 'direct']),
18
+ rootId: z.string().optional(),
19
+ threadId: z.string().optional(),
20
+ requester: z.object({ id: z.string(), name: z.string() }),
21
+ replyTarget: z.string().optional(),
22
+ task: z.string(),
23
+ activeSessionId: z.string(),
24
+ previousSessionIds: z.array(z.string()),
25
+ state: z.enum(['running', 'waiting', 'done', 'stopped']),
26
+ waitingReason: z.string().optional(),
27
+ passive: z.boolean().optional(),
28
+ handoff: z
29
+ .object({ id: z.string(), from: z.string(), depth: z.number() })
30
+ .optional(),
31
+ routine: z
32
+ .object({
33
+ id: z.string(),
34
+ scheduledAt: z.string(),
35
+ creator: z.object({ id: z.string(), name: z.string() }).optional(),
36
+ })
37
+ .optional(),
38
+ pendingMessageIds: z.array(z.union([
39
+ z.string(),
40
+ z.object({ id: z.string(), passive: z.literal(true) }),
41
+ ])),
42
+ createdAt: z.string(),
43
+ updatedAt: z.string(),
44
+ })
45
+ .refine((record) => !!record.rootId === !!record.threadId, 'Incomplete topic address');
46
+ export const channelIndexSchema = z.object({
47
+ version: z.literal(1),
48
+ createdAt: z.string(),
49
+ records: z.array(recordSchema),
50
+ /** Status lines waiting for a group session's next run, by group key. */
51
+ notes: z.record(z.string(), z.array(z.string())).optional(),
52
+ });
53
+ /** Hand-off notes exist only in groups and address the group session without a service message. */
54
+ export function isGroupInput(msg) {
55
+ return !!(msg.topic || msg.replyToId || msg.handoff);
56
+ }
57
+ const MAX_NOTES = 20;
58
+ const MAX_NOTE_CHARS = 300;
59
+ /** Passive metadata travels with the existing pending ID, never in a second ID registry. */
60
+ export function pendingMessageId(input) {
61
+ return typeof input === 'string' ? input : input.id;
62
+ }
63
+ /** One directory for recovery and topic discovery. No input text is copied here except the task label. */
64
+ export class ChannelDirectory {
65
+ records = new Map();
66
+ notes = new Map();
67
+ loaded;
68
+ writing = Promise.resolve();
69
+ path;
70
+ createdAt = new Date().toISOString();
71
+ constructor(dataDir) {
72
+ this.path = dataDir ? join(dataDir, 'channels', 'index.json') : undefined;
73
+ }
74
+ load() {
75
+ this.loaded ??= this.read();
76
+ return this.loaded;
77
+ }
78
+ async read() {
79
+ if (!this.path)
80
+ return;
81
+ const marker = join(this.path, '..', 'migration.json');
82
+ if (existsSync(marker)) {
83
+ const migration = JSON.parse(await readFile(marker, 'utf8'));
84
+ if (migration.version !== 1 || migration.status !== 'complete')
85
+ throw new Error('Channel migration is incomplete; rerun the migration utility before starting transports');
86
+ }
87
+ let text;
88
+ try {
89
+ text = await readFile(this.path, 'utf8');
90
+ }
91
+ catch (error) {
92
+ if (error.code === 'ENOENT')
93
+ return;
94
+ throw new Error(`Cannot read channel directory ${this.path}`, {
95
+ cause: error,
96
+ });
97
+ }
98
+ try {
99
+ const data = channelIndexSchema.parse(JSON.parse(text));
100
+ if (new Set(data.records.map((r) => r.key)).size !== data.records.length)
101
+ throw new Error('Duplicate channel key');
102
+ const keys = new Set(data.records.map((record) => record.key));
103
+ const legacy = data.records.flatMap((record) => record.legacyKey ? [record.legacyKey] : []);
104
+ if (new Set(legacy).size !== legacy.length ||
105
+ legacy.some((key) => keys.has(key)))
106
+ throw new Error('Conflicting legacy channel key');
107
+ const stores = new Map();
108
+ for (const record of data.records) {
109
+ const chat = JSON.stringify([record.channel, record.chatId]);
110
+ if (stores.has(chat) && stores.get(chat) !== record.storageKey)
111
+ throw new Error('Conflicting channel storage keys');
112
+ stores.set(chat, record.storageKey);
113
+ }
114
+ this.createdAt = data.createdAt;
115
+ this.records = new Map(data.records.map((record) => [record.key, record]));
116
+ this.notes = new Map(Object.entries(data.notes ?? {}));
117
+ }
118
+ catch (error) {
119
+ throw new Error(`Invalid channel directory ${this.path}: ${String(error)}`, { cause: error });
120
+ }
121
+ }
122
+ get(key) {
123
+ return (this.records.get(key) ??
124
+ [...this.records.values()].find((record) => record.legacyKey === key));
125
+ }
126
+ storageKey(channel, chatId) {
127
+ return this.entries(channel).find((record) => record.chatId === chatId)
128
+ ?.storageKey;
129
+ }
130
+ sessionId(key) {
131
+ return this.get(key)?.activeSessionId ?? key;
132
+ }
133
+ keyForSession(id) {
134
+ return ([...this.records.values()].find((record) => record.activeSessionId === id)
135
+ ?.key ?? id);
136
+ }
137
+ async restart(key) {
138
+ const record = this.records.get(key);
139
+ if (!record)
140
+ throw new Error(`Unknown channel session ${key}`);
141
+ const next = {
142
+ ...record,
143
+ activeSessionId: `channel-${crypto.randomUUID()}`,
144
+ previousSessionIds: [
145
+ ...record.previousSessionIds,
146
+ record.activeSessionId,
147
+ ],
148
+ state: 'done',
149
+ waitingReason: undefined,
150
+ };
151
+ await this.save(next, true);
152
+ }
153
+ entries(channel) {
154
+ return [...this.records.values()].filter((record) => record.channel === channel);
155
+ }
156
+ get coverage() {
157
+ return `Topics recorded since M2 directory creation at ${this.createdAt}; earlier topics may exist until they receive a new message. An empty list does not mean there are no tasks.`;
158
+ }
159
+ observe(key, channel, msg, task = msg.text) {
160
+ let record = this.records.get(key);
161
+ if (!record) {
162
+ const now = new Date().toISOString();
163
+ record = {
164
+ key,
165
+ channel,
166
+ chatId: msg.channelId,
167
+ chatKind: isGroupInput(msg) ? 'group' : 'direct',
168
+ rootId: msg.topic?.rootId,
169
+ threadId: msg.topic?.threadId,
170
+ requester: { id: msg.senderId, name: msg.senderName },
171
+ replyTarget: msg.replyToId,
172
+ task: task.slice(0, 120),
173
+ activeSessionId: key,
174
+ storageKey: this.storageKey(channel, msg.channelId),
175
+ previousSessionIds: [],
176
+ state: 'done',
177
+ pendingMessageIds: [],
178
+ createdAt: now,
179
+ updatedAt: now,
180
+ };
181
+ this.records.set(key, record);
182
+ }
183
+ return record;
184
+ }
185
+ async admit(key, channel, msg) {
186
+ const record = this.observe(key, channel, msg);
187
+ // A note from another session never answers a person's pending decision.
188
+ if (!msg.handoff) {
189
+ record.waitingReason = undefined;
190
+ if (record.state === 'waiting')
191
+ record.state = 'done';
192
+ }
193
+ // A note has no service message of its own: its reply target is the topic root.
194
+ if (msg.replyToId &&
195
+ !msg.routine &&
196
+ !msg.handoff &&
197
+ !record.pendingMessageIds.some((input) => pendingMessageId(input) === msg.replyToId))
198
+ record.pendingMessageIds.push(msg.passive ? { id: msg.replyToId, passive: true } : msg.replyToId);
199
+ await this.save(record);
200
+ }
201
+ async begin(key, msg) {
202
+ const record = this.records.get(key);
203
+ if (!record)
204
+ return;
205
+ record.state = 'running';
206
+ record.passive = msg.passive;
207
+ record.handoff = msg.handoff;
208
+ record.routine = msg.routine
209
+ ? { ...msg.routine, creator: { id: msg.senderId, name: msg.senderName } }
210
+ : undefined;
211
+ if (!record.rootId || record.requester.id === msg.senderId)
212
+ record.requester = { id: msg.senderId, name: msg.senderName };
213
+ record.replyTarget = msg.replyToId;
214
+ await this.save(record);
215
+ }
216
+ async forget(key, ids) {
217
+ const record = this.records.get(key);
218
+ if (!record?.pendingMessageIds.some((input) => ids.includes(pendingMessageId(input))))
219
+ return;
220
+ record.pendingMessageIds = record.pendingMessageIds.filter((input) => !ids.includes(pendingMessageId(input)));
221
+ await this.save(record);
222
+ }
223
+ async waitForInput(key, reason) {
224
+ const record = this.records.get(key);
225
+ if (!record?.rootId)
226
+ throw new Error('Waiting requires a topic');
227
+ record.waitingReason = reason;
228
+ await this.save(record);
229
+ }
230
+ async finish(key, state, answered = false) {
231
+ const record = this.records.get(key);
232
+ if (!record)
233
+ return;
234
+ record.state =
235
+ state === 'done' && answered && record.waitingReason ? 'waiting' : state;
236
+ if (record.state !== 'waiting')
237
+ record.waitingReason = undefined;
238
+ await this.save(record);
239
+ }
240
+ list(channel, chatId, state) {
241
+ return this.entries(channel).flatMap((record) => record.chatId === chatId && record.rootId && record.threadId
242
+ ? [
243
+ {
244
+ rootId: record.rootId,
245
+ threadId: record.threadId,
246
+ task: record.task,
247
+ state: state(record.key),
248
+ requester: record.requester,
249
+ updatedAt: record.updatedAt,
250
+ waitingReason: record.waitingReason,
251
+ },
252
+ ]
253
+ : []);
254
+ }
255
+ /** Status lines for a group session's next run, oldest first. */
256
+ pendingNotes(key) {
257
+ return this.notes.get(key) ?? [];
258
+ }
259
+ addNote(key, line) {
260
+ const note = line.length > MAX_NOTE_CHARS ? `${line.slice(0, MAX_NOTE_CHARS)}…` : line;
261
+ this.notes.set(key, [...this.pendingNotes(key), note].slice(-MAX_NOTES));
262
+ return this.write();
263
+ }
264
+ /** Drops these delivered notes once a session has saved them; newer ones stay. */
265
+ dropNotes(key, delivered) {
266
+ const rest = [...this.pendingNotes(key)];
267
+ for (const note of delivered) {
268
+ const index = rest.indexOf(note);
269
+ if (index >= 0)
270
+ rest.splice(index, 1);
271
+ }
272
+ if (rest.length)
273
+ this.notes.set(key, rest);
274
+ else
275
+ this.notes.delete(key);
276
+ return this.write();
277
+ }
278
+ flush() {
279
+ return this.writing;
280
+ }
281
+ save(record, replace = false) {
282
+ record.updatedAt = new Date().toISOString();
283
+ return this.write(replace ? record : undefined);
284
+ }
285
+ write(replacement) {
286
+ const path = this.path;
287
+ if (!path) {
288
+ if (replacement)
289
+ this.records.set(replacement.key, replacement);
290
+ return Promise.resolve();
291
+ }
292
+ const write = this.writing
293
+ .catch(() => { })
294
+ .then(async () => {
295
+ // Later saves see only generations whose index write succeeded.
296
+ await writeAtomicJson(path, {
297
+ version: 1,
298
+ createdAt: this.createdAt,
299
+ records: [...this.records.values()].map((current) => current.key === replacement?.key ? replacement : current),
300
+ ...(this.notes.size ? { notes: Object.fromEntries(this.notes) } : {}),
301
+ });
302
+ if (replacement)
303
+ this.records.set(replacement.key, replacement);
304
+ });
305
+ this.writing = write;
306
+ return write;
307
+ }
308
+ }
309
+ //# sourceMappingURL=directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory.js","sourceRoot":"","sources":["../src/directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { VelaLogger } from '@glows777/vela-core/extension-api';
2
+ import type { ChannelEvent } from './types.ts';
3
+ /** Optional ingress owned by the channel assembly; no daemon, persisted cache or provider access. */
4
+ export declare class EventReceiver {
5
+ private publish;
6
+ private logger;
7
+ private readonly options;
8
+ private server?;
9
+ private starting?;
10
+ private readonly active;
11
+ private readonly seen;
12
+ private accepting;
13
+ constructor(config: unknown, publish: (event: ChannelEvent) => Promise<void>, logger: VelaLogger);
14
+ start(): Promise<void>;
15
+ private listen;
16
+ stop(): Promise<void>;
17
+ private handle;
18
+ }
19
+ //# sourceMappingURL=event-receiver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-receiver.d.ts","sourceRoot":"","sources":["../src/event-receiver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAKnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAmE9C,qGAAqG;AACrG,qBAAa,aAAa;IAUtB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;IAVhB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,MAAM,CAAC,CAAiC;IAChD,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IACzC,OAAO,CAAC,SAAS,CAAQ;gBAGvB,MAAM,EAAE,OAAO,EACP,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,EAC/C,MAAM,EAAE,UAAU;IAU5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAKR,MAAM;IAwBd,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAeb,MAAM;CAiFrB"}