pi-harness-runtime 1.1.396 → 1.1.398
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/AGENTS.md +54 -7
- package/harness/notification-events.ts +6 -6
- package/index.ts +1 -1
- package/package.json +1 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/agent-policy/package.json +1 -1
- package/packages/architecture-generator/package.json +1 -1
- package/packages/auth/package.json +1 -1
- package/packages/autonomous-refactor/package.json +1 -1
- package/packages/autonomous-runtime/package.json +1 -1
- package/packages/cache-strategy/package.json +1 -1
- package/packages/capability-registry/package.json +1 -1
- package/packages/checkpoint/package.json +1 -1
- package/packages/cli-plugin-sdk/package.json +1 -1
- package/packages/clipboard/package.json +1 -1
- package/packages/clipboard-plugin/package.json +1 -1
- package/packages/code-generation/package.json +1 -1
- package/packages/code-review/package.json +1 -1
- package/packages/codex-adapter/package.json +1 -1
- package/packages/codex-watcher/package.json +1 -1
- package/packages/config-capture/package.json +1 -1
- package/packages/connection-runtime/package.json +1 -1
- package/packages/context-compiler/package.json +1 -1
- package/packages/context-discovery/package.json +1 -1
- package/packages/context-manager/package.json +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/cookie-sanitizer/package.json +1 -1
- package/packages/cost-optimizer/package.json +1 -1
- package/packages/dependency-analyzer/package.json +1 -1
- package/packages/django-plugin/package.json +1 -1
- package/packages/doc-generator/package.json +1 -1
- package/packages/durable-review/package.json +1 -1
- package/packages/e2e-tester/package.json +1 -1
- package/packages/evaluation-engine/package.json +1 -1
- package/packages/evaluation-runner/package.json +1 -1
- package/packages/event-bus/package.json +1 -1
- package/packages/event-sink/package.json +1 -1
- package/packages/event-store/package.json +1 -1
- package/packages/experience-replay/package.json +1 -1
- package/packages/feedback-collector/package.json +1 -1
- package/packages/file-copy-helper/package.json +1 -1
- package/packages/framework-detector/package.json +1 -1
- package/packages/framework-plugin-sdk/package.json +1 -1
- package/packages/frappe-plugin/package.json +1 -1
- package/packages/generic-web-plugin/package.json +1 -1
- package/packages/health-monitor/package.json +1 -1
- package/packages/intent-analyzer/package.json +1 -1
- package/packages/jev-judge/package.json +1 -1
- package/packages/knowledge-graph/package.json +1 -1
- package/packages/knowledge-retrieval/package.json +1 -1
- package/packages/laravel-plugin/package.json +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/logging/README.md +41 -6
- package/packages/logging/dist/classification.d.ts +65 -0
- package/packages/logging/dist/classification.d.ts.map +1 -0
- package/packages/logging/dist/classification.js +155 -0
- package/packages/logging/dist/classification.js.map +1 -0
- package/packages/logging/dist/config.d.ts +9 -0
- package/packages/logging/dist/config.d.ts.map +1 -1
- package/packages/logging/dist/config.js +40 -3
- package/packages/logging/dist/config.js.map +1 -1
- package/packages/logging/dist/index.d.ts +9 -1
- package/packages/logging/dist/index.d.ts.map +1 -1
- package/packages/logging/dist/index.js +10 -1
- package/packages/logging/dist/index.js.map +1 -1
- package/packages/logging/dist/ingest/schema.d.ts +60 -0
- package/packages/logging/dist/ingest/schema.d.ts.map +1 -0
- package/packages/logging/dist/ingest/schema.js +245 -0
- package/packages/logging/dist/ingest/schema.js.map +1 -0
- package/packages/logging/dist/installation.d.ts +32 -0
- package/packages/logging/dist/installation.d.ts.map +1 -0
- package/packages/logging/dist/installation.js +64 -0
- package/packages/logging/dist/installation.js.map +1 -0
- package/packages/logging/dist/sensitive-keys.d.ts +12 -0
- package/packages/logging/dist/sensitive-keys.d.ts.map +1 -0
- package/packages/logging/dist/sensitive-keys.js +39 -0
- package/packages/logging/dist/sensitive-keys.js.map +1 -0
- package/packages/logging/dist/server/credentials.d.ts +85 -0
- package/packages/logging/dist/server/credentials.d.ts.map +1 -0
- package/packages/logging/dist/server/credentials.js +147 -0
- package/packages/logging/dist/server/credentials.js.map +1 -0
- package/packages/logging/dist/server/http.d.ts +36 -0
- package/packages/logging/dist/server/http.d.ts.map +1 -0
- package/packages/logging/dist/server/http.js +139 -0
- package/packages/logging/dist/server/http.js.map +1 -0
- package/packages/logging/dist/server/index-store.d.ts +95 -0
- package/packages/logging/dist/server/index-store.d.ts.map +1 -0
- package/packages/logging/dist/server/index-store.js +190 -0
- package/packages/logging/dist/server/index-store.js.map +1 -0
- package/packages/logging/dist/server/index.d.ts +22 -0
- package/packages/logging/dist/server/index.d.ts.map +1 -0
- package/packages/logging/dist/server/index.js +15 -0
- package/packages/logging/dist/server/index.js.map +1 -0
- package/packages/logging/dist/server/keys.d.ts +22 -0
- package/packages/logging/dist/server/keys.d.ts.map +1 -0
- package/packages/logging/dist/server/keys.js +24 -0
- package/packages/logging/dist/server/keys.js.map +1 -0
- package/packages/logging/dist/server/outbox-worker.d.ts +55 -0
- package/packages/logging/dist/server/outbox-worker.d.ts.map +1 -0
- package/packages/logging/dist/server/outbox-worker.js +95 -0
- package/packages/logging/dist/server/outbox-worker.js.map +1 -0
- package/packages/logging/dist/server/outbox.d.ts +112 -0
- package/packages/logging/dist/server/outbox.d.ts.map +1 -0
- package/packages/logging/dist/server/outbox.js +247 -0
- package/packages/logging/dist/server/outbox.js.map +1 -0
- package/packages/logging/dist/server/service.d.ts +83 -0
- package/packages/logging/dist/server/service.d.ts.map +1 -0
- package/packages/logging/dist/server/service.js +144 -0
- package/packages/logging/dist/server/service.js.map +1 -0
- package/packages/logging/dist/shipper.d.ts +20 -4
- package/packages/logging/dist/shipper.d.ts.map +1 -1
- package/packages/logging/dist/shipper.js +31 -5
- package/packages/logging/dist/shipper.js.map +1 -1
- package/packages/logging/dist/singleton.d.ts.map +1 -1
- package/packages/logging/dist/singleton.js +3 -0
- package/packages/logging/dist/singleton.js.map +1 -1
- package/packages/logging/dist/types.d.ts +28 -1
- package/packages/logging/dist/types.d.ts.map +1 -1
- package/packages/logging/dist/types.js +8 -0
- package/packages/logging/dist/types.js.map +1 -1
- package/packages/logging/package.json +1 -1
- package/packages/logging/src/classification.ts +175 -0
- package/packages/logging/src/config.ts +60 -3
- package/packages/logging/src/index.ts +45 -1
- package/packages/logging/src/ingest/schema.ts +295 -0
- package/packages/logging/src/installation.ts +76 -0
- package/packages/logging/src/sensitive-keys.ts +40 -0
- package/packages/logging/src/server/credentials.ts +198 -0
- package/packages/logging/src/server/http.ts +170 -0
- package/packages/logging/src/server/index-store.ts +242 -0
- package/packages/logging/src/server/index.ts +56 -0
- package/packages/logging/src/server/keys.ts +32 -0
- package/packages/logging/src/server/outbox-worker.ts +124 -0
- package/packages/logging/src/server/outbox.ts +316 -0
- package/packages/logging/src/server/service.ts +196 -0
- package/packages/logging/src/shipper.ts +54 -8
- package/packages/logging/src/singleton.ts +3 -0
- package/packages/logging/src/types.ts +29 -1
- package/packages/logging/test/classification.test.ts +137 -0
- package/packages/logging/test/identity-transport.test.ts +197 -0
- package/packages/logging/test/ingest-schema.test.ts +184 -0
- package/packages/logging/test/integration.test.ts +9 -4
- package/packages/logging/test/log-http.test.ts +246 -0
- package/packages/logging/test/server.test.ts +444 -0
- package/packages/logging/test/shipper.test.ts +11 -11
- package/packages/logging/test/spool.test.ts +4 -1
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/memory-engine/package.json +1 -1
- package/packages/milestone-manager/package.json +1 -1
- package/packages/model-registry/package.json +1 -1
- package/packages/nextjs-plugin/package.json +1 -1
- package/packages/notification/dist/adapters/detail-format.d.ts +34 -0
- package/packages/notification/dist/adapters/detail-format.d.ts.map +1 -0
- package/packages/notification/dist/adapters/detail-format.js +55 -0
- package/packages/notification/dist/adapters/detail-format.js.map +1 -0
- package/packages/notification/dist/adapters/email-adapter.d.ts.map +1 -1
- package/packages/notification/dist/adapters/email-adapter.js +3 -2
- package/packages/notification/dist/adapters/email-adapter.js.map +1 -1
- package/packages/notification/dist/adapters/line-adapter.d.ts.map +1 -1
- package/packages/notification/dist/adapters/line-adapter.js +3 -2
- package/packages/notification/dist/adapters/line-adapter.js.map +1 -1
- package/packages/notification/dist/adapters/ntfy-adapter.d.ts.map +1 -1
- package/packages/notification/dist/adapters/ntfy-adapter.js +3 -2
- package/packages/notification/dist/adapters/ntfy-adapter.js.map +1 -1
- package/packages/notification/dist/adapters/telegram-adapter.d.ts +14 -0
- package/packages/notification/dist/adapters/telegram-adapter.d.ts.map +1 -1
- package/packages/notification/dist/adapters/telegram-adapter.js +83 -67
- package/packages/notification/dist/adapters/telegram-adapter.js.map +1 -1
- package/packages/notification/dist/notification-center.d.ts.map +1 -1
- package/packages/notification/dist/notification-center.js +1 -0
- package/packages/notification/dist/notification-center.js.map +1 -1
- package/packages/notification/dist/types.d.ts +3 -0
- package/packages/notification/dist/types.d.ts.map +1 -1
- package/packages/notification/package.json +1 -1
- package/packages/notification/src/adapters/detail-format.ts +74 -0
- package/packages/notification/src/adapters/email-adapter.ts +3 -2
- package/packages/notification/src/adapters/line-adapter.ts +3 -2
- package/packages/notification/src/adapters/ntfy-adapter.ts +3 -2
- package/packages/notification/src/adapters/telegram-adapter.ts +92 -74
- package/packages/notification/src/notification-center.ts +1 -0
- package/packages/notification/src/types.ts +3 -0
- package/packages/notification/test/detail-format.test.ts +106 -0
- package/packages/observability/package.json +1 -1
- package/packages/okf-indexer/package.json +1 -1
- package/packages/paperclip-integration/package.json +1 -1
- package/packages/performance-optimizer/package.json +1 -1
- package/packages/permission-mode/package.json +1 -1
- package/packages/privilege-broker/package.json +1 -1
- package/packages/project-analyzer/package.json +1 -1
- package/packages/project-bootstrap/package.json +1 -1
- package/packages/projection-engine/package.json +1 -1
- package/packages/prompt-compiler/package.json +1 -1
- package/packages/prompt-versioning/package.json +1 -1
- package/packages/provider-adapter-sdk/package.json +1 -1
- package/packages/provider-router/package.json +1 -1
- package/packages/provider-selector/package.json +1 -1
- package/packages/providers/package.json +1 -1
- package/packages/qdrant-skills/package.json +1 -1
- package/packages/quota-manager/package.json +1 -1
- package/packages/rate-limiter/package.json +1 -1
- package/packages/react-vite-plugin/package.json +1 -1
- package/packages/relay/package.json +1 -1
- package/packages/release-manager/package.json +1 -1
- package/packages/requirement-compiler/package.json +1 -1
- package/packages/runtime/package.json +1 -1
- package/packages/scheduler/package.json +1 -1
- package/packages/scheduler-adapter/package.json +1 -1
- package/packages/session/package.json +1 -1
- package/packages/session-api/package.json +1 -1
- package/packages/session-export/package.json +1 -1
- package/packages/shared-context/package.json +1 -1
- package/packages/skill-mcp-client/package.json +1 -1
- package/packages/skill-registry/package.json +1 -1
- package/packages/skills/package.json +1 -1
- package/packages/sprint-planner/package.json +1 -1
- package/packages/subscription-engine/package.json +1 -1
- package/packages/task-compiler/package.json +1 -1
- package/packages/telegram/package.json +1 -1
- package/packages/tencentdb-memory/package.json +1 -1
- package/packages/tencentdb-sync/package.json +1 -1
- package/packages/test-data-generator/package.json +1 -1
- package/packages/test-generator/package.json +1 -1
- package/packages/todo-bd-sync/package.json +1 -1
- package/packages/token-estimation/package.json +1 -1
- package/packages/token-optimizer/package.json +1 -1
- package/packages/trajectory/package.json +1 -1
- package/packages/tui/package.json +1 -1
- package/packages/types/package.json +1 -1
- package/packages/voice-api/package.json +1 -1
- package/packages/webmcp-tester/package.json +1 -1
- package/packages/wiki/package.json +1 -1
- package/packages/workflow-events/package.json +1 -1
- package/packages/workspace-scanner/package.json +1 -1
- package/packages/worktree/package.json +1 -1
- package/packages/write-review/package.json +1 -1
- package/scripts/unified-webhook-server.ts +86 -81
|
@@ -41,11 +41,11 @@ describe("LogShipper", () => {
|
|
|
41
41
|
const transport = recorder();
|
|
42
42
|
const shipper = new LogShipper({ transports: [transport.transport], flushIntervalMs: 0 });
|
|
43
43
|
|
|
44
|
-
shipper.info("unit", "started", "hello");
|
|
44
|
+
shipper.info("unit", "service.started", "hello");
|
|
45
45
|
await shipper.flush();
|
|
46
46
|
|
|
47
47
|
expect(transport.batches).toHaveLength(1);
|
|
48
|
-
expect(transport.batches[0].records[0].event).toBe("started");
|
|
48
|
+
expect(transport.batches[0].records[0].event).toBe("service.started");
|
|
49
49
|
expect(shipper.getStats().shipped).toBe(1);
|
|
50
50
|
});
|
|
51
51
|
|
|
@@ -58,7 +58,7 @@ describe("LogShipper", () => {
|
|
|
58
58
|
flushIntervalMs: 0,
|
|
59
59
|
});
|
|
60
60
|
|
|
61
|
-
shipper.info("unit", "started");
|
|
61
|
+
shipper.info("unit", "service.started");
|
|
62
62
|
await shipper.flush();
|
|
63
63
|
|
|
64
64
|
expect(working.batches).toHaveLength(1);
|
|
@@ -76,7 +76,7 @@ describe("LogShipper", () => {
|
|
|
76
76
|
flushIntervalMs: 0,
|
|
77
77
|
});
|
|
78
78
|
|
|
79
|
-
shipper.info("unit", "started");
|
|
79
|
+
shipper.info("unit", "service.started");
|
|
80
80
|
await shipper.flush();
|
|
81
81
|
|
|
82
82
|
expect(spool.list()).toHaveLength(1);
|
|
@@ -94,7 +94,7 @@ describe("LogShipper", () => {
|
|
|
94
94
|
flushIntervalMs: 0,
|
|
95
95
|
});
|
|
96
96
|
|
|
97
|
-
shipper.info("unit", "first");
|
|
97
|
+
shipper.info("unit", "service.first");
|
|
98
98
|
await shipper.flush();
|
|
99
99
|
expect(spool.list()).toHaveLength(1);
|
|
100
100
|
|
|
@@ -103,14 +103,14 @@ describe("LogShipper", () => {
|
|
|
103
103
|
|
|
104
104
|
expect(spool.list()).toHaveLength(0);
|
|
105
105
|
expect(failing.batches).toHaveLength(1);
|
|
106
|
-
expect(failing.batches[0].records[0].event).toBe("first");
|
|
106
|
+
expect(failing.batches[0].records[0].event).toBe("service.first");
|
|
107
107
|
});
|
|
108
108
|
|
|
109
109
|
test("redacts secrets before shipping", async () => {
|
|
110
110
|
const transport = recorder();
|
|
111
111
|
const shipper = new LogShipper({ transports: [transport.transport], flushIntervalMs: 0 });
|
|
112
112
|
|
|
113
|
-
shipper.info("unit", "login", "token=super-secret-value", { apiKey: "sk-should-not-ship" });
|
|
113
|
+
shipper.info("unit", "service.login", "token=super-secret-value", { apiKey: "sk-should-not-ship" });
|
|
114
114
|
await shipper.flush();
|
|
115
115
|
|
|
116
116
|
const serialized = JSON.stringify(transport.batches[0]);
|
|
@@ -128,7 +128,7 @@ describe("LogShipper", () => {
|
|
|
128
128
|
const spool = new LogSpool({ dir });
|
|
129
129
|
const shipper = new LogShipper({ transports: [], spool, flushIntervalMs: 0 });
|
|
130
130
|
|
|
131
|
-
shipper.info("unit", "exit");
|
|
131
|
+
shipper.info("unit", "service.exit");
|
|
132
132
|
shipper.flushSync();
|
|
133
133
|
|
|
134
134
|
expect(spool.list()).toHaveLength(1);
|
|
@@ -142,11 +142,11 @@ describe("LogShipper", () => {
|
|
|
142
142
|
sampling: { minLevel: "info", sampleRate: 0 },
|
|
143
143
|
});
|
|
144
144
|
|
|
145
|
-
shipper.debug("unit", "noisy");
|
|
146
|
-
shipper.info("unit", "important");
|
|
145
|
+
shipper.debug("unit", "service.noisy");
|
|
146
|
+
shipper.info("unit", "service.important");
|
|
147
147
|
await shipper.flush();
|
|
148
148
|
|
|
149
149
|
expect(transport.batches[0].records).toHaveLength(1);
|
|
150
|
-
expect(transport.batches[0].records[0].event).toBe("important");
|
|
150
|
+
expect(transport.batches[0].records[0].event).toBe("service.important");
|
|
151
151
|
});
|
|
152
152
|
});
|
|
@@ -4,6 +4,7 @@ import { tmpdir } from "node:os";
|
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { LogSpool } from "../src/spool.js";
|
|
6
6
|
import type { LogBatch, LogRecord } from "../src/types.js";
|
|
7
|
+
import { LOG_SCHEMA_VERSION } from "../src/types.js";
|
|
7
8
|
|
|
8
9
|
const created: string[] = [];
|
|
9
10
|
|
|
@@ -24,9 +25,11 @@ function record(event: string): LogRecord {
|
|
|
24
25
|
|
|
25
26
|
function batch(events: string[]): LogBatch {
|
|
26
27
|
return {
|
|
28
|
+
schemaVersion: LOG_SCHEMA_VERSION,
|
|
27
29
|
batchId: "batch-1",
|
|
28
30
|
app: "test",
|
|
29
|
-
|
|
31
|
+
installationId: "11111111-2222-3333-4444-555555555555",
|
|
32
|
+
hostLabel: "localhost",
|
|
30
33
|
sentAt: new Date().toISOString(),
|
|
31
34
|
records: events.map(record),
|
|
32
35
|
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared rendering of the notification detail fields.
|
|
3
|
+
*
|
|
4
|
+
* `details.error` is reserved for events that represent an actual failure. A
|
|
5
|
+
* resume trigger ("provider-overload", "post-compact") or a quota detail is a
|
|
6
|
+
* reason, not an error, and must never be rendered under the "Error:" footer.
|
|
7
|
+
*
|
|
8
|
+
* Every adapter renders the detail fields through this module so the labels
|
|
9
|
+
* stay consistent across Telegram, LINE, ntfy and email.
|
|
10
|
+
*/
|
|
11
|
+
import type { NotificationEvent, NotificationPayload } from "../types.js";
|
|
12
|
+
/** Events whose `details.error` really is an error. */
|
|
13
|
+
export declare const ERROR_EVENTS: ReadonlySet<NotificationEvent>;
|
|
14
|
+
export declare function isErrorEvent(event: NotificationEvent): boolean;
|
|
15
|
+
export interface DetailLine {
|
|
16
|
+
/** "Error" for a real failure, "Reason" for a trigger or a detail. */
|
|
17
|
+
label: "Error" | "Reason";
|
|
18
|
+
value: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Render the detail fields of a payload as footer lines.
|
|
22
|
+
*
|
|
23
|
+
* - `details.reason` becomes "Reason: ..." for every event.
|
|
24
|
+
* - `details.error` becomes "Error: ..." for the error events only.
|
|
25
|
+
* - A legacy `details.error` on a non-error event becomes "Reason: ..." so the
|
|
26
|
+
* information survives when a producer still uses the old field.
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatDetailLines(details: NotificationPayload["details"], event: NotificationEvent): DetailLine[];
|
|
29
|
+
/**
|
|
30
|
+
* The same lines as a plain text block, one per line.
|
|
31
|
+
* An empty string when there is nothing to render.
|
|
32
|
+
*/
|
|
33
|
+
export declare function formatDetailText(details: NotificationPayload["details"], event: NotificationEvent): string;
|
|
34
|
+
//# sourceMappingURL=detail-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detail-format.d.ts","sourceRoot":"","sources":["../../src/adapters/detail-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE1E,uDAAuD;AACvD,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,iBAAiB,CAItD,CAAC;AAEH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAE9D;AAED,MAAM,WAAW,UAAU;IAC1B,sEAAsE;IACtE,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;CACd;AAQD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,mBAAmB,CAAC,SAAS,CAAC,EACvC,KAAK,EAAE,iBAAiB,GACtB,UAAU,EAAE,CAad;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,mBAAmB,CAAC,SAAS,CAAC,EACvC,KAAK,EAAE,iBAAiB,GACtB,MAAM,CAIR"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared rendering of the notification detail fields.
|
|
3
|
+
*
|
|
4
|
+
* `details.error` is reserved for events that represent an actual failure. A
|
|
5
|
+
* resume trigger ("provider-overload", "post-compact") or a quota detail is a
|
|
6
|
+
* reason, not an error, and must never be rendered under the "Error:" footer.
|
|
7
|
+
*
|
|
8
|
+
* Every adapter renders the detail fields through this module so the labels
|
|
9
|
+
* stay consistent across Telegram, LINE, ntfy and email.
|
|
10
|
+
*/
|
|
11
|
+
/** Events whose `details.error` really is an error. */
|
|
12
|
+
export const ERROR_EVENTS = new Set([
|
|
13
|
+
"TaskFailed",
|
|
14
|
+
"E2EFailed",
|
|
15
|
+
"Error",
|
|
16
|
+
]);
|
|
17
|
+
export function isErrorEvent(event) {
|
|
18
|
+
return ERROR_EVENTS.has(event);
|
|
19
|
+
}
|
|
20
|
+
function readString(value) {
|
|
21
|
+
if (typeof value !== "string")
|
|
22
|
+
return undefined;
|
|
23
|
+
const trimmed = value.trim();
|
|
24
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Render the detail fields of a payload as footer lines.
|
|
28
|
+
*
|
|
29
|
+
* - `details.reason` becomes "Reason: ..." for every event.
|
|
30
|
+
* - `details.error` becomes "Error: ..." for the error events only.
|
|
31
|
+
* - A legacy `details.error` on a non-error event becomes "Reason: ..." so the
|
|
32
|
+
* information survives when a producer still uses the old field.
|
|
33
|
+
*/
|
|
34
|
+
export function formatDetailLines(details, event) {
|
|
35
|
+
const lines = [];
|
|
36
|
+
const reason = readString(details?.reason);
|
|
37
|
+
const error = readString(details?.error);
|
|
38
|
+
if (reason) {
|
|
39
|
+
lines.push({ label: "Reason", value: reason });
|
|
40
|
+
}
|
|
41
|
+
if (error) {
|
|
42
|
+
lines.push({ label: isErrorEvent(event) ? "Error" : "Reason", value: error });
|
|
43
|
+
}
|
|
44
|
+
return lines;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The same lines as a plain text block, one per line.
|
|
48
|
+
* An empty string when there is nothing to render.
|
|
49
|
+
*/
|
|
50
|
+
export function formatDetailText(details, event) {
|
|
51
|
+
return formatDetailLines(details, event)
|
|
52
|
+
.map((line) => `${line.label}: ${line.value}`)
|
|
53
|
+
.join("\n");
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=detail-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detail-format.js","sourceRoot":"","sources":["../../src/adapters/detail-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,uDAAuD;AACvD,MAAM,CAAC,MAAM,YAAY,GAAmC,IAAI,GAAG,CAAoB;IACtF,YAAY;IACZ,WAAW;IACX,OAAO;CACP,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY,CAAC,KAAwB;IACpD,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAQD,SAAS,UAAU,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAChC,OAAuC,EACvC,KAAwB;IAExB,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAEzC,IAAI,MAAM,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC/B,OAAuC,EACvC,KAAwB;IAExB,OAAO,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC;SACtC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;SAC7C,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/email-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"email-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/email-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AA4BxD,qBAAa,YAAa,SAAQ,kBAAkB;IACnD,QAAQ,CAAC,EAAE,WAAW;IACtB,QAAQ,CAAC,IAAI,WAAW;IAExB,YAAY,MAAM,EAAE,WAAW,EAE9B;IAEK,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAWnC;IAEK,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0BpE;IAED,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,QAAQ;CAiBhB"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Sends notifications via SMTP.
|
|
5
5
|
*/
|
|
6
6
|
import { BaseChannelAdapter } from "../base-adapter.js";
|
|
7
|
+
import { formatDetailLines } from "./detail-format.js";
|
|
7
8
|
import { logInfo } from "../file-logger.js";
|
|
8
9
|
// Simple SMTP client using built-in net module
|
|
9
10
|
async function sendSmtpEmail(host, port, user, password, from, to, subject, body, tls = false) {
|
|
@@ -64,8 +65,8 @@ export class EmailAdapter extends BaseChannelAdapter {
|
|
|
64
65
|
if (payload.details?.jobId) {
|
|
65
66
|
lines.push(`Job ID: ${payload.details.jobId}`);
|
|
66
67
|
}
|
|
67
|
-
|
|
68
|
-
lines.push("",
|
|
68
|
+
for (const detail of formatDetailLines(payload.details, payload.event)) {
|
|
69
|
+
lines.push("", `${detail.label}: ${detail.value}`);
|
|
69
70
|
}
|
|
70
71
|
return lines.join("\n");
|
|
71
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-adapter.js","sourceRoot":"","sources":["../../src/adapters/email-adapter.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"email-adapter.js","sourceRoot":"","sources":["../../src/adapters/email-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,+CAA+C;AAC/C,KAAK,UAAU,aAAa,CAC3B,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,IAAY,EACZ,EAAY,EACZ,OAAe,EACf,IAAY,EACZ,GAAG,GAAY,KAAK;IAEpB,mEAAmE;IACnE,4CAA4C;IAC5C,OAAO,CAAC,SAAS,EAAE,iBAAiB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,SAAS,EAAE,YAAY,OAAO,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;IAEpC,yCAAyC;IACzC,6CAA6C;IAC7C,2DAA2D;IAC3D,uCAAuC;AACxC,CAAC;AAED,MAAM,OAAO,YAAa,SAAQ,kBAAkB;IAC1C,EAAE,GAAG,OAAO,CAAC;IACb,IAAI,GAAG,OAAO,CAAC;IAExB,YAAY,MAAmB;QAC9B,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,UAAU;QACf,yBAAyB;QACzB,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAqB,CAAC;YAC9C,yCAAyC;YACzC,OAAO,OAAO,CACb,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAC7D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA4B;QACtC,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAqB,CAAC;YAC9C,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACnE,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAEtC,MAAM,aAAa,CAClB,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,YAAY,EAChB,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,EAAE,EACN,OAAO,EACP,IAAI,EACJ,GAAG,CAAC,GAAG,CACP,CAAC;YAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI,CAAC,EAAE;gBAChB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACpB,CAAC;QACH,CAAC;IACF,CAAC;IAEO,UAAU,CAAC,OAA4B;QAC9C,MAAM,KAAK,GAAG;YACb,OAAO,CAAC,OAAO;YACf,EAAE;YACF,KAAK;YACL,UAAU,OAAO,CAAC,KAAK,EAAE;YACzB,SAAS,OAAO,CAAC,SAAS,EAAE;SAC5B,CAAC;QAEF,IAAI,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAEO,QAAQ,CAAC,KAAmC;QACnD,MAAM,GAAG,GAA2B;YACnC,UAAU,EAAE,MAAM;YAClB,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,KAAK;YACjB,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,KAAK;YACtB,gBAAgB,EAAE,MAAM;YACxB,oBAAoB,EAAE,MAAM;YAC5B,SAAS,EAAE,MAAM;YACjB,iBAAiB,EAAE,MAAM;YACzB,cAAc,EAAE,MAAM;YACtB,YAAY,EAAE,MAAM;YACpB,KAAK,EAAE,KAAK;SACZ,CAAC;QACF,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC;IAC7B,CAAC;CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"line-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/line-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"line-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/line-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGxD;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,oCAAoC,CAAC;AAEnE;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,GACZ,MAAM,CAmBR;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAarE;AAeD,qBAAa,WAAY,SAAQ,kBAAkB;IAClD,QAAQ,CAAC,EAAE,UAAU;IACrB,QAAQ,CAAC,IAAI,UAAU;IAEvB,YAAY,MAAM,EAAE,UAAU,EAE7B;IAEK,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CA4CnC;IAEK,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2DpE;IAED,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,QAAQ;CAiBhB"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Sends notifications via LINE Messaging API.
|
|
5
5
|
*/
|
|
6
6
|
import { BaseChannelAdapter } from "../base-adapter.js";
|
|
7
|
+
import { formatDetailLines } from "./detail-format.js";
|
|
7
8
|
/**
|
|
8
9
|
* The endpoint that validates a channel access token.
|
|
9
10
|
*
|
|
@@ -189,8 +190,8 @@ export class LineAdapter extends BaseChannelAdapter {
|
|
|
189
190
|
if (payload.details?.jobId) {
|
|
190
191
|
lines.push(`Job: ${payload.details.jobId}`);
|
|
191
192
|
}
|
|
192
|
-
|
|
193
|
-
lines.push("",
|
|
193
|
+
for (const detail of formatDetailLines(payload.details, payload.event)) {
|
|
194
|
+
lines.push("", `${detail.label}: ${detail.value}`);
|
|
194
195
|
}
|
|
195
196
|
return lines.filter(Boolean).join("\n");
|
|
196
197
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"line-adapter.js","sourceRoot":"","sources":["../../src/adapters/line-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"line-adapter.js","sourceRoot":"","sources":["../../src/adapters/line-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ntfy-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/ntfy-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"ntfy-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/ntfy-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGxD,qBAAa,WAAY,SAAQ,kBAAkB;IAClD,QAAQ,CAAC,EAAE,UAAU;IACrB,QAAQ,CAAC,IAAI,UAAU;IAEvB,YAAY,MAAM,EAAE,UAAU,EAE7B;IAEK,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAGnC;IAEK,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsCpE;IAED,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,OAAO;CAiBf"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Sends notifications via ntfy.sh (or self-hosted ntfy server).
|
|
5
5
|
*/
|
|
6
6
|
import { BaseChannelAdapter } from "../base-adapter.js";
|
|
7
|
+
import { formatDetailLines } from "./detail-format.js";
|
|
7
8
|
export class NtfyAdapter extends BaseChannelAdapter {
|
|
8
9
|
id = "ntfy";
|
|
9
10
|
type = "ntfy";
|
|
@@ -58,8 +59,8 @@ export class NtfyAdapter extends BaseChannelAdapter {
|
|
|
58
59
|
if (payload.details?.jobId) {
|
|
59
60
|
lines.push(`Job: ${payload.details.jobId}`);
|
|
60
61
|
}
|
|
61
|
-
|
|
62
|
-
lines.push(`\
|
|
62
|
+
for (const detail of formatDetailLines(payload.details, payload.event)) {
|
|
63
|
+
lines.push(`\n${detail.label}: ${detail.value}`);
|
|
63
64
|
}
|
|
64
65
|
return lines.join("");
|
|
65
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ntfy-adapter.js","sourceRoot":"","sources":["../../src/adapters/ntfy-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"ntfy-adapter.js","sourceRoot":"","sources":["../../src/adapters/ntfy-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,20 @@ import type { NotificationPayload, NotificationResult, TelegramCallbackHandler,
|
|
|
9
9
|
*/
|
|
10
10
|
type TelegramMessageHandler = (text: string, chatId: string) => Promise<void>;
|
|
11
11
|
import { BaseChannelAdapter } from "../base-adapter.js";
|
|
12
|
+
/**
|
|
13
|
+
* The status label of an event.
|
|
14
|
+
*
|
|
15
|
+
* Use ASCII labels per AGENTS.md convention - emoji render inconsistently
|
|
16
|
+
* across terminals and break the alignment of the machine readable output.
|
|
17
|
+
*/
|
|
18
|
+
export declare function telegramStatusLabel(event: NotificationPayload["event"]): string;
|
|
19
|
+
/**
|
|
20
|
+
* Render the Telegram message of a payload.
|
|
21
|
+
*
|
|
22
|
+
* Exported so the rendering can be tested without a Telegram connection: the
|
|
23
|
+
* detail footer must never label a resume trigger as an error.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildTelegramMessage(payload: NotificationPayload): string;
|
|
12
26
|
export declare class TelegramAdapter extends BaseChannelAdapter {
|
|
13
27
|
readonly id = "telegram";
|
|
14
28
|
readonly type = "telegram";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegram-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/telegram-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,KAAK,EAEX,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EAEvB,cAAc,EACd,MAAM,aAAa,CAAC;AAErB;;GAEG;AAEH,KAAK,sBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAY9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"telegram-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/telegram-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ import { logError, logInfo, logWarn } from "../file-logger.js";
|
|
|
12
12
|
import { isAuthorizedTelegramSender } from "../telegram-auth.js";
|
|
13
13
|
import { BaseChannelAdapter } from "../base-adapter.js";
|
|
14
14
|
import { maskString } from "../mask-secrets.js";
|
|
15
|
+
import { formatDetailLines } from "./detail-format.js";
|
|
15
16
|
import { filterTelegramContent, getSafeNotificationLog } from "../telegram-content-filter.js";
|
|
16
17
|
/**
|
|
17
18
|
* Bounded retry for a rejected getUpdates call (409).
|
|
@@ -24,6 +25,86 @@ import { filterTelegramContent, getSafeNotificationLog } from "../telegram-conte
|
|
|
24
25
|
const POLL_RETRY_MAX_ATTEMPTS = 5;
|
|
25
26
|
const POLL_RETRY_BASE_DELAY_MS = 10_000;
|
|
26
27
|
const POLL_RETRY_MAX_DELAY_MS = 120_000;
|
|
28
|
+
/**
|
|
29
|
+
* The status label of an event.
|
|
30
|
+
*
|
|
31
|
+
* Use ASCII labels per AGENTS.md convention - emoji render inconsistently
|
|
32
|
+
* across terminals and break the alignment of the machine readable output.
|
|
33
|
+
*/
|
|
34
|
+
export function telegramStatusLabel(event) {
|
|
35
|
+
const labels = {
|
|
36
|
+
JobStarted: "[START]",
|
|
37
|
+
TaskCompleted: "[OK]",
|
|
38
|
+
TaskFailed: "[FAIL]",
|
|
39
|
+
QuotaPaused: "[PAUSE]",
|
|
40
|
+
ResumeScheduled: "[RESUME]",
|
|
41
|
+
ContextCompacted: "[COMPACT]",
|
|
42
|
+
OutputLimitContinued: "[CONTINUE]",
|
|
43
|
+
E2EFailed: "[TEST]",
|
|
44
|
+
HumanReviewNeeded: "[REVIEW]",
|
|
45
|
+
ReadyForClient: "[DONE]",
|
|
46
|
+
JobCancelled: "[CANCEL]",
|
|
47
|
+
Error: "[ERROR]",
|
|
48
|
+
WaitingForUserInput: "[INPUT]",
|
|
49
|
+
Info: "[INFO]",
|
|
50
|
+
CodexSessionStarted: "[CODEX]",
|
|
51
|
+
CodexPlanDetected: "[PLAN]",
|
|
52
|
+
AssistantResponse: "[TODO]",
|
|
53
|
+
ToolSummary: "[TOOL]",
|
|
54
|
+
};
|
|
55
|
+
return labels[event] ?? "[MSG]";
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Render the Telegram message of a payload.
|
|
59
|
+
*
|
|
60
|
+
* Exported so the rendering can be tested without a Telegram connection: the
|
|
61
|
+
* detail footer must never label a resume trigger as an error.
|
|
62
|
+
*/
|
|
63
|
+
export function buildTelegramMessage(payload) {
|
|
64
|
+
// Mask all fields before rendering - defense in depth
|
|
65
|
+
const maskedTitle = maskString(payload.title);
|
|
66
|
+
const maskedMessage = maskString(payload.message);
|
|
67
|
+
const taskTitle = payload.details?.taskTitle;
|
|
68
|
+
const jobId = payload.details?.jobId;
|
|
69
|
+
const ordinal = payload.details?.ordinal;
|
|
70
|
+
const planPath = payload.details?.planPath;
|
|
71
|
+
const projectRoot = payload.details?.projectRoot;
|
|
72
|
+
const maskedTaskTitle = typeof taskTitle === "string" ? maskString(taskTitle) : undefined;
|
|
73
|
+
const maskedJobId = typeof jobId === "string" ? maskString(jobId) : undefined;
|
|
74
|
+
const maskedProjectRoot = typeof projectRoot === "string" ? maskString(projectRoot) : undefined;
|
|
75
|
+
const maskedPlanPath = typeof planPath === "string" ? maskString(planPath) : undefined;
|
|
76
|
+
// Get hostname for multi-machine identification
|
|
77
|
+
const hostTag = `[${hostname()}]`;
|
|
78
|
+
const label = telegramStatusLabel(payload.event);
|
|
79
|
+
const title = `${label} ${maskedTitle} ${hostTag}`;
|
|
80
|
+
const lines = [title];
|
|
81
|
+
// Add metadata for Codex events
|
|
82
|
+
if (maskedTaskTitle) {
|
|
83
|
+
lines.push("", `Task: ${maskedTaskTitle}`);
|
|
84
|
+
}
|
|
85
|
+
if (maskedProjectRoot) {
|
|
86
|
+
lines.push(`Root: ${maskedProjectRoot}`);
|
|
87
|
+
}
|
|
88
|
+
if (ordinal !== undefined) {
|
|
89
|
+
lines.push(`Ordinal: ${ordinal}`);
|
|
90
|
+
}
|
|
91
|
+
if (maskedPlanPath) {
|
|
92
|
+
lines.push(`Plan: ${maskedPlanPath}`);
|
|
93
|
+
}
|
|
94
|
+
// Add message content (artifact content flows through message)
|
|
95
|
+
if (maskedMessage) {
|
|
96
|
+
lines.push("", maskedMessage);
|
|
97
|
+
}
|
|
98
|
+
if (maskedJobId) {
|
|
99
|
+
lines.push(`Job: ${maskedJobId}`);
|
|
100
|
+
}
|
|
101
|
+
// Detail fields: "Error:" only for real failures, "Reason:" for a trigger.
|
|
102
|
+
for (const detail of formatDetailLines(payload.details, payload.event)) {
|
|
103
|
+
lines.push("", `${detail.label}: ${maskString(detail.value)}`);
|
|
104
|
+
}
|
|
105
|
+
// Final mask pass on the complete rendered string
|
|
106
|
+
return maskString(lines.filter(Boolean).join("\n"));
|
|
107
|
+
}
|
|
27
108
|
export class TelegramAdapter extends BaseChannelAdapter {
|
|
28
109
|
id = "telegram";
|
|
29
110
|
type = "telegram";
|
|
@@ -867,50 +948,7 @@ export class TelegramAdapter extends BaseChannelAdapter {
|
|
|
867
948
|
}
|
|
868
949
|
}
|
|
869
950
|
formatMessage(payload) {
|
|
870
|
-
|
|
871
|
-
const maskedTitle = maskString(payload.title);
|
|
872
|
-
const maskedMessage = maskString(payload.message);
|
|
873
|
-
const taskTitle = payload.details?.taskTitle;
|
|
874
|
-
const jobId = payload.details?.jobId;
|
|
875
|
-
const errorVal = payload.details?.error;
|
|
876
|
-
const ordinal = payload.details?.ordinal;
|
|
877
|
-
const planPath = payload.details?.planPath;
|
|
878
|
-
const projectRoot = payload.details?.projectRoot;
|
|
879
|
-
const maskedTaskTitle = typeof taskTitle === "string" ? maskString(taskTitle) : undefined;
|
|
880
|
-
const maskedJobId = typeof jobId === "string" ? maskString(jobId) : undefined;
|
|
881
|
-
const maskedError = typeof errorVal === "string" ? maskString(errorVal) : undefined;
|
|
882
|
-
const maskedProjectRoot = typeof projectRoot === "string" ? maskString(projectRoot) : undefined;
|
|
883
|
-
const maskedPlanPath = typeof planPath === "string" ? maskString(planPath) : undefined;
|
|
884
|
-
// Get hostname for multi-machine identification
|
|
885
|
-
const hostTag = `[${hostname()}]`;
|
|
886
|
-
const label = this.getStatusLabel(payload.event);
|
|
887
|
-
const title = `${label} ${maskedTitle} ${hostTag}`;
|
|
888
|
-
const lines = [title];
|
|
889
|
-
// Add metadata for Codex events
|
|
890
|
-
if (maskedTaskTitle) {
|
|
891
|
-
lines.push("", `Task: ${maskedTaskTitle}`);
|
|
892
|
-
}
|
|
893
|
-
if (maskedProjectRoot) {
|
|
894
|
-
lines.push(`Root: ${maskedProjectRoot}`);
|
|
895
|
-
}
|
|
896
|
-
if (ordinal !== undefined) {
|
|
897
|
-
lines.push(`Ordinal: ${ordinal}`);
|
|
898
|
-
}
|
|
899
|
-
if (maskedPlanPath) {
|
|
900
|
-
lines.push(`Plan: ${maskedPlanPath}`);
|
|
901
|
-
}
|
|
902
|
-
// Add message content (artifact content flows through message)
|
|
903
|
-
if (maskedMessage) {
|
|
904
|
-
lines.push("", maskedMessage);
|
|
905
|
-
}
|
|
906
|
-
if (maskedJobId) {
|
|
907
|
-
lines.push(`Job: ${maskedJobId}`);
|
|
908
|
-
}
|
|
909
|
-
if (maskedError) {
|
|
910
|
-
lines.push("", `Error: ${maskedError}`);
|
|
911
|
-
}
|
|
912
|
-
// Final mask pass on the complete rendered string
|
|
913
|
-
return maskString(lines.filter(Boolean).join("\n"));
|
|
951
|
+
return buildTelegramMessage(payload);
|
|
914
952
|
}
|
|
915
953
|
/**
|
|
916
954
|
* Split long messages into ordered chunks for Telegram.
|
|
@@ -943,29 +981,7 @@ export class TelegramAdapter extends BaseChannelAdapter {
|
|
|
943
981
|
return chunks;
|
|
944
982
|
}
|
|
945
983
|
getStatusLabel(event) {
|
|
946
|
-
|
|
947
|
-
// Avoid emoji which renders inconsistently across terminals
|
|
948
|
-
const labels = {
|
|
949
|
-
JobStarted: "[START]",
|
|
950
|
-
TaskCompleted: "[OK]",
|
|
951
|
-
TaskFailed: "[FAIL]",
|
|
952
|
-
QuotaPaused: "[PAUSE]",
|
|
953
|
-
ResumeScheduled: "[RESUME]",
|
|
954
|
-
ContextCompacted: "[COMPACT]",
|
|
955
|
-
OutputLimitContinued: "[CONTINUE]",
|
|
956
|
-
E2EFailed: "[TEST]",
|
|
957
|
-
HumanReviewNeeded: "[REVIEW]",
|
|
958
|
-
ReadyForClient: "[DONE]",
|
|
959
|
-
JobCancelled: "[CANCEL]",
|
|
960
|
-
Error: "[ERROR]",
|
|
961
|
-
WaitingForUserInput: "[INPUT]",
|
|
962
|
-
Info: "[INFO]",
|
|
963
|
-
CodexSessionStarted: "[CODEX]",
|
|
964
|
-
CodexPlanDetected: "[PLAN]",
|
|
965
|
-
AssistantResponse: "[TODO]",
|
|
966
|
-
ToolSummary: "[TOOL]",
|
|
967
|
-
};
|
|
968
|
-
return labels[event] ?? "[MSG]";
|
|
984
|
+
return telegramStatusLabel(event);
|
|
969
985
|
}
|
|
970
986
|
}
|
|
971
987
|
//# sourceMappingURL=telegram-adapter.js.map
|