@fdcn/sourcefed 0.2.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.
- package/LICENSE +21 -0
- package/README.md +51 -0
- package/dist/chunk-B7T6IZYS.js +5155 -0
- package/dist/chunk-MLKGABMK.js +9 -0
- package/dist/chunk-NGJ6F5ST.js +766 -0
- package/dist/cli.js +30491 -0
- package/dist/core-storage.js +13 -0
- package/dist/core.js +643 -0
- package/dist/daemon.js +5190 -0
- package/dist/data/core/SKILL.md +71 -0
- package/dist/data/core/references/commands.md +75 -0
- package/dist/data/sourcefed/SKILL.md +31 -0
- package/dist/guidance.md +71 -0
- package/dist/mcp.js +4800 -0
- package/dist/opencode.js +12646 -0
- package/dist/pi.js +249 -0
- package/dist/tui-compiled.mjs +4096 -0
- package/dist.dts/adapters/opencode/bridge.d.ts +20 -0
- package/dist.dts/adapters/opencode/index.d.ts +3 -0
- package/dist.dts/adapters/opencode/tool-result.d.ts +1 -0
- package/dist.dts/adapters/opencode/tools/monitor_create.d.ts +3 -0
- package/dist.dts/adapters/opencode/tools/monitor_list.d.ts +3 -0
- package/dist.dts/adapters/opencode/tools/monitor_start.d.ts +3 -0
- package/dist.dts/adapters/opencode/tools/monitor_status.d.ts +3 -0
- package/dist.dts/adapters/opencode/tools/monitor_stop.d.ts +3 -0
- package/dist.dts/adapters/opencode/tui/plugin.d.ts +3 -0
- package/dist.dts/adapters/opencode/tui/sidebar.d.ts +13 -0
- package/dist.dts/adapters/opencode/tui.d.ts +7 -0
- package/dist.dts/adapters/pi/src/dialog.d.ts +12 -0
- package/dist.dts/adapters/pi/src/index.d.ts +2 -0
- package/dist.dts/index.d.ts +1 -0
- package/dist.dts/packages/cli/src/index.d.ts +2 -0
- package/dist.dts/packages/cli/src/skills/command.d.ts +1 -0
- package/dist.dts/packages/cli/src/skills/discovery.d.ts +7 -0
- package/dist.dts/packages/cli/src/skills/frontmatter.d.ts +5 -0
- package/dist.dts/packages/cli/src/skills/index.d.ts +1 -0
- package/dist.dts/packages/core/src/events.d.ts +24 -0
- package/dist.dts/packages/core/src/events.test.d.ts +1 -0
- package/dist.dts/packages/core/src/index.d.ts +9 -0
- package/dist.dts/packages/core/src/monitors/index.d.ts +6 -0
- package/dist.dts/packages/core/src/monitors/monitor.d.ts +26 -0
- package/dist.dts/packages/core/src/monitors/poll/index.d.ts +1 -0
- package/dist.dts/packages/core/src/monitors/poll/monitor.d.ts +12 -0
- package/dist.dts/packages/core/src/monitors/poll/types/index.d.ts +2 -0
- package/dist.dts/packages/core/src/monitors/poll/types/poll-monitor-options.d.ts +6 -0
- package/dist.dts/packages/core/src/monitors/poll/types/poll-runner.d.ts +3 -0
- package/dist.dts/packages/core/src/monitors/poll/types/routed-event-cursor.d.ts +2 -0
- package/dist.dts/packages/core/src/monitors/poll/utils/event-delivery-id.d.ts +2 -0
- package/dist.dts/packages/core/src/monitors/poll/utils/tick.d.ts +2 -0
- package/dist.dts/packages/core/src/monitors/schema.d.ts +37 -0
- package/dist.dts/packages/core/src/monitors/service.d.ts +35 -0
- package/dist.dts/packages/core/src/monitors/service.test.d.ts +1 -0
- package/dist.dts/packages/core/src/monitors/transport.test.d.ts +1 -0
- package/dist.dts/packages/core/src/monitors/types/index.d.ts +2 -0
- package/dist.dts/packages/core/src/monitors/types/monitor-record.d.ts +3 -0
- package/dist.dts/packages/core/src/monitors/types/monitor-registry.d.ts +3 -0
- package/dist.dts/packages/core/src/monitors/utils/monitor-identity.d.ts +5 -0
- package/dist.dts/packages/core/src/monitors/utils/monitor-identity.test.d.ts +1 -0
- package/dist.dts/packages/core/src/monitors/webhook/index.d.ts +1 -0
- package/dist.dts/packages/core/src/monitors/webhook/monitor.d.ts +24 -0
- package/dist.dts/packages/core/src/monitors/webhook/types/index.d.ts +3 -0
- package/dist.dts/packages/core/src/monitors/webhook/types/pending-webhook-event.d.ts +19 -0
- package/dist.dts/packages/core/src/monitors/webhook/types/webhook-monitor-options.d.ts +13 -0
- package/dist.dts/packages/core/src/monitors/webhook/utils/constants.d.ts +2 -0
- package/dist.dts/packages/core/src/monitors/webhook/utils/deliver-webhook.d.ts +3 -0
- package/dist.dts/packages/core/src/monitors/webhook/utils/handle-webhook.d.ts +2 -0
- package/dist.dts/packages/core/src/monitors/webhook/utils/handle-webhook.test.d.ts +1 -0
- package/dist.dts/packages/core/src/monitors/webhook/utils/heartbeat-webhooks.d.ts +3 -0
- package/dist.dts/packages/core/src/runtime.d.ts +23 -0
- package/dist.dts/packages/core/src/runtime.test.d.ts +1 -0
- package/dist.dts/packages/core/src/sources/index.d.ts +1 -0
- package/dist.dts/packages/core/src/sources/schema.d.ts +4 -0
- package/dist.dts/packages/core/src/sources/types/index.d.ts +3 -0
- package/dist.dts/packages/core/src/sources/types/monitor-source.d.ts +3 -0
- package/dist.dts/packages/core/src/sources/types/source-input.d.ts +4 -0
- package/dist.dts/packages/core/src/sources/types/source-registry.d.ts +2 -0
- package/dist.dts/packages/core/src/storage/in-memory-monitor-store.d.ts +8 -0
- package/dist.dts/packages/core/src/storage/index.d.ts +2 -0
- package/dist.dts/packages/core/src/storage/json.d.ts +30 -0
- package/dist.dts/packages/core/src/storage/json.test.d.ts +1 -0
- package/dist.dts/packages/core/src/types/delivery.d.ts +1 -0
- package/dist.dts/packages/core/src/types/event-sink.d.ts +12 -0
- package/dist.dts/packages/core/src/types/index.d.ts +11 -0
- package/dist.dts/packages/core/src/types/monitor-context.d.ts +10 -0
- package/dist.dts/packages/core/src/types/monitor-create-input.d.ts +8 -0
- package/dist.dts/packages/core/src/types/monitor-event-queue.d.ts +18 -0
- package/dist.dts/packages/core/src/types/monitor-event.d.ts +10 -0
- package/dist.dts/packages/core/src/types/monitor-options.d.ts +7 -0
- package/dist.dts/packages/core/src/types/monitor-store.d.ts +6 -0
- package/dist.dts/packages/core/src/types/monitor-target.d.ts +4 -0
- package/dist.dts/packages/core/src/types/source-event.d.ts +9 -0
- package/dist.dts/packages/core/src/types/source-poll-result.d.ts +6 -0
- package/dist.dts/packages/core/src/utils/event-to-text.d.ts +2 -0
- package/dist.dts/packages/core/src/utils/to-monitor-event.d.ts +3 -0
- package/dist.dts/packages/daemon/src/client.d.ts +2 -0
- package/dist.dts/packages/daemon/src/client.test.d.ts +1 -0
- package/dist.dts/packages/daemon/src/daemon.d.ts +36 -0
- package/dist.dts/packages/daemon/src/daemon.test.d.ts +1 -0
- package/dist.dts/packages/daemon/src/dispatch.d.ts +2 -0
- package/dist.dts/packages/daemon/src/http.d.ts +5 -0
- package/dist.dts/packages/daemon/src/index.d.ts +8 -0
- package/dist.dts/packages/daemon/src/registry.d.ts +14 -0
- package/dist.dts/packages/daemon/src/types/client.d.ts +21 -0
- package/dist.dts/packages/daemon/src/types/daemon.d.ts +58 -0
- package/dist.dts/packages/daemon/src/types/index.d.ts +3 -0
- package/dist.dts/packages/daemon/src/types/protocol.d.ts +21 -0
- package/dist.dts/packages/daemon/src/utils/env.d.ts +1 -0
- package/dist.dts/packages/daemon/src/utils/http-server.d.ts +10 -0
- package/dist.dts/packages/daemon/src/utils/index.d.ts +6 -0
- package/dist.dts/packages/daemon/src/utils/request-router.d.ts +11 -0
- package/dist.dts/packages/daemon/src/utils/sink.d.ts +13 -0
- package/dist.dts/packages/daemon/src/utils/spawn.d.ts +19 -0
- package/dist.dts/packages/daemon/src/utils/target.d.ts +4 -0
- package/dist.dts/packages/mcp/src/index.d.ts +2 -0
- package/dist.dts/packages/mcp/src/server.d.ts +14 -0
- package/dist.dts/packages/mcp/src/server.test.d.ts +1 -0
- package/dist.dts/packages/mcp/src/uris.d.ts +3 -0
- package/dist.dts/packages/sourcefed/src/server.d.ts +7 -0
- package/dist.dts/providers/github/src/api/client.d.ts +3 -0
- package/dist.dts/providers/github/src/api/comments.d.ts +1 -0
- package/dist.dts/providers/github/src/api/github-api.test.d.ts +1 -0
- package/dist.dts/providers/github/src/api/index.d.ts +4 -0
- package/dist.dts/providers/github/src/api/logs.d.ts +5 -0
- package/dist.dts/providers/github/src/api/pr.d.ts +8 -0
- package/dist.dts/providers/github/src/github.test.d.ts +1 -0
- package/dist.dts/providers/github/src/index.d.ts +2 -0
- package/dist.dts/providers/github/src/monitor.d.ts +15 -0
- package/dist.dts/providers/github/src/poll/index.d.ts +2 -0
- package/dist.dts/providers/github/src/poll/monitor.d.ts +3 -0
- package/dist.dts/providers/github/src/poll/utils/append-comments.d.ts +2 -0
- package/dist.dts/providers/github/src/poll/utils/append-github-ci-event.d.ts +2 -0
- package/dist.dts/providers/github/src/poll/utils/append-github-conflict-event.d.ts +2 -0
- package/dist.dts/providers/github/src/poll/utils/append-github-reviews.d.ts +2 -0
- package/dist.dts/providers/github/src/poll/utils/append-github-state-event.d.ts +2 -0
- package/dist.dts/providers/github/src/poll/utils/ci-failure-detail.d.ts +1 -0
- package/dist.dts/providers/github/src/poll/utils/clean-ci-log.d.ts +1 -0
- package/dist.dts/providers/github/src/poll/utils/confirm-still-failing.d.ts +1 -0
- package/dist.dts/providers/github/src/poll/utils/empty-cursor.d.ts +2 -0
- package/dist.dts/providers/github/src/poll/utils/failure-run-ids.d.ts +1 -0
- package/dist.dts/providers/github/src/poll/utils/failure-run-log.d.ts +1 -0
- package/dist.dts/providers/github/src/poll/utils/format-failed-check.d.ts +1 -0
- package/dist.dts/providers/github/src/poll/utils/index.d.ts +1 -0
- package/dist.dts/providers/github/src/poll/utils/poll-github.d.ts +6 -0
- package/dist.dts/providers/github/src/poll/utils/poll-helpers.test.d.ts +1 -0
- package/dist.dts/providers/github/src/schema.d.ts +17 -0
- package/dist.dts/providers/github/src/types/cursor.d.ts +11 -0
- package/dist.dts/providers/github/src/types/event.d.ts +11 -0
- package/dist.dts/providers/github/src/types/index.d.ts +3 -0
- package/dist.dts/providers/github/src/types/source-record.d.ts +5 -0
- package/dist.dts/providers/github/src/webhook/index.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/monitor.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/types/context.d.ts +7 -0
- package/dist.dts/providers/github/src/webhook/types/event-handler.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/types/event-shape.d.ts +7 -0
- package/dist.dts/providers/github/src/webhook/types/index.d.ts +1 -0
- package/dist.dts/providers/github/src/webhook/utils/fallback-github-event.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/utils/github-event-handlers.d.ts +2 -0
- package/dist.dts/providers/github/src/webhook/utils/index.d.ts +2 -0
- package/dist.dts/providers/github/src/webhook/utils/parse-check-run.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/utils/parse-check-suite.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/utils/parse-github-comment.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/utils/parse-github-webhook.d.ts +2 -0
- package/dist.dts/providers/github/src/webhook/utils/parse-pull-request-review.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/utils/parse-pull-request.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/utils/pull-request-number.d.ts +1 -0
- package/dist.dts/providers/github/src/webhook/utils/update-github-cursor.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/utils/verify-github-webhook.d.ts +1 -0
- package/dist.dts/providers/github/src/webhook/utils/verify-hmac.d.ts +1 -0
- package/dist.dts/providers/jira/src/index.d.ts +2 -0
- package/dist.dts/providers/jira/src/monitor.d.ts +14 -0
- package/dist.dts/providers/jira/src/poll/index.d.ts +2 -0
- package/dist.dts/providers/jira/src/poll/monitor.d.ts +3 -0
- package/dist.dts/providers/jira/src/poll/utils/adf-text.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/append-jira-changelog.d.ts +2 -0
- package/dist.dts/providers/jira/src/poll/utils/append-jira-comments.d.ts +2 -0
- package/dist.dts/providers/jira/src/poll/utils/append-jira-description.d.ts +2 -0
- package/dist.dts/providers/jira/src/poll/utils/empty-cursor.d.ts +2 -0
- package/dist.dts/providers/jira/src/poll/utils/format-jira-changelog-item.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/index.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/is-terminal-status.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/jira-auth.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/jira-change-value.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/jira-changelog-event.d.ts +2 -0
- package/dist.dts/providers/jira/src/poll/utils/jira-fetch.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/meaningful-changelog-items.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/poll-helpers.test.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/poll-jira.d.ts +6 -0
- package/dist.dts/providers/jira/src/schema.d.ts +10 -0
- package/dist.dts/providers/jira/src/types/cursor.d.ts +5 -0
- package/dist.dts/providers/jira/src/types/event.d.ts +11 -0
- package/dist.dts/providers/jira/src/types/index.d.ts +3 -0
- package/dist.dts/providers/jira/src/types/source-record.d.ts +4 -0
- package/dist.dts/providers/slack/src/index.d.ts +2 -0
- package/dist.dts/providers/slack/src/monitor.d.ts +15 -0
- package/dist.dts/providers/slack/src/poll/index.d.ts +2 -0
- package/dist.dts/providers/slack/src/poll/monitor.d.ts +3 -0
- package/dist.dts/providers/slack/src/poll/utils/index.d.ts +2 -0
- package/dist.dts/providers/slack/src/poll/utils/parse-slack-read-result.d.ts +5 -0
- package/dist.dts/providers/slack/src/poll/utils/poll-slack.d.ts +6 -0
- package/dist.dts/providers/slack/src/poll/utils/slack-api.d.ts +4 -0
- package/dist.dts/providers/slack/src/schema.d.ts +11 -0
- package/dist.dts/providers/slack/src/slack.test.d.ts +1 -0
- package/dist.dts/providers/slack/src/types/cursor.d.ts +5 -0
- package/dist.dts/providers/slack/src/types/event.d.ts +8 -0
- package/dist.dts/providers/slack/src/types/index.d.ts +4 -0
- package/dist.dts/providers/slack/src/types/message.d.ts +6 -0
- package/dist.dts/providers/slack/src/types/read-result.d.ts +10 -0
- package/dist.dts/providers/slack/src/types/source-record.d.ts +5 -0
- package/dist.dts/providers/slack/src/utils/index.d.ts +2 -0
- package/dist.dts/providers/slack/src/utils/message-at.d.ts +1 -0
- package/dist.dts/providers/slack/src/utils/message-timestamp.d.ts +1 -0
- package/dist.dts/providers/slack/src/webhook/index.d.ts +2 -0
- package/dist.dts/providers/slack/src/webhook/monitor.d.ts +3 -0
- package/dist.dts/providers/slack/src/webhook/utils/index.d.ts +3 -0
- package/dist.dts/providers/slack/src/webhook/utils/parse-slack-webhook.d.ts +2 -0
- package/dist.dts/providers/slack/src/webhook/utils/slack-signature.d.ts +1 -0
- package/dist.dts/providers/slack/src/webhook/utils/update-slack-cursor.d.ts +3 -0
- package/dist.dts/providers/slack/src/webhook/utils/valid-slack-signature.d.ts +1 -0
- package/dist.dts/tui.d.ts +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,766 @@
|
|
|
1
|
+
// packages/core/src/storage/in-memory-monitor-store.ts
|
|
2
|
+
var InMemoryMonitorStore = class {
|
|
3
|
+
registry;
|
|
4
|
+
constructor(initial = { monitors: [] }) {
|
|
5
|
+
this.registry = structuredClone(initial);
|
|
6
|
+
}
|
|
7
|
+
async load() {
|
|
8
|
+
return structuredClone(this.registry);
|
|
9
|
+
}
|
|
10
|
+
async save(registry) {
|
|
11
|
+
this.registry = structuredClone(registry);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// packages/core/src/storage/json.ts
|
|
16
|
+
import { link, mkdir, open, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
17
|
+
import os from "node:os";
|
|
18
|
+
import path from "node:path";
|
|
19
|
+
|
|
20
|
+
// node_modules/valibot/dist/index.mjs
|
|
21
|
+
var store$4;
|
|
22
|
+
var DEFAULT_CONFIG = {
|
|
23
|
+
lang: void 0,
|
|
24
|
+
message: void 0,
|
|
25
|
+
abortEarly: void 0,
|
|
26
|
+
abortPipeEarly: void 0
|
|
27
|
+
};
|
|
28
|
+
// @__NO_SIDE_EFFECTS__
|
|
29
|
+
function getGlobalConfig(config$1) {
|
|
30
|
+
if (!config$1 && !store$4) return DEFAULT_CONFIG;
|
|
31
|
+
return {
|
|
32
|
+
lang: config$1?.lang ?? store$4?.lang,
|
|
33
|
+
message: config$1?.message,
|
|
34
|
+
abortEarly: config$1?.abortEarly ?? store$4?.abortEarly,
|
|
35
|
+
abortPipeEarly: config$1?.abortPipeEarly ?? store$4?.abortPipeEarly
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
var store$3;
|
|
39
|
+
// @__NO_SIDE_EFFECTS__
|
|
40
|
+
function getGlobalMessage(lang) {
|
|
41
|
+
return store$3?.get(lang);
|
|
42
|
+
}
|
|
43
|
+
var store$2;
|
|
44
|
+
// @__NO_SIDE_EFFECTS__
|
|
45
|
+
function getSchemaMessage(lang) {
|
|
46
|
+
return store$2?.get(lang);
|
|
47
|
+
}
|
|
48
|
+
var store$1;
|
|
49
|
+
// @__NO_SIDE_EFFECTS__
|
|
50
|
+
function getSpecificMessage(reference, lang) {
|
|
51
|
+
return store$1?.get(reference)?.get(lang);
|
|
52
|
+
}
|
|
53
|
+
// @__NO_SIDE_EFFECTS__
|
|
54
|
+
function _stringify(input) {
|
|
55
|
+
const type = typeof input;
|
|
56
|
+
if (type === "string") return `"${input}"`;
|
|
57
|
+
if (type === "number" || type === "bigint" || type === "boolean") return `${input}`;
|
|
58
|
+
if (type === "object" || type === "function") return (input && Object.getPrototypeOf(input)?.constructor?.name) ?? "null";
|
|
59
|
+
return type;
|
|
60
|
+
}
|
|
61
|
+
function _addIssue(context, label, dataset, config$1, other) {
|
|
62
|
+
const input = other && "input" in other ? other.input : dataset.value;
|
|
63
|
+
const expected = other?.expected ?? context.expects ?? null;
|
|
64
|
+
const received = other?.received ?? /* @__PURE__ */ _stringify(input);
|
|
65
|
+
const issue = {
|
|
66
|
+
kind: context.kind,
|
|
67
|
+
type: context.type,
|
|
68
|
+
input,
|
|
69
|
+
expected,
|
|
70
|
+
received,
|
|
71
|
+
message: `Invalid ${label}: ${expected ? `Expected ${expected} but r` : "R"}eceived ${received}`,
|
|
72
|
+
requirement: context.requirement,
|
|
73
|
+
path: other?.path,
|
|
74
|
+
issues: other?.issues,
|
|
75
|
+
lang: config$1.lang,
|
|
76
|
+
abortEarly: config$1.abortEarly,
|
|
77
|
+
abortPipeEarly: config$1.abortPipeEarly
|
|
78
|
+
};
|
|
79
|
+
const isSchema = context.kind === "schema";
|
|
80
|
+
const message$1 = other?.message ?? context.message ?? /* @__PURE__ */ getSpecificMessage(context.reference, issue.lang) ?? (isSchema ? /* @__PURE__ */ getSchemaMessage(issue.lang) : null) ?? config$1.message ?? /* @__PURE__ */ getGlobalMessage(issue.lang);
|
|
81
|
+
if (message$1 !== void 0) issue.message = typeof message$1 === "function" ? message$1(issue) : message$1;
|
|
82
|
+
if (isSchema) dataset.typed = false;
|
|
83
|
+
if (dataset.issues) dataset.issues.push(issue);
|
|
84
|
+
else dataset.issues = [issue];
|
|
85
|
+
}
|
|
86
|
+
var _standardCache = /* @__PURE__ */ new WeakMap();
|
|
87
|
+
// @__NO_SIDE_EFFECTS__
|
|
88
|
+
function _getStandardProps(context) {
|
|
89
|
+
let cached = _standardCache.get(context);
|
|
90
|
+
if (!cached) {
|
|
91
|
+
cached = {
|
|
92
|
+
version: 1,
|
|
93
|
+
vendor: "valibot",
|
|
94
|
+
validate(value$1) {
|
|
95
|
+
return context["~run"]({ value: value$1 }, /* @__PURE__ */ getGlobalConfig());
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
_standardCache.set(context, cached);
|
|
99
|
+
}
|
|
100
|
+
return cached;
|
|
101
|
+
}
|
|
102
|
+
// @__NO_SIDE_EFFECTS__
|
|
103
|
+
function _isValidObjectKey(object$1, key) {
|
|
104
|
+
return Object.prototype.hasOwnProperty.call(object$1, key) && key !== "__proto__" && key !== "prototype" && key !== "constructor";
|
|
105
|
+
}
|
|
106
|
+
// @__NO_SIDE_EFFECTS__
|
|
107
|
+
function _joinExpects(values$1, separator) {
|
|
108
|
+
const list = [...new Set(values$1)];
|
|
109
|
+
if (list.length > 1) return `(${list.join(` ${separator} `)})`;
|
|
110
|
+
return list[0] ?? "never";
|
|
111
|
+
}
|
|
112
|
+
var EMOJI_REGEX = new RegExp("^(?:[\\u{1F1E6}-\\u{1F1FF}]{2}|\\u{1F3F4}[\\u{E0061}-\\u{E007A}]{2}[\\u{E0030}-\\u{E0039}\\u{E0061}-\\u{E007A}]{1,3}\\u{E007F}|(?:\\p{Emoji}\\uFE0F\\u20E3?|\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|(?![\\p{Emoji_Modifier_Base}\\u{1F1E6}-\\u{1F1FF}])\\p{Emoji_Presentation})(?:\\u200D(?:\\p{Emoji}\\uFE0F\\u20E3?|\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|(?![\\p{Emoji_Modifier_Base}\\u{1F1E6}-\\u{1F1FF}])\\p{Emoji_Presentation}))*)+$", "u");
|
|
113
|
+
// @__NO_SIDE_EFFECTS__
|
|
114
|
+
function getFallback(schema, dataset, config$1) {
|
|
115
|
+
return typeof schema.fallback === "function" ? schema.fallback(dataset, config$1) : schema.fallback;
|
|
116
|
+
}
|
|
117
|
+
// @__NO_SIDE_EFFECTS__
|
|
118
|
+
function getDefault(schema, dataset, config$1) {
|
|
119
|
+
return typeof schema.default === "function" ? schema.default(dataset, config$1) : schema.default;
|
|
120
|
+
}
|
|
121
|
+
// @__NO_SIDE_EFFECTS__
|
|
122
|
+
function array(item, message$1) {
|
|
123
|
+
return {
|
|
124
|
+
kind: "schema",
|
|
125
|
+
type: "array",
|
|
126
|
+
reference: array,
|
|
127
|
+
expects: "Array",
|
|
128
|
+
async: false,
|
|
129
|
+
item,
|
|
130
|
+
message: message$1,
|
|
131
|
+
get "~standard"() {
|
|
132
|
+
return /* @__PURE__ */ _getStandardProps(this);
|
|
133
|
+
},
|
|
134
|
+
"~run"(dataset, config$1) {
|
|
135
|
+
const input = dataset.value;
|
|
136
|
+
if (Array.isArray(input)) {
|
|
137
|
+
dataset.typed = true;
|
|
138
|
+
dataset.value = [];
|
|
139
|
+
for (let key = 0; key < input.length; key++) {
|
|
140
|
+
const value$1 = input[key];
|
|
141
|
+
const itemDataset = this.item["~run"]({ value: value$1 }, config$1);
|
|
142
|
+
if (itemDataset.issues) {
|
|
143
|
+
const pathItem = {
|
|
144
|
+
type: "array",
|
|
145
|
+
origin: "value",
|
|
146
|
+
input,
|
|
147
|
+
key,
|
|
148
|
+
value: value$1
|
|
149
|
+
};
|
|
150
|
+
for (const issue of itemDataset.issues) {
|
|
151
|
+
if (issue.path) issue.path.unshift(pathItem);
|
|
152
|
+
else issue.path = [pathItem];
|
|
153
|
+
dataset.issues?.push(issue);
|
|
154
|
+
}
|
|
155
|
+
if (!dataset.issues) dataset.issues = itemDataset.issues;
|
|
156
|
+
if (config$1.abortEarly) {
|
|
157
|
+
dataset.typed = false;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (!itemDataset.typed) dataset.typed = false;
|
|
162
|
+
dataset.value.push(itemDataset.value);
|
|
163
|
+
}
|
|
164
|
+
} else _addIssue(this, "type", dataset, config$1);
|
|
165
|
+
return dataset;
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
// @__NO_SIDE_EFFECTS__
|
|
170
|
+
function boolean(message$1) {
|
|
171
|
+
return {
|
|
172
|
+
kind: "schema",
|
|
173
|
+
type: "boolean",
|
|
174
|
+
reference: boolean,
|
|
175
|
+
expects: "boolean",
|
|
176
|
+
async: false,
|
|
177
|
+
message: message$1,
|
|
178
|
+
get "~standard"() {
|
|
179
|
+
return /* @__PURE__ */ _getStandardProps(this);
|
|
180
|
+
},
|
|
181
|
+
"~run"(dataset, config$1) {
|
|
182
|
+
if (typeof dataset.value === "boolean") dataset.typed = true;
|
|
183
|
+
else _addIssue(this, "type", dataset, config$1);
|
|
184
|
+
return dataset;
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
// @__NO_SIDE_EFFECTS__
|
|
189
|
+
function _merge(value1, value2) {
|
|
190
|
+
if (typeof value1 === typeof value2) {
|
|
191
|
+
if (value1 === value2 || value1 instanceof Date && value2 instanceof Date && +value1 === +value2) return { value: value1 };
|
|
192
|
+
if (value1 && value2 && value1.constructor === Object && value2.constructor === Object) {
|
|
193
|
+
const nextValue = { ...value1 };
|
|
194
|
+
for (const key in value2) if (Object.prototype.hasOwnProperty.call(value1, key)) {
|
|
195
|
+
const dataset = /* @__PURE__ */ _merge(value1[key], value2[key]);
|
|
196
|
+
if (dataset.issue) return dataset;
|
|
197
|
+
nextValue[key] = dataset.value;
|
|
198
|
+
} else nextValue[key] = value2[key];
|
|
199
|
+
return { value: nextValue };
|
|
200
|
+
}
|
|
201
|
+
if (Array.isArray(value1) && Array.isArray(value2)) {
|
|
202
|
+
if (value1.length === value2.length) {
|
|
203
|
+
const nextValue = [...value1];
|
|
204
|
+
for (let index = 0; index < value1.length; index++) {
|
|
205
|
+
const dataset = /* @__PURE__ */ _merge(value1[index], value2[index]);
|
|
206
|
+
if (dataset.issue) return dataset;
|
|
207
|
+
nextValue[index] = dataset.value;
|
|
208
|
+
}
|
|
209
|
+
return { value: nextValue };
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return { issue: true };
|
|
214
|
+
}
|
|
215
|
+
// @__NO_SIDE_EFFECTS__
|
|
216
|
+
function intersect(options, message$1) {
|
|
217
|
+
return {
|
|
218
|
+
kind: "schema",
|
|
219
|
+
type: "intersect",
|
|
220
|
+
reference: intersect,
|
|
221
|
+
expects: /* @__PURE__ */ _joinExpects(options.map((option) => option.expects), "&"),
|
|
222
|
+
async: false,
|
|
223
|
+
options,
|
|
224
|
+
message: message$1,
|
|
225
|
+
get "~standard"() {
|
|
226
|
+
return /* @__PURE__ */ _getStandardProps(this);
|
|
227
|
+
},
|
|
228
|
+
"~run"(dataset, config$1) {
|
|
229
|
+
if (this.options.length) {
|
|
230
|
+
const input = dataset.value;
|
|
231
|
+
let outputs;
|
|
232
|
+
dataset.typed = true;
|
|
233
|
+
for (const schema of this.options) {
|
|
234
|
+
const optionDataset = schema["~run"]({ value: input }, config$1);
|
|
235
|
+
if (optionDataset.issues) {
|
|
236
|
+
if (dataset.issues) for (const issue of optionDataset.issues) dataset.issues.push(issue);
|
|
237
|
+
else dataset.issues = optionDataset.issues;
|
|
238
|
+
if (config$1.abortEarly) {
|
|
239
|
+
dataset.typed = false;
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (!optionDataset.typed) dataset.typed = false;
|
|
244
|
+
if (dataset.typed) if (outputs) outputs.push(optionDataset.value);
|
|
245
|
+
else outputs = [optionDataset.value];
|
|
246
|
+
}
|
|
247
|
+
if (dataset.typed) {
|
|
248
|
+
dataset.value = outputs[0];
|
|
249
|
+
for (let index = 1; index < outputs.length; index++) {
|
|
250
|
+
const mergeDataset = /* @__PURE__ */ _merge(dataset.value, outputs[index]);
|
|
251
|
+
if (mergeDataset.issue) {
|
|
252
|
+
_addIssue(this, "type", dataset, config$1, { received: "unknown" });
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
dataset.value = mergeDataset.value;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
} else _addIssue(this, "type", dataset, config$1);
|
|
259
|
+
return dataset;
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
// @__NO_SIDE_EFFECTS__
|
|
264
|
+
function number(message$1) {
|
|
265
|
+
return {
|
|
266
|
+
kind: "schema",
|
|
267
|
+
type: "number",
|
|
268
|
+
reference: number,
|
|
269
|
+
expects: "number",
|
|
270
|
+
async: false,
|
|
271
|
+
message: message$1,
|
|
272
|
+
get "~standard"() {
|
|
273
|
+
return /* @__PURE__ */ _getStandardProps(this);
|
|
274
|
+
},
|
|
275
|
+
"~run"(dataset, config$1) {
|
|
276
|
+
if (typeof dataset.value === "number" && !isNaN(dataset.value)) dataset.typed = true;
|
|
277
|
+
else _addIssue(this, "type", dataset, config$1);
|
|
278
|
+
return dataset;
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
// @__NO_SIDE_EFFECTS__
|
|
283
|
+
function object(entries$1, message$1) {
|
|
284
|
+
return {
|
|
285
|
+
kind: "schema",
|
|
286
|
+
type: "object",
|
|
287
|
+
reference: object,
|
|
288
|
+
expects: "Object",
|
|
289
|
+
async: false,
|
|
290
|
+
entries: entries$1,
|
|
291
|
+
message: message$1,
|
|
292
|
+
get "~standard"() {
|
|
293
|
+
return /* @__PURE__ */ _getStandardProps(this);
|
|
294
|
+
},
|
|
295
|
+
"~run"(dataset, config$1) {
|
|
296
|
+
const input = dataset.value;
|
|
297
|
+
if (input && typeof input === "object") {
|
|
298
|
+
dataset.typed = true;
|
|
299
|
+
dataset.value = {};
|
|
300
|
+
for (const key in this.entries) {
|
|
301
|
+
const valueSchema = this.entries[key];
|
|
302
|
+
if (key in input || (valueSchema.type === "exact_optional" || valueSchema.type === "optional" || valueSchema.type === "nullish") && valueSchema.default !== void 0) {
|
|
303
|
+
const value$1 = key in input ? input[key] : /* @__PURE__ */ getDefault(valueSchema);
|
|
304
|
+
const valueDataset = valueSchema["~run"]({ value: value$1 }, config$1);
|
|
305
|
+
if (valueDataset.issues) {
|
|
306
|
+
const pathItem = {
|
|
307
|
+
type: "object",
|
|
308
|
+
origin: "value",
|
|
309
|
+
input,
|
|
310
|
+
key,
|
|
311
|
+
value: value$1
|
|
312
|
+
};
|
|
313
|
+
for (const issue of valueDataset.issues) {
|
|
314
|
+
if (issue.path) issue.path.unshift(pathItem);
|
|
315
|
+
else issue.path = [pathItem];
|
|
316
|
+
dataset.issues?.push(issue);
|
|
317
|
+
}
|
|
318
|
+
if (!dataset.issues) dataset.issues = valueDataset.issues;
|
|
319
|
+
if (config$1.abortEarly) {
|
|
320
|
+
dataset.typed = false;
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
if (!valueDataset.typed) dataset.typed = false;
|
|
325
|
+
dataset.value[key] = valueDataset.value;
|
|
326
|
+
} else if (valueSchema.fallback !== void 0) dataset.value[key] = /* @__PURE__ */ getFallback(valueSchema);
|
|
327
|
+
else if (valueSchema.type !== "exact_optional" && valueSchema.type !== "optional" && valueSchema.type !== "nullish") {
|
|
328
|
+
_addIssue(this, "key", dataset, config$1, {
|
|
329
|
+
input: void 0,
|
|
330
|
+
expected: `"${key}"`,
|
|
331
|
+
path: [{
|
|
332
|
+
type: "object",
|
|
333
|
+
origin: "key",
|
|
334
|
+
input,
|
|
335
|
+
key,
|
|
336
|
+
value: input[key]
|
|
337
|
+
}]
|
|
338
|
+
});
|
|
339
|
+
if (config$1.abortEarly) break;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
} else _addIssue(this, "type", dataset, config$1);
|
|
343
|
+
return dataset;
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
// @__NO_SIDE_EFFECTS__
|
|
348
|
+
function optional(wrapped, default_) {
|
|
349
|
+
return {
|
|
350
|
+
kind: "schema",
|
|
351
|
+
type: "optional",
|
|
352
|
+
reference: optional,
|
|
353
|
+
expects: `(${wrapped.expects} | undefined)`,
|
|
354
|
+
async: false,
|
|
355
|
+
wrapped,
|
|
356
|
+
default: default_,
|
|
357
|
+
get "~standard"() {
|
|
358
|
+
return /* @__PURE__ */ _getStandardProps(this);
|
|
359
|
+
},
|
|
360
|
+
"~run"(dataset, config$1) {
|
|
361
|
+
if (dataset.value === void 0) {
|
|
362
|
+
if (this.default !== void 0) dataset.value = /* @__PURE__ */ getDefault(this, dataset, config$1);
|
|
363
|
+
if (dataset.value === void 0) {
|
|
364
|
+
dataset.typed = true;
|
|
365
|
+
return dataset;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return this.wrapped["~run"](dataset, config$1);
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
// @__NO_SIDE_EFFECTS__
|
|
373
|
+
function picklist(options, message$1) {
|
|
374
|
+
return {
|
|
375
|
+
kind: "schema",
|
|
376
|
+
type: "picklist",
|
|
377
|
+
reference: picklist,
|
|
378
|
+
expects: /* @__PURE__ */ _joinExpects(options.map(_stringify), "|"),
|
|
379
|
+
async: false,
|
|
380
|
+
options,
|
|
381
|
+
message: message$1,
|
|
382
|
+
get "~standard"() {
|
|
383
|
+
return /* @__PURE__ */ _getStandardProps(this);
|
|
384
|
+
},
|
|
385
|
+
"~run"(dataset, config$1) {
|
|
386
|
+
if (this.options.includes(dataset.value)) dataset.typed = true;
|
|
387
|
+
else _addIssue(this, "type", dataset, config$1);
|
|
388
|
+
return dataset;
|
|
389
|
+
}
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
// @__NO_SIDE_EFFECTS__
|
|
393
|
+
function record(key, value$1, message$1) {
|
|
394
|
+
return {
|
|
395
|
+
kind: "schema",
|
|
396
|
+
type: "record",
|
|
397
|
+
reference: record,
|
|
398
|
+
expects: "Object",
|
|
399
|
+
async: false,
|
|
400
|
+
key,
|
|
401
|
+
value: value$1,
|
|
402
|
+
message: message$1,
|
|
403
|
+
get "~standard"() {
|
|
404
|
+
return /* @__PURE__ */ _getStandardProps(this);
|
|
405
|
+
},
|
|
406
|
+
"~run"(dataset, config$1) {
|
|
407
|
+
const input = dataset.value;
|
|
408
|
+
if (input && typeof input === "object") {
|
|
409
|
+
dataset.typed = true;
|
|
410
|
+
dataset.value = {};
|
|
411
|
+
for (const entryKey in input) if (/* @__PURE__ */ _isValidObjectKey(input, entryKey)) {
|
|
412
|
+
const entryValue = input[entryKey];
|
|
413
|
+
const keyDataset = this.key["~run"]({ value: entryKey }, config$1);
|
|
414
|
+
if (keyDataset.issues) {
|
|
415
|
+
const pathItem = {
|
|
416
|
+
type: "object",
|
|
417
|
+
origin: "key",
|
|
418
|
+
input,
|
|
419
|
+
key: entryKey,
|
|
420
|
+
value: entryValue
|
|
421
|
+
};
|
|
422
|
+
for (const issue of keyDataset.issues) {
|
|
423
|
+
issue.path = [pathItem];
|
|
424
|
+
dataset.issues?.push(issue);
|
|
425
|
+
}
|
|
426
|
+
if (!dataset.issues) dataset.issues = keyDataset.issues;
|
|
427
|
+
if (config$1.abortEarly) {
|
|
428
|
+
dataset.typed = false;
|
|
429
|
+
break;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
const valueDataset = this.value["~run"]({ value: entryValue }, config$1);
|
|
433
|
+
if (valueDataset.issues) {
|
|
434
|
+
const pathItem = {
|
|
435
|
+
type: "object",
|
|
436
|
+
origin: "value",
|
|
437
|
+
input,
|
|
438
|
+
key: entryKey,
|
|
439
|
+
value: entryValue
|
|
440
|
+
};
|
|
441
|
+
for (const issue of valueDataset.issues) {
|
|
442
|
+
if (issue.path) issue.path.unshift(pathItem);
|
|
443
|
+
else issue.path = [pathItem];
|
|
444
|
+
dataset.issues?.push(issue);
|
|
445
|
+
}
|
|
446
|
+
if (!dataset.issues) dataset.issues = valueDataset.issues;
|
|
447
|
+
if (config$1.abortEarly) {
|
|
448
|
+
dataset.typed = false;
|
|
449
|
+
break;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
if (!keyDataset.typed || !valueDataset.typed) dataset.typed = false;
|
|
453
|
+
if (keyDataset.typed) dataset.value[keyDataset.value] = valueDataset.value;
|
|
454
|
+
}
|
|
455
|
+
} else _addIssue(this, "type", dataset, config$1);
|
|
456
|
+
return dataset;
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
// @__NO_SIDE_EFFECTS__
|
|
461
|
+
function string(message$1) {
|
|
462
|
+
return {
|
|
463
|
+
kind: "schema",
|
|
464
|
+
type: "string",
|
|
465
|
+
reference: string,
|
|
466
|
+
expects: "string",
|
|
467
|
+
async: false,
|
|
468
|
+
message: message$1,
|
|
469
|
+
get "~standard"() {
|
|
470
|
+
return /* @__PURE__ */ _getStandardProps(this);
|
|
471
|
+
},
|
|
472
|
+
"~run"(dataset, config$1) {
|
|
473
|
+
if (typeof dataset.value === "string") dataset.typed = true;
|
|
474
|
+
else _addIssue(this, "type", dataset, config$1);
|
|
475
|
+
return dataset;
|
|
476
|
+
}
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
// @__NO_SIDE_EFFECTS__
|
|
480
|
+
function unknown() {
|
|
481
|
+
return {
|
|
482
|
+
kind: "schema",
|
|
483
|
+
type: "unknown",
|
|
484
|
+
reference: unknown,
|
|
485
|
+
expects: "unknown",
|
|
486
|
+
async: false,
|
|
487
|
+
get "~standard"() {
|
|
488
|
+
return /* @__PURE__ */ _getStandardProps(this);
|
|
489
|
+
},
|
|
490
|
+
"~run"(dataset) {
|
|
491
|
+
dataset.typed = true;
|
|
492
|
+
return dataset;
|
|
493
|
+
}
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
// @__NO_SIDE_EFFECTS__
|
|
497
|
+
function safeParse(schema, input, config$1) {
|
|
498
|
+
const dataset = schema["~run"]({ value: input }, /* @__PURE__ */ getGlobalConfig(config$1));
|
|
499
|
+
return {
|
|
500
|
+
typed: dataset.typed,
|
|
501
|
+
success: !dataset.issues,
|
|
502
|
+
output: dataset.value,
|
|
503
|
+
issues: dataset.issues
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// packages/core/src/events.ts
|
|
508
|
+
var QueueMonitorEventSink = class {
|
|
509
|
+
constructor(queue) {
|
|
510
|
+
this.queue = queue;
|
|
511
|
+
}
|
|
512
|
+
async deliver(input) {
|
|
513
|
+
try {
|
|
514
|
+
await this.queue.enqueue(input);
|
|
515
|
+
return { ok: true };
|
|
516
|
+
} catch (error) {
|
|
517
|
+
return { ok: false, error: error instanceof Error ? error.message : String(error) };
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
};
|
|
521
|
+
var InMemoryMonitorEventQueue = class {
|
|
522
|
+
events = [];
|
|
523
|
+
async enqueue(input) {
|
|
524
|
+
const queued = createQueuedMonitorEvent(input.monitor, input.event);
|
|
525
|
+
const existing = this.events.find((event) => event.id === queued.id);
|
|
526
|
+
if (existing) return existing;
|
|
527
|
+
this.events.push(queued);
|
|
528
|
+
return queued;
|
|
529
|
+
}
|
|
530
|
+
async read(target) {
|
|
531
|
+
return this.events.filter((event) => sameTarget(event.target, target)).map((event) => structuredClone(event));
|
|
532
|
+
}
|
|
533
|
+
async acknowledge(target, eventIDs) {
|
|
534
|
+
const ids = new Set(eventIDs);
|
|
535
|
+
for (let index = this.events.length - 1; index >= 0; index -= 1) {
|
|
536
|
+
if (sameTarget(this.events[index].target, target) && ids.has(this.events[index].id)) this.events.splice(index, 1);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
};
|
|
540
|
+
function createQueuedMonitorEvent(monitor, event) {
|
|
541
|
+
return {
|
|
542
|
+
id: `${monitor.id}:${monitorEventID(event)}`,
|
|
543
|
+
monitorID: monitor.id,
|
|
544
|
+
target: monitor.target,
|
|
545
|
+
event,
|
|
546
|
+
queuedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
function monitorEventID(event) {
|
|
550
|
+
if (event.id) return event.id;
|
|
551
|
+
return `${event.kind}:${event.at}:${event.summary}`;
|
|
552
|
+
}
|
|
553
|
+
function sameTarget(left, right) {
|
|
554
|
+
return left.kind === right.kind && left.id === right.id;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
// packages/core/src/sources/schema.ts
|
|
558
|
+
var MonitorSourceSchema = intersect([
|
|
559
|
+
object({ type: string() }),
|
|
560
|
+
record(string(), unknown())
|
|
561
|
+
]);
|
|
562
|
+
|
|
563
|
+
// packages/core/src/monitors/schema.ts
|
|
564
|
+
var MonitorRecordSchema = object({
|
|
565
|
+
id: string(),
|
|
566
|
+
name: string(),
|
|
567
|
+
source: MonitorSourceSchema,
|
|
568
|
+
delivery: picklist(["poll", "webhook"]),
|
|
569
|
+
target: object({
|
|
570
|
+
kind: string(),
|
|
571
|
+
id: string()
|
|
572
|
+
}),
|
|
573
|
+
pollIntervalSec: number(),
|
|
574
|
+
enabled: boolean(),
|
|
575
|
+
createdAt: string(),
|
|
576
|
+
updatedAt: string(),
|
|
577
|
+
cursors: record(string(), unknown())
|
|
578
|
+
});
|
|
579
|
+
var MonitorRegistrySchema = object({
|
|
580
|
+
monitors: array(MonitorRecordSchema)
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
// packages/core/src/storage/json.ts
|
|
584
|
+
var JsonMonitorStore = class {
|
|
585
|
+
stateDir;
|
|
586
|
+
stateFile;
|
|
587
|
+
constructor(options = {}) {
|
|
588
|
+
this.stateDir = options.stateDir ?? process.env.SOURCEFED_STATE_DIR ?? path.join(process.env.XDG_STATE_HOME ?? path.join(os.homedir(), ".local", "state"), "sourcefed");
|
|
589
|
+
this.stateFile = path.join(this.stateDir, "monitors.json");
|
|
590
|
+
}
|
|
591
|
+
async load() {
|
|
592
|
+
const raw = await this.readRaw(this.stateFile);
|
|
593
|
+
if (raw === void 0) return { monitors: [] };
|
|
594
|
+
const parsed = parseRegistry(raw);
|
|
595
|
+
if (!parsed) throw new Error(`invalid monitor state at ${this.stateFile}; refusing to overwrite`);
|
|
596
|
+
return parsed;
|
|
597
|
+
}
|
|
598
|
+
async acquireExclusive() {
|
|
599
|
+
const lockPath = path.join(this.stateDir, ".monitors.lock");
|
|
600
|
+
await mkdir(this.stateDir, { recursive: true });
|
|
601
|
+
const pid = String(process.pid);
|
|
602
|
+
for (let attempt = 0; attempt < 5; attempt++) {
|
|
603
|
+
try {
|
|
604
|
+
const handle = await open(lockPath, "wx");
|
|
605
|
+
await handle.writeFile(pid);
|
|
606
|
+
let released = false;
|
|
607
|
+
return async () => {
|
|
608
|
+
if (released) return;
|
|
609
|
+
released = true;
|
|
610
|
+
await handle.close();
|
|
611
|
+
const current = await readLockPid(lockPath);
|
|
612
|
+
if (current === process.pid) await rm(lockPath, { force: true });
|
|
613
|
+
};
|
|
614
|
+
} catch (error) {
|
|
615
|
+
const code = error && typeof error === "object" && "code" in error ? error.code : void 0;
|
|
616
|
+
if (code !== "EEXIST") throw error;
|
|
617
|
+
const holder = await readLockPid(lockPath);
|
|
618
|
+
if (holder === void 0 || processAlive(holder)) {
|
|
619
|
+
throw new Error(`another sourcefed daemon (pid ${holder ?? "unknown"}) is using ${this.stateDir}; stop it or set SOURCEFED_STATE_DIR`);
|
|
620
|
+
}
|
|
621
|
+
const contender = `${lockPath}.${process.pid}.${Date.now().toString(36)}`;
|
|
622
|
+
try {
|
|
623
|
+
await rename(lockPath, contender);
|
|
624
|
+
} catch {
|
|
625
|
+
continue;
|
|
626
|
+
}
|
|
627
|
+
await writeFile(contender, pid);
|
|
628
|
+
try {
|
|
629
|
+
await link(contender, lockPath);
|
|
630
|
+
} catch {
|
|
631
|
+
await rm(contender, { force: true });
|
|
632
|
+
continue;
|
|
633
|
+
}
|
|
634
|
+
await rm(contender, { force: true });
|
|
635
|
+
let released = false;
|
|
636
|
+
return async () => {
|
|
637
|
+
if (released) return;
|
|
638
|
+
released = true;
|
|
639
|
+
const current = await readLockPid(lockPath);
|
|
640
|
+
if (current === process.pid) await rm(lockPath, { force: true });
|
|
641
|
+
};
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
throw new Error(`could not acquire the sourcefed state lock at ${lockPath}`);
|
|
645
|
+
}
|
|
646
|
+
async save(registry) {
|
|
647
|
+
await mkdir(this.stateDir, { recursive: true, mode: 448 });
|
|
648
|
+
const temporary = `${this.stateFile}.${process.pid}.tmp`;
|
|
649
|
+
await writeFile(temporary, `${JSON.stringify(registry, null, 2)}
|
|
650
|
+
`, { mode: 384 });
|
|
651
|
+
await rename(temporary, this.stateFile);
|
|
652
|
+
}
|
|
653
|
+
async readRaw(filePath) {
|
|
654
|
+
try {
|
|
655
|
+
const contents = await readFile(filePath, "utf8");
|
|
656
|
+
return JSON.parse(contents);
|
|
657
|
+
} catch (error) {
|
|
658
|
+
if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") return void 0;
|
|
659
|
+
throw error;
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
};
|
|
663
|
+
async function readLockPid(lockPath) {
|
|
664
|
+
try {
|
|
665
|
+
const contents = await readFile(lockPath, "utf8");
|
|
666
|
+
const pid = Number(contents.trim());
|
|
667
|
+
return Number.isInteger(pid) && pid > 0 ? pid : void 0;
|
|
668
|
+
} catch {
|
|
669
|
+
return void 0;
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
function processAlive(pid) {
|
|
673
|
+
try {
|
|
674
|
+
process.kill(pid, 0);
|
|
675
|
+
return true;
|
|
676
|
+
} catch (error) {
|
|
677
|
+
return Boolean(error && typeof error === "object" && "code" in error && error.code === "EPERM");
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
function parseRegistry(value) {
|
|
681
|
+
const result = safeParse(MonitorRegistrySchema, value);
|
|
682
|
+
return result.success ? result.output : void 0;
|
|
683
|
+
}
|
|
684
|
+
function defaultJsonMonitorStore(options = {}) {
|
|
685
|
+
return new JsonMonitorStore(options);
|
|
686
|
+
}
|
|
687
|
+
var JsonMonitorEventQueue = class {
|
|
688
|
+
constructor(stateDir) {
|
|
689
|
+
this.stateDir = stateDir;
|
|
690
|
+
this.eventsFile = path.join(stateDir, "events.json");
|
|
691
|
+
}
|
|
692
|
+
eventsFile;
|
|
693
|
+
queue = Promise.resolve();
|
|
694
|
+
async enqueue(input) {
|
|
695
|
+
return this.transact((events) => {
|
|
696
|
+
const queued = createQueuedMonitorEvent(input.monitor, input.event);
|
|
697
|
+
const existing = events.find((event) => event.id === queued.id);
|
|
698
|
+
if (existing) return existing;
|
|
699
|
+
events.push(queued);
|
|
700
|
+
return queued;
|
|
701
|
+
});
|
|
702
|
+
}
|
|
703
|
+
async read(target) {
|
|
704
|
+
const events = await this.loadEvents();
|
|
705
|
+
return events.filter((event) => sameTarget2(event.target, target));
|
|
706
|
+
}
|
|
707
|
+
async acknowledge(target, eventIDs) {
|
|
708
|
+
await this.transact((events) => {
|
|
709
|
+
const ids = new Set(eventIDs);
|
|
710
|
+
for (let index = events.length - 1; index >= 0; index -= 1) {
|
|
711
|
+
if (sameTarget2(events[index].target, target) && ids.has(events[index].id)) events.splice(index, 1);
|
|
712
|
+
}
|
|
713
|
+
});
|
|
714
|
+
}
|
|
715
|
+
async transact(operation) {
|
|
716
|
+
const next = this.queue.then(async () => {
|
|
717
|
+
const events = await this.loadEvents();
|
|
718
|
+
const result = await operation(events);
|
|
719
|
+
await this.saveEvents(events);
|
|
720
|
+
return result;
|
|
721
|
+
});
|
|
722
|
+
this.queue = next.then(() => void 0, () => void 0);
|
|
723
|
+
return next;
|
|
724
|
+
}
|
|
725
|
+
async loadEvents() {
|
|
726
|
+
try {
|
|
727
|
+
const contents = await readFile(this.eventsFile, "utf8");
|
|
728
|
+
const parsed = JSON.parse(contents);
|
|
729
|
+
if (!Array.isArray(parsed)) throw new Error(`invalid event queue at ${this.eventsFile}`);
|
|
730
|
+
return parsed;
|
|
731
|
+
} catch (error) {
|
|
732
|
+
if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") return [];
|
|
733
|
+
throw error;
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
async saveEvents(events) {
|
|
737
|
+
await mkdir(this.stateDir, { recursive: true, mode: 448 });
|
|
738
|
+
const temporary = `${this.eventsFile}.${process.pid}.tmp`;
|
|
739
|
+
await writeFile(temporary, `${JSON.stringify(events, null, 2)}
|
|
740
|
+
`, { mode: 384 });
|
|
741
|
+
await rename(temporary, this.eventsFile);
|
|
742
|
+
}
|
|
743
|
+
};
|
|
744
|
+
function sameTarget2(left, right) {
|
|
745
|
+
return left.kind === right.kind && left.id === right.id;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
export {
|
|
749
|
+
array,
|
|
750
|
+
boolean,
|
|
751
|
+
object,
|
|
752
|
+
optional,
|
|
753
|
+
string,
|
|
754
|
+
unknown,
|
|
755
|
+
safeParse,
|
|
756
|
+
QueueMonitorEventSink,
|
|
757
|
+
InMemoryMonitorEventQueue,
|
|
758
|
+
createQueuedMonitorEvent,
|
|
759
|
+
monitorEventID,
|
|
760
|
+
InMemoryMonitorStore,
|
|
761
|
+
MonitorRecordSchema,
|
|
762
|
+
MonitorRegistrySchema,
|
|
763
|
+
JsonMonitorStore,
|
|
764
|
+
defaultJsonMonitorStore,
|
|
765
|
+
JsonMonitorEventQueue
|
|
766
|
+
};
|