paperkite 0.1.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 (121) hide show
  1. package/README.md +81 -0
  2. package/data/flows.example.yml +65 -0
  3. package/data/settings.example.yml +13 -0
  4. package/dist/data/hooks/weekend-slot.d.ts +12 -0
  5. package/dist/data/hooks/weekend-slot.js +107 -0
  6. package/dist/data/hooks/weekend-slot.js.map +1 -0
  7. package/dist/packages/account-health/src/index.d.ts +8 -0
  8. package/dist/packages/account-health/src/index.js +37 -0
  9. package/dist/packages/account-health/src/index.js.map +1 -0
  10. package/dist/packages/archive/src/archiver.d.ts +98 -0
  11. package/dist/packages/archive/src/archiver.js +399 -0
  12. package/dist/packages/archive/src/archiver.js.map +1 -0
  13. package/dist/packages/archive/src/config.d.ts +22 -0
  14. package/dist/packages/archive/src/config.js +62 -0
  15. package/dist/packages/archive/src/config.js.map +1 -0
  16. package/dist/packages/archive/src/console/live.d.ts +24 -0
  17. package/dist/packages/archive/src/console/live.js +144 -0
  18. package/dist/packages/archive/src/console/live.js.map +1 -0
  19. package/dist/packages/archive/src/console/media.d.ts +66 -0
  20. package/dist/packages/archive/src/console/media.js +368 -0
  21. package/dist/packages/archive/src/console/media.js.map +1 -0
  22. package/dist/packages/archive/src/console/server.d.ts +12 -0
  23. package/dist/packages/archive/src/console/server.js +583 -0
  24. package/dist/packages/archive/src/console/server.js.map +1 -0
  25. package/dist/packages/archive/src/console/service.d.ts +13 -0
  26. package/dist/packages/archive/src/console/service.js +86 -0
  27. package/dist/packages/archive/src/console/service.js.map +1 -0
  28. package/dist/packages/archive/src/storage/index.d.ts +6 -0
  29. package/dist/packages/archive/src/storage/index.js +23 -0
  30. package/dist/packages/archive/src/storage/index.js.map +1 -0
  31. package/dist/packages/archive/src/storage/model.d.ts +296 -0
  32. package/dist/packages/archive/src/storage/model.js +151 -0
  33. package/dist/packages/archive/src/storage/model.js.map +1 -0
  34. package/dist/packages/archive/src/storage/postgres.d.ts +67 -0
  35. package/dist/packages/archive/src/storage/postgres.js +1021 -0
  36. package/dist/packages/archive/src/storage/postgres.js.map +1 -0
  37. package/dist/packages/archive/src/storage/sqlite.d.ts +59 -0
  38. package/dist/packages/archive/src/storage/sqlite.js +981 -0
  39. package/dist/packages/archive/src/storage/sqlite.js.map +1 -0
  40. package/dist/packages/notify-bark/src/index.d.ts +33 -0
  41. package/dist/packages/notify-bark/src/index.js +96 -0
  42. package/dist/packages/notify-bark/src/index.js.map +1 -0
  43. package/dist/packages/runtime-console/src/console/errors.d.ts +5 -0
  44. package/dist/packages/runtime-console/src/console/errors.js +11 -0
  45. package/dist/packages/runtime-console/src/console/errors.js.map +1 -0
  46. package/dist/packages/runtime-console/src/console/logs.d.ts +1 -0
  47. package/dist/packages/runtime-console/src/console/logs.js +27 -0
  48. package/dist/packages/runtime-console/src/console/logs.js.map +1 -0
  49. package/dist/packages/runtime-console/src/console/server.d.ts +6 -0
  50. package/dist/packages/runtime-console/src/console/server.js +182 -0
  51. package/dist/packages/runtime-console/src/console/server.js.map +1 -0
  52. package/dist/packages/runtime-console/src/index.d.ts +10 -0
  53. package/dist/packages/runtime-console/src/index.js +83 -0
  54. package/dist/packages/runtime-console/src/index.js.map +1 -0
  55. package/dist/src/app.d.ts +15 -0
  56. package/dist/src/app.js +34 -0
  57. package/dist/src/app.js.map +1 -0
  58. package/dist/src/cli.d.ts +2 -0
  59. package/dist/src/cli.js +250 -0
  60. package/dist/src/cli.js.map +1 -0
  61. package/dist/src/config/editor.d.ts +2 -0
  62. package/dist/src/config/editor.js +19 -0
  63. package/dist/src/config/editor.js.map +1 -0
  64. package/dist/src/config/loader.d.ts +6 -0
  65. package/dist/src/config/loader.js +188 -0
  66. package/dist/src/config/loader.js.map +1 -0
  67. package/dist/src/config/model.d.ts +71 -0
  68. package/dist/src/config/model.js +97 -0
  69. package/dist/src/config/model.js.map +1 -0
  70. package/dist/src/config/paths.d.ts +3 -0
  71. package/dist/src/config/paths.js +12 -0
  72. package/dist/src/config/paths.js.map +1 -0
  73. package/dist/src/config/settings.d.ts +19 -0
  74. package/dist/src/config/settings.js +44 -0
  75. package/dist/src/config/settings.js.map +1 -0
  76. package/dist/src/control/process-lock.d.ts +4 -0
  77. package/dist/src/control/process-lock.js +57 -0
  78. package/dist/src/control/process-lock.js.map +1 -0
  79. package/dist/src/control/socket.d.ts +14 -0
  80. package/dist/src/control/socket.js +131 -0
  81. package/dist/src/control/socket.js.map +1 -0
  82. package/dist/src/engine/hooks.d.ts +4 -0
  83. package/dist/src/engine/hooks.js +38 -0
  84. package/dist/src/engine/hooks.js.map +1 -0
  85. package/dist/src/engine/logger.d.ts +17 -0
  86. package/dist/src/engine/logger.js +78 -0
  87. package/dist/src/engine/logger.js.map +1 -0
  88. package/dist/src/engine/runtime.d.ts +78 -0
  89. package/dist/src/engine/runtime.js +799 -0
  90. package/dist/src/engine/runtime.js.map +1 -0
  91. package/dist/src/engine/scheduler.d.ts +9 -0
  92. package/dist/src/engine/scheduler.js +58 -0
  93. package/dist/src/engine/scheduler.js.map +1 -0
  94. package/dist/src/extensions/loader.d.ts +11 -0
  95. package/dist/src/extensions/loader.js +202 -0
  96. package/dist/src/extensions/loader.js.map +1 -0
  97. package/dist/src/extensions/manager.d.ts +1 -0
  98. package/dist/src/extensions/manager.js +121 -0
  99. package/dist/src/extensions/manager.js.map +1 -0
  100. package/dist/src/extensions/profile.d.ts +14 -0
  101. package/dist/src/extensions/profile.js +57 -0
  102. package/dist/src/extensions/profile.js.map +1 -0
  103. package/dist/src/extensions/registry.d.ts +19 -0
  104. package/dist/src/extensions/registry.js +62 -0
  105. package/dist/src/extensions/registry.js.map +1 -0
  106. package/dist/src/telegram/client.d.ts +20 -0
  107. package/dist/src/telegram/client.js +54 -0
  108. package/dist/src/telegram/client.js.map +1 -0
  109. package/dist/src/telegram/failure.d.ts +2 -0
  110. package/dist/src/telegram/failure.js +98 -0
  111. package/dist/src/telegram/failure.js.map +1 -0
  112. package/dist/src/telegram/login.d.ts +1 -0
  113. package/dist/src/telegram/login.js +31 -0
  114. package/dist/src/telegram/login.js.map +1 -0
  115. package/dist/src/telegram/pool.d.ts +47 -0
  116. package/dist/src/telegram/pool.js +300 -0
  117. package/dist/src/telegram/pool.js.map +1 -0
  118. package/dist/src/telegram/session-files.d.ts +4 -0
  119. package/dist/src/telegram/session-files.js +34 -0
  120. package/dist/src/telegram/session-files.js.map +1 -0
  121. package/package.json +62 -0
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,250 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { access, copyFile, mkdir } from "node:fs/promises";
4
+ import { dirname, join } from "node:path";
5
+ import { loadCatalog } from "./config/loader.js";
6
+ import { defaultFlowsFile, defaultSettingsFile, paperkiteHome } from "./config/paths.js";
7
+ import { coreRoot } from "./extensions/loader.js";
8
+ import { ensureProfile } from "./extensions/profile.js";
9
+ import { managePlugins } from "./extensions/manager.js";
10
+ import { createApp, defaultLockFile } from "./app.js";
11
+ import { acquireProcessLock } from "./control/process-lock.js";
12
+ import { requestControl, startControlServer } from "./control/socket.js";
13
+ import { loginSession } from "./telegram/login.js";
14
+ const program = new Command()
15
+ .name("paperkite")
16
+ .description("A focused TypeScript automation runtime for Telegram workflows")
17
+ .version("0.1.0");
18
+ program
19
+ .command("init")
20
+ .description("create the local plugin profile directory")
21
+ .option("--profile <name>", "profile name", "default")
22
+ .action(async ({ profile }) => {
23
+ const directory = await ensureProfile(profile);
24
+ const examples = join(coreRoot(), "data");
25
+ const home = paperkiteHome();
26
+ await copyIfMissing(join(examples, "settings.example.yml"), join(home, "settings.yml"));
27
+ await copyIfMissing(join(examples, "flows.example.yml"), join(home, "flows.yml"));
28
+ process.stdout.write(directory + "\n");
29
+ });
30
+ program
31
+ .command("plugin")
32
+ .description("install, remove, or update plugins in a profile")
33
+ .argument("[pnpmArgs...]", "arguments passed to pnpm")
34
+ .option("--profile <name>", "profile name", "default")
35
+ .allowUnknownOption(true)
36
+ .action((args, options) => {
37
+ process.exitCode = managePlugins(options.profile, args);
38
+ });
39
+ program
40
+ .command("flows")
41
+ .description("list configured flows")
42
+ .option("--flows <file>", "flows file", defaultFlowsFile())
43
+ .action(async (options) => {
44
+ const catalog = await loadCatalog(options.flows);
45
+ const output = {
46
+ triggers: catalog.definitions("trigger"),
47
+ commands: catalog.definitions("command"),
48
+ schedules: catalog.definitions("schedule"),
49
+ services: catalog.definitions("service")
50
+ };
51
+ process.stdout.write(JSON.stringify(output, null, 2) + "\n");
52
+ });
53
+ program
54
+ .command("once")
55
+ .description("run one configured flow")
56
+ .argument("<flow>", "command or schedule id")
57
+ .option("--profile <name>", "profile name", "default")
58
+ .option("--settings <file>", "settings file", defaultSettingsFile())
59
+ .option("--flows <file>", "flows file", defaultFlowsFile())
60
+ .action(async (flow, options) => {
61
+ const app = await createApp({ profile: options.profile, settingsFile: options.settings, flowsFile: options.flows });
62
+ try {
63
+ await app.runtime.runFlow(flow);
64
+ }
65
+ finally {
66
+ await app.runtime.stop();
67
+ }
68
+ });
69
+ const service = program
70
+ .command("service")
71
+ .description("inspect or run one configured service");
72
+ service
73
+ .command("list")
74
+ .description("list configured services")
75
+ .option("--flows <file>", "flows file", defaultFlowsFile())
76
+ .action(async (options) => {
77
+ const catalog = await loadCatalog(options.flows);
78
+ process.stdout.write(JSON.stringify(catalog.definitions("service"), null, 2) + "\n");
79
+ });
80
+ service
81
+ .command("run <id>")
82
+ .description("run one service in the foreground")
83
+ .option("--profile <name>", "profile name", "default")
84
+ .option("--settings <file>", "settings file", defaultSettingsFile())
85
+ .option("--flows <file>", "flows file", defaultFlowsFile())
86
+ .action(async (id, options) => {
87
+ const lock = await acquireProcessLock(defaultLockFile());
88
+ let app;
89
+ let control;
90
+ try {
91
+ const runningApp = await createApp({ profile: options.profile, settingsFile: options.settings, flowsFile: options.flows });
92
+ app = runningApp;
93
+ await runningApp.runtime.startService(id);
94
+ control = await startControlServer(runningApp.runtime);
95
+ await waitForSignals(async () => {
96
+ await runningApp.runtime.stop();
97
+ await control?.close();
98
+ await lock.release();
99
+ });
100
+ }
101
+ catch (error) {
102
+ await app?.runtime.stop().catch(() => undefined);
103
+ await control?.close().catch(() => undefined);
104
+ await lock.release();
105
+ throw error;
106
+ }
107
+ });
108
+ service
109
+ .command("status [id]")
110
+ .description("read the running process snapshot")
111
+ .action(async (id) => {
112
+ try {
113
+ const snapshot = await requestControl({ action: "snapshot" });
114
+ if (!id) {
115
+ process.stdout.write(JSON.stringify(snapshot, null, 2) + "\n");
116
+ return;
117
+ }
118
+ const active = Array.isArray(snapshot.activeServices) && snapshot.activeServices.includes(id);
119
+ process.stdout.write(JSON.stringify({ id, active }, null, 2) + "\n");
120
+ }
121
+ catch {
122
+ process.stdout.write(JSON.stringify({ running: false }, null, 2) + "\n");
123
+ }
124
+ });
125
+ for (const operation of ["start", "stop"]) {
126
+ service
127
+ .command(`${operation} <id>`)
128
+ .description(`${operation} a service in the running process`)
129
+ .action(async (id) => {
130
+ await requestControl({ action: `service.${operation}`, id });
131
+ });
132
+ }
133
+ service
134
+ .command("restart <id>")
135
+ .description("reload a service so its current definition applies")
136
+ .action(async (id) => {
137
+ await requestControl({ action: "flow.reload", id });
138
+ });
139
+ const session = program
140
+ .command("session")
141
+ .description("inspect or manage telegram sessions of the running process");
142
+ session
143
+ .command("status [id]")
144
+ .description("read session states")
145
+ .action(async (id) => {
146
+ try {
147
+ const snapshot = await requestControl({ action: "snapshot" });
148
+ const sessions = Array.isArray(snapshot.sessions) ? snapshot.sessions : [];
149
+ if (id) {
150
+ const entry = sessions.find((item) => item.name === id);
151
+ if (!entry)
152
+ throw new Error("unknown session: " + id);
153
+ process.stdout.write(JSON.stringify(entry, null, 2) + "\n");
154
+ return;
155
+ }
156
+ process.stdout.write(JSON.stringify(sessions, null, 2) + "\n");
157
+ }
158
+ catch {
159
+ process.stdout.write(JSON.stringify({ running: false }, null, 2) + "\n");
160
+ }
161
+ });
162
+ session
163
+ .command("reconnect <id>")
164
+ .description("trigger a session reconnect attempt now")
165
+ .action(async (id) => {
166
+ await requestControl({ action: "session.reconnect", id });
167
+ });
168
+ session
169
+ .command("login <id>")
170
+ .description("log in a session without a running process")
171
+ .option("--settings <file>", "settings file", defaultSettingsFile())
172
+ .action(async (id, options) => {
173
+ await loginSession(id, options.settings);
174
+ process.stdout.write("session login ok: " + id + "\n");
175
+ await requestControl({ action: "session.reconnect", id }).catch(() => undefined);
176
+ });
177
+ program
178
+ .command("plugins")
179
+ .description("list plugins loaded by the running process")
180
+ .action(async () => {
181
+ try {
182
+ const plugins = await requestControl({ action: "plugins" });
183
+ process.stdout.write(JSON.stringify(plugins, null, 2) + "\n");
184
+ }
185
+ catch {
186
+ process.stdout.write(JSON.stringify({ running: false }, null, 2) + "\n");
187
+ }
188
+ });
189
+ program
190
+ .command("run")
191
+ .description("start configured triggers, schedules, and services")
192
+ .option("--profile <name>", "profile name", "default")
193
+ .option("--settings <file>", "settings file", defaultSettingsFile())
194
+ .option("--flows <file>", "flows file", defaultFlowsFile())
195
+ .action(async (options) => {
196
+ const lock = await acquireProcessLock(defaultLockFile());
197
+ let app;
198
+ let control;
199
+ try {
200
+ const runningApp = await createApp({ profile: options.profile, settingsFile: options.settings, flowsFile: options.flows });
201
+ app = runningApp;
202
+ await runningApp.runtime.start();
203
+ control = await startControlServer(runningApp.runtime);
204
+ await waitForSignals(async () => {
205
+ await runningApp.runtime.stop();
206
+ await control?.close();
207
+ await lock.release();
208
+ });
209
+ }
210
+ catch (error) {
211
+ await app?.runtime.stop().catch(() => undefined);
212
+ await control?.close().catch(() => undefined);
213
+ await lock.release();
214
+ throw error;
215
+ }
216
+ });
217
+ async function waitForSignals(stop) {
218
+ await new Promise((resolve, reject) => {
219
+ let finished = false;
220
+ const keepAlive = setInterval(() => undefined, 60_000);
221
+ const finish = () => {
222
+ if (finished)
223
+ return;
224
+ finished = true;
225
+ clearInterval(keepAlive);
226
+ process.off("SIGINT", finish);
227
+ process.off("SIGTERM", finish);
228
+ void stop().then(resolve, reject);
229
+ };
230
+ process.once("SIGINT", finish);
231
+ process.once("SIGTERM", finish);
232
+ });
233
+ }
234
+ async function copyIfMissing(source, target) {
235
+ try {
236
+ await access(target);
237
+ }
238
+ catch {
239
+ await mkdir(dirname(target), { recursive: true });
240
+ await copyFile(source, target);
241
+ }
242
+ }
243
+ try {
244
+ await program.parseAsync(process.argv);
245
+ }
246
+ catch (error) {
247
+ process.stderr.write((error instanceof Error ? error.message : String(error)) + "\n");
248
+ process.exitCode = 1;
249
+ }
250
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { FlowSection } from "./model.js";
2
+ export declare function updateItemInFile(file: string, section: FlowSection, id: string, patch: Record<string, unknown>): Promise<void>;
@@ -0,0 +1,19 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { YAMLMap, YAMLSeq, parseDocument } from "yaml";
3
+ export async function updateItemInFile(file, section, id, patch) {
4
+ const text = await readFile(file, "utf8");
5
+ const doc = parseDocument(text, { merge: true });
6
+ const items = doc.get(section);
7
+ if (!(items instanceof YAMLSeq))
8
+ throw new Error(`missing ${section} section`);
9
+ const index = items.items.findIndex((item) => item instanceof YAMLMap && item.get("id") === id);
10
+ if (index < 0)
11
+ throw new Error(`missing ${section} item: ${id}`);
12
+ for (const [key, value] of Object.entries(patch)) {
13
+ if (value === undefined)
14
+ continue;
15
+ doc.setIn([section, index, key], value);
16
+ }
17
+ await writeFile(file, doc.toString(), "utf8");
18
+ }
19
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../../src/config/editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAGvD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,OAAoB,EACpB,EAAU,EACV,KAA8B;IAE9B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,CAAC,KAAK,YAAY,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,UAAU,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAChG,IAAI,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,UAAU,EAAE,EAAE,CAAC,CAAC;IACjE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { FlowCatalog, type FlowKind, type FlowSection } from "./model.js";
2
+ export declare const DEFAULT_FLOWS_PATH: string;
3
+ export declare function loadCatalog(path?: string): Promise<FlowCatalog>;
4
+ export declare function fromMapping(value: Record<string, unknown>, path?: string): FlowCatalog;
5
+ export declare function updateFlowItem(catalog: FlowCatalog, identifier: string, patch: Record<string, unknown>, kind?: FlowKind): Promise<FlowCatalog | undefined>;
6
+ export declare function sectionFor(kind: FlowKind): FlowSection;
@@ -0,0 +1,188 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ import { parse } from "yaml";
4
+ import { defaultFlowsFile } from "./paths.js";
5
+ import { updateItemInFile } from "./editor.js";
6
+ import { FlowCatalog, isRecord, normalizeBool, normalizeMaxRuns, normalizePositiveInt, normalizeSession } from "./model.js";
7
+ export const DEFAULT_FLOWS_PATH = defaultFlowsFile();
8
+ export async function loadCatalog(path = DEFAULT_FLOWS_PATH) {
9
+ const absolutePath = resolve(path);
10
+ let text = "";
11
+ try {
12
+ text = await readFile(absolutePath, "utf8");
13
+ }
14
+ catch (error) {
15
+ if (isNodeError(error) && error.code === "ENOENT")
16
+ return fromMapping({}, absolutePath);
17
+ throw error;
18
+ }
19
+ const parsed = parse(text, { merge: true });
20
+ return fromMapping(isRecord(parsed) ? parsed : {}, absolutePath);
21
+ }
22
+ export function fromMapping(value, path) {
23
+ const definitions = {
24
+ trigger: parseTriggers(value.triggers),
25
+ command: parseCommands(value.commands),
26
+ schedule: parseSchedules(value.schedules),
27
+ service: parseServices(value.services)
28
+ };
29
+ for (const [kind, items] of Object.entries(definitions)) {
30
+ const ids = new Set();
31
+ for (const item of items) {
32
+ if (ids.has(item.id))
33
+ throw new Error(`duplicate ${kind} id: ${item.id}`);
34
+ ids.add(item.id);
35
+ }
36
+ }
37
+ return new FlowCatalog(definitions, path);
38
+ }
39
+ const PATCH_FIELDS = {
40
+ trigger: ["enabled", "config", "session", "maxRuns", "logFile", "actions"],
41
+ command: ["title", "symbol", "run"],
42
+ schedule: ["enabled", "session", "cron", "intervalSeconds", "logFile", "run"],
43
+ service: ["enabled", "config", "session", "autoStart", "logFile"]
44
+ };
45
+ export async function updateFlowItem(catalog, identifier, patch, kind) {
46
+ const item = catalog.find(identifier, kind);
47
+ if (!item || !item.explicitId || !catalog.path)
48
+ return undefined;
49
+ const allowed = PATCH_FIELDS[item.kind];
50
+ for (const key of Object.keys(patch)) {
51
+ if (!allowed.includes(key))
52
+ throw new Error(`flow ${item.id} does not accept field ${key}`);
53
+ }
54
+ const section = sectionFor(item.kind);
55
+ const root = parse(await readFile(catalog.path, "utf8"), { merge: true });
56
+ const entries = list(root[section], section);
57
+ const index = entries.findIndex((entry) => String(entry.id ?? "").trim() === item.id);
58
+ if (index < 0)
59
+ throw new Error(`missing ${section} item: ${item.id}`);
60
+ entries[index] = { ...entries[index], ...patch };
61
+ const next = fromMapping({ ...root, [section]: entries }, catalog.path);
62
+ await updateItemInFile(catalog.path, section, item.id, patch);
63
+ return next;
64
+ }
65
+ function parseTriggers(value) {
66
+ return list(value, "triggers").map((item, index) => {
67
+ const capability = text(item.capability, "trigger capability");
68
+ const actions = list(item.actions, "trigger actions").map((action) => parseAction(action));
69
+ return {
70
+ kind: "trigger",
71
+ id: makeId(capability, item.id, index),
72
+ capability,
73
+ enabled: normalizeBool(item.enabled, true),
74
+ session: normalizeSession(item.session),
75
+ config: item.config ?? {},
76
+ actions,
77
+ maxRuns: normalizeMaxRuns(item.maxRuns),
78
+ logFile: normalizeBool(item.logFile, false),
79
+ sourceIndex: index,
80
+ explicitId: hasId(item.id)
81
+ };
82
+ });
83
+ }
84
+ function parseCommands(value) {
85
+ return list(value, "commands").map((item, index) => {
86
+ if ("enabled" in item)
87
+ throw new Error("commands do not support enabled; remove the entry to hide it");
88
+ const action = parseAction(item.run);
89
+ const id = makeId(action.capability, item.id, index);
90
+ return {
91
+ kind: "command",
92
+ id,
93
+ title: text(item.title, "command title", false) || id,
94
+ symbol: text(item.symbol, "command symbol", false) || undefined,
95
+ action,
96
+ sourceIndex: index,
97
+ explicitId: hasId(item.id)
98
+ };
99
+ });
100
+ }
101
+ function parseSchedules(value) {
102
+ return list(value, "schedules").map((item, index) => {
103
+ const action = parseAction(item.run);
104
+ const cron = text(item.cron, "schedule cron", false) || undefined;
105
+ const intervalSeconds = normalizePositiveInt(item.intervalSeconds, "intervalSeconds");
106
+ if ((cron ? 1 : 0) + (intervalSeconds ? 1 : 0) !== 1) {
107
+ throw new Error(`schedule ${item.id ?? index + 1} needs exactly one of cron or intervalSeconds`);
108
+ }
109
+ return {
110
+ kind: "schedule",
111
+ id: makeId(action.capability, item.id, index),
112
+ enabled: normalizeBool(item.enabled, true),
113
+ session: normalizeSession(item.session),
114
+ action,
115
+ cron,
116
+ intervalSeconds,
117
+ logFile: normalizeBool(item.logFile, false),
118
+ sourceIndex: index,
119
+ explicitId: hasId(item.id)
120
+ };
121
+ });
122
+ }
123
+ function parseServices(value) {
124
+ return list(value, "services").map((item, index) => {
125
+ const capability = text(item.capability, "service capability");
126
+ return {
127
+ kind: "service",
128
+ id: makeId(capability, item.id, index),
129
+ capability,
130
+ enabled: normalizeBool(item.enabled, true),
131
+ session: normalizeSession(item.session),
132
+ config: item.config ?? {},
133
+ autoStart: normalizeBool(item.autoStart, true),
134
+ logFile: normalizeBool(item.logFile, false),
135
+ sourceIndex: index,
136
+ explicitId: hasId(item.id)
137
+ };
138
+ });
139
+ }
140
+ function parseAction(value) {
141
+ if (typeof value === "string")
142
+ return { capability: value.trim(), config: {} };
143
+ if (!isRecord(value))
144
+ throw new Error("action requires a capability string or mapping");
145
+ const capability = text(value.capability, "action capability");
146
+ if ("enabled" in value)
147
+ throw new Error("inline actions do not support enabled");
148
+ const hook = text(value.hook, "action hook", false) || undefined;
149
+ return {
150
+ capability,
151
+ session: normalizeSession(value.session),
152
+ config: value.config ?? {},
153
+ hook
154
+ };
155
+ }
156
+ function list(value, field) {
157
+ if (value === undefined || value === null)
158
+ return [];
159
+ if (!Array.isArray(value)) {
160
+ throw new Error(`${field} must be a list`);
161
+ }
162
+ return value.map((item, index) => {
163
+ if (!isRecord(item))
164
+ throw new Error(`${field}[${index + 1}] must be a mapping`);
165
+ return item;
166
+ });
167
+ }
168
+ function text(value, field, required = true) {
169
+ const result = value === undefined || value === null ? "" : String(value).trim();
170
+ if (required && !result)
171
+ throw new Error(`${field} is required`);
172
+ return result;
173
+ }
174
+ function hasId(value) {
175
+ return value !== undefined && value !== null && String(value).trim().length > 0;
176
+ }
177
+ function makeId(capability, value, index) {
178
+ if (hasId(value))
179
+ return String(value).trim();
180
+ return `${capability.replaceAll(/[^a-zA-Z0-9._-]+/g, "-")}-${index + 1}`;
181
+ }
182
+ function isNodeError(error) {
183
+ return error instanceof Error && "code" in error;
184
+ }
185
+ export function sectionFor(kind) {
186
+ return `${kind}s`;
187
+ }
188
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ export declare const FLOW_SECTIONS: readonly ["triggers", "commands", "schedules", "services"];
2
+ export type FlowKind = "trigger" | "command" | "schedule" | "service";
3
+ export interface ActionSpec {
4
+ capability: string;
5
+ session?: string;
6
+ config: unknown;
7
+ hook?: string;
8
+ }
9
+ export interface TriggerDefinition {
10
+ kind: "trigger";
11
+ id: string;
12
+ capability: string;
13
+ enabled: boolean;
14
+ session?: string;
15
+ config: unknown;
16
+ actions: readonly ActionSpec[];
17
+ maxRuns?: number;
18
+ logFile: boolean;
19
+ sourceIndex: number;
20
+ explicitId: boolean;
21
+ }
22
+ export interface CommandDefinition {
23
+ kind: "command";
24
+ id: string;
25
+ title: string;
26
+ symbol?: string;
27
+ action: ActionSpec;
28
+ sourceIndex: number;
29
+ explicitId: boolean;
30
+ }
31
+ export interface ScheduleDefinition {
32
+ kind: "schedule";
33
+ id: string;
34
+ enabled: boolean;
35
+ session?: string;
36
+ action: ActionSpec;
37
+ cron?: string;
38
+ intervalSeconds?: number;
39
+ logFile: boolean;
40
+ sourceIndex: number;
41
+ explicitId: boolean;
42
+ }
43
+ export interface ServiceDefinition {
44
+ kind: "service";
45
+ id: string;
46
+ capability: string;
47
+ enabled: boolean;
48
+ session?: string;
49
+ config: unknown;
50
+ autoStart: boolean;
51
+ logFile: boolean;
52
+ sourceIndex: number;
53
+ explicitId: boolean;
54
+ }
55
+ export type FlowDefinition = TriggerDefinition | CommandDefinition | ScheduleDefinition | ServiceDefinition;
56
+ export type FlowSection = (typeof FLOW_SECTIONS)[number];
57
+ export declare class FlowCatalog {
58
+ readonly definitionsByKind: Readonly<Record<FlowKind, readonly FlowDefinition[]>>;
59
+ readonly path?: string | undefined;
60
+ constructor(definitionsByKind: Readonly<Record<FlowKind, readonly FlowDefinition[]>>, path?: string | undefined);
61
+ definitions(kind?: FlowKind | FlowSection): FlowDefinition[];
62
+ enabled(kind?: FlowKind | FlowSection): FlowDefinition[];
63
+ capabilityRefs(): Set<string>;
64
+ find(identifier: string, kind?: FlowKind): FlowDefinition | undefined;
65
+ }
66
+ export declare function normalizeKind(kind: string): FlowKind;
67
+ export declare function normalizeBool(value: unknown, fallback: boolean): boolean;
68
+ export declare function normalizeSession(value: unknown): string | undefined;
69
+ export declare function normalizePositiveInt(value: unknown, field: string, fallback?: number): number | undefined;
70
+ export declare function normalizeMaxRuns(value: unknown): number | undefined;
71
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;