pi-harness-runtime 1.1.147 β 1.1.150
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/CHANGELOG.md +2 -0
- package/index.ts +41 -26
- package/package.json +3 -2
- package/packages/a2a-adapter/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/context-compiler/package.json +1 -1
- package/packages/context-discovery/package.json +1 -1
- package/packages/context-manager/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/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-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/dist/src/extension.js +186 -0
- 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/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/email-adapter.d.ts +17 -0
- package/packages/notification/dist/adapters/email-adapter.d.ts.map +1 -0
- package/packages/notification/dist/adapters/email-adapter.js +89 -0
- package/packages/notification/dist/adapters/email-adapter.js.map +1 -0
- package/packages/notification/dist/adapters/line-adapter.d.ts +17 -0
- package/packages/notification/dist/adapters/line-adapter.d.ts.map +1 -0
- package/packages/notification/dist/adapters/line-adapter.js +99 -0
- package/packages/notification/dist/adapters/line-adapter.js.map +1 -0
- package/packages/notification/dist/adapters/ntfy-adapter.d.ts +17 -0
- package/packages/notification/dist/adapters/ntfy-adapter.d.ts.map +1 -0
- package/packages/notification/dist/adapters/ntfy-adapter.js +84 -0
- package/packages/notification/dist/adapters/ntfy-adapter.js.map +1 -0
- package/packages/notification/dist/adapters/telegram-adapter.d.ts +56 -0
- package/packages/notification/dist/adapters/telegram-adapter.d.ts.map +1 -0
- package/packages/notification/dist/adapters/telegram-adapter.js +251 -0
- package/packages/notification/dist/adapters/telegram-adapter.js.map +1 -0
- package/packages/notification/dist/adapters/webhook-adapter.d.ts +15 -0
- package/packages/notification/dist/adapters/webhook-adapter.d.ts.map +1 -0
- package/packages/notification/dist/adapters/webhook-adapter.js +64 -0
- package/packages/notification/dist/adapters/webhook-adapter.js.map +1 -0
- package/packages/notification/dist/base-adapter.d.ts +36 -0
- package/packages/notification/dist/base-adapter.d.ts.map +1 -0
- package/packages/notification/dist/base-adapter.js +39 -0
- package/packages/notification/dist/base-adapter.js.map +1 -0
- package/packages/notification/dist/index.d.ts +12 -0
- package/packages/notification/dist/index.d.ts.map +1 -0
- package/packages/notification/dist/index.js +12 -0
- package/packages/notification/dist/index.js.map +1 -0
- package/packages/notification/dist/notification-center.d.ts +89 -0
- package/packages/notification/dist/notification-center.d.ts.map +1 -0
- package/packages/notification/dist/notification-center.js +356 -0
- package/packages/notification/dist/notification-center.js.map +1 -0
- package/packages/notification/dist/notification-policy.d.ts +66 -0
- package/packages/notification/dist/notification-policy.d.ts.map +1 -0
- package/packages/notification/dist/notification-policy.js +153 -0
- package/packages/notification/dist/notification-policy.js.map +1 -0
- package/packages/notification/dist/telegram-webhook-handler.d.ts +86 -0
- package/packages/notification/dist/telegram-webhook-handler.d.ts.map +1 -0
- package/packages/notification/dist/telegram-webhook-handler.js +149 -0
- package/packages/notification/dist/telegram-webhook-handler.js.map +1 -0
- package/packages/notification/dist/types.d.ts +106 -0
- package/packages/notification/dist/types.d.ts.map +1 -0
- package/packages/notification/dist/types.js +7 -0
- package/packages/notification/dist/types.js.map +1 -0
- package/packages/notification/package.json +1 -1
- 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/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/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/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/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
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
// src/extension.ts
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
var DEBUG_LOG = "/tmp/file-copy-helper-debug.log";
|
|
4
|
+
function debugLog(label, data) {
|
|
5
|
+
const timestamp = new Date().toISOString();
|
|
6
|
+
const entry = `[${timestamp}] ${label}: ${JSON.stringify(data, null, 2)}
|
|
7
|
+
`;
|
|
8
|
+
fs.appendFileSync(DEBUG_LOG, entry);
|
|
9
|
+
}
|
|
10
|
+
var COPY_KEYWORDS = ["mimic", "replicate", "clone"];
|
|
11
|
+
var COPY_DEST_CONTEXT = ["to ", "into ", "/dest/", "/target/", "over to"];
|
|
12
|
+
var COPY_SOURCE_CONTEXT = ["from ", "source", "/source/", "orig"];
|
|
13
|
+
var IMPORT_ERROR_TRIGGERS = [
|
|
14
|
+
"cannot find module",
|
|
15
|
+
"cannot resolve module",
|
|
16
|
+
"module not found",
|
|
17
|
+
"missing import"
|
|
18
|
+
];
|
|
19
|
+
var COPY_CONTEXT = [
|
|
20
|
+
"sudo cp",
|
|
21
|
+
" cp ",
|
|
22
|
+
" cp\t",
|
|
23
|
+
"\bcps+-r",
|
|
24
|
+
"\bmimic\b",
|
|
25
|
+
"\bclone\b",
|
|
26
|
+
"\breplicate\b",
|
|
27
|
+
"\bdeploy\b"
|
|
28
|
+
];
|
|
29
|
+
var COPY_RULE = `
|
|
30
|
+
## COPY FILES DIRECTLY (CRITICAL)
|
|
31
|
+
|
|
32
|
+
When asked to mimic, copy, clone, or replicate files:
|
|
33
|
+
|
|
34
|
+
1. **DO NOT read the source files** - just copy them directly
|
|
35
|
+
2. **Run \`sudo cp\` immediately** - no reading needed
|
|
36
|
+
3. **If files have different owners**, use sudo
|
|
37
|
+
|
|
38
|
+
Examples:
|
|
39
|
+
\`\`\`bash
|
|
40
|
+
# Copy single file
|
|
41
|
+
sudo cp /source/file.ts /dest/file.ts
|
|
42
|
+
|
|
43
|
+
# Copy entire folder
|
|
44
|
+
sudo cp -r /source/folder/ /dest/folder/
|
|
45
|
+
|
|
46
|
+
# Copy matching pattern
|
|
47
|
+
sudo cp /source/*.tsx /dest/
|
|
48
|
+
\`\`\`
|
|
49
|
+
|
|
50
|
+
**STOP**: Do NOT use \`read\`, \`expand\`, or \`cat\` on source files. Just copy.
|
|
51
|
+
|
|
52
|
+
**Why**: Reading wastes time. The source files are complete - copying preserves everything exactly.
|
|
53
|
+
`;
|
|
54
|
+
var IMPORT_ERROR_RULE = `
|
|
55
|
+
## IMPORT ERRORS? COPY THOSE FILES TOO!
|
|
56
|
+
|
|
57
|
+
When you see import/module errors after copying a file:
|
|
58
|
+
|
|
59
|
+
1. **STOP fixing imports one by one**
|
|
60
|
+
2. **STOP rolling back**
|
|
61
|
+
3. **LIST all missing import files** for the user
|
|
62
|
+
4. **Ask user which to copy**, then copy them via sudo cp
|
|
63
|
+
|
|
64
|
+
Example:
|
|
65
|
+
\`\`\`bash
|
|
66
|
+
# If error shows missing:
|
|
67
|
+
# - @repo/auth/server
|
|
68
|
+
# - @repo/design-system/components/ui/sidebar
|
|
69
|
+
# - ./components/notifications-provider
|
|
70
|
+
|
|
71
|
+
# Then copy these files the same way:
|
|
72
|
+
sudo cp /source/path/@repo/auth/server.ts /dest/path/@repo/auth/server.ts
|
|
73
|
+
sudo cp -r /source/path/@repo/design-system/components/ui/sidebar /dest/path/@repo/design-system/components/ui/sidebar
|
|
74
|
+
sudo cp /source/path/components/notifications-provider.tsx /dest/path/components/notifications-provider.tsx
|
|
75
|
+
\`\`\`
|
|
76
|
+
|
|
77
|
+
**NEVER fix imports one by one** - copy the missing files instead!
|
|
78
|
+
**NEVER roll back** - keep the copied file and copy its dependencies!
|
|
79
|
+
`;
|
|
80
|
+
function shouldInjectCopyRule(text) {
|
|
81
|
+
const lower = text.toLowerCase();
|
|
82
|
+
const hasIntent = COPY_KEYWORDS.some((keyword) => lower.includes(keyword));
|
|
83
|
+
if (!hasIntent) {
|
|
84
|
+
return {
|
|
85
|
+
triggered: false,
|
|
86
|
+
reason: `No intent keyword found. Keywords: ${COPY_KEYWORDS.join(", ")}`
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const hasDest = COPY_DEST_CONTEXT.some((ctx) => lower.includes(ctx));
|
|
90
|
+
if (!hasDest) {
|
|
91
|
+
return {
|
|
92
|
+
triggered: false,
|
|
93
|
+
reason: `No destination context found. Dest contexts: ${COPY_DEST_CONTEXT.join(", ")}`
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const hasSource = COPY_SOURCE_CONTEXT.some((ctx) => lower.includes(ctx));
|
|
97
|
+
if (!hasSource) {
|
|
98
|
+
return {
|
|
99
|
+
triggered: false,
|
|
100
|
+
reason: `No source context found. Source contexts: ${COPY_SOURCE_CONTEXT.join(", ")}`
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
triggered: true,
|
|
105
|
+
reason: `All conditions met: hasIntent=${hasIntent}, hasDest=${hasDest}, hasSource=${hasSource}`
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function shouldInjectImportErrorRule(text) {
|
|
109
|
+
const lower = text.toLowerCase();
|
|
110
|
+
const hasImportError = IMPORT_ERROR_TRIGGERS.some((t) => lower.includes(t));
|
|
111
|
+
if (!hasImportError) {
|
|
112
|
+
return { triggered: false, reason: "No import error triggers found" };
|
|
113
|
+
}
|
|
114
|
+
const hasCopyContext = COPY_CONTEXT.some((ctx) => lower.includes(ctx));
|
|
115
|
+
if (!hasCopyContext) {
|
|
116
|
+
return { triggered: false, reason: "No copy/deploy intent found" };
|
|
117
|
+
}
|
|
118
|
+
return { triggered: true, reason: "Has import error + copy intent" };
|
|
119
|
+
}
|
|
120
|
+
function registerFileCopyHelper(pi) {
|
|
121
|
+
fs.writeFileSync(DEBUG_LOG, `[${new Date().toISOString()}] === DEBUG SESSION STARTED ===
|
|
122
|
+
`);
|
|
123
|
+
pi.on("input", (event) => {
|
|
124
|
+
debugLog("INPUT_EVENT", {
|
|
125
|
+
source: event.source,
|
|
126
|
+
textLength: event.text?.length,
|
|
127
|
+
textPreview: event.text?.substring(0, 200),
|
|
128
|
+
fullText: event.text
|
|
129
|
+
});
|
|
130
|
+
if (event.source !== "interactive") {
|
|
131
|
+
debugLog("SKIP", "not interactive input - skipping");
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const text = event.text.trim();
|
|
135
|
+
debugLog("PROCESSING_TEXT", {
|
|
136
|
+
text,
|
|
137
|
+
length: text.length,
|
|
138
|
+
hasMinLength: text.length >= 10
|
|
139
|
+
});
|
|
140
|
+
if (!text || text.length < 10) {
|
|
141
|
+
debugLog("SKIP", "text too short (< 10 chars)");
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const copyCheck = shouldInjectCopyRule(text);
|
|
145
|
+
debugLog("COPY_RULE_CHECK", {
|
|
146
|
+
triggered: copyCheck.triggered,
|
|
147
|
+
reason: copyCheck.reason,
|
|
148
|
+
matchingKeywords: COPY_KEYWORDS.filter((k) => text.toLowerCase().includes(k)),
|
|
149
|
+
matchingDest: COPY_DEST_CONTEXT.filter((ctx) => text.toLowerCase().includes(ctx)),
|
|
150
|
+
matchingSource: COPY_SOURCE_CONTEXT.filter((ctx) => text.toLowerCase().includes(ctx))
|
|
151
|
+
});
|
|
152
|
+
if (copyCheck.triggered) {
|
|
153
|
+
debugLog("INJECT", { rule: "COPY_RULE", reason: copyCheck.reason });
|
|
154
|
+
return {
|
|
155
|
+
action: "transform",
|
|
156
|
+
text: text + COPY_RULE
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const importCheck = shouldInjectImportErrorRule(text);
|
|
160
|
+
debugLog("IMPORT_ERROR_CHECK", {
|
|
161
|
+
triggered: importCheck.triggered,
|
|
162
|
+
reason: importCheck.reason,
|
|
163
|
+
hasImportError: IMPORT_ERROR_TRIGGERS.some((t) => text.toLowerCase().includes(t)),
|
|
164
|
+
hasCopyContext: COPY_CONTEXT.some((ctx) => text.toLowerCase().includes(ctx))
|
|
165
|
+
});
|
|
166
|
+
if (importCheck.triggered) {
|
|
167
|
+
debugLog("INJECT", {
|
|
168
|
+
rule: "IMPORT_ERROR_RULE",
|
|
169
|
+
reason: importCheck.reason
|
|
170
|
+
});
|
|
171
|
+
return {
|
|
172
|
+
action: "transform",
|
|
173
|
+
text: text + IMPORT_ERROR_RULE
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
debugLog("NO_INJECTION", "no rule matched - passing through");
|
|
177
|
+
return;
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
function fileCopyHelperExtension(pi) {
|
|
181
|
+
registerFileCopyHelper(pi);
|
|
182
|
+
}
|
|
183
|
+
export {
|
|
184
|
+
registerFileCopyHelper,
|
|
185
|
+
fileCopyHelperExtension as default
|
|
186
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email Adapter β RFC-0022
|
|
3
|
+
*
|
|
4
|
+
* Sends notifications via SMTP.
|
|
5
|
+
*/
|
|
6
|
+
import type { NotificationPayload, NotificationResult, EmailConfig } from "../types.js";
|
|
7
|
+
import { BaseChannelAdapter } from "../base-adapter.js";
|
|
8
|
+
export declare class EmailAdapter extends BaseChannelAdapter {
|
|
9
|
+
readonly id = "email";
|
|
10
|
+
readonly type = "email";
|
|
11
|
+
constructor(config: EmailConfig);
|
|
12
|
+
initialize(): Promise<boolean>;
|
|
13
|
+
send(payload: NotificationPayload): Promise<NotificationResult>;
|
|
14
|
+
private formatBody;
|
|
15
|
+
private getEmoji;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=email-adapter.d.ts.map
|
|
@@ -0,0 +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;AA0BxD,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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email Adapter β RFC-0022
|
|
3
|
+
*
|
|
4
|
+
* Sends notifications via SMTP.
|
|
5
|
+
*/
|
|
6
|
+
import { BaseChannelAdapter } from "../base-adapter.js";
|
|
7
|
+
// Simple SMTP client using built-in net module
|
|
8
|
+
async function sendSmtpEmail(host, port, user, password, from, to, subject, body, tls = false) {
|
|
9
|
+
// For a production implementation, you'd use a proper SMTP library
|
|
10
|
+
// This is a placeholder that logs the email
|
|
11
|
+
console.log(`[Email] Would send to ${to.join(", ")}`);
|
|
12
|
+
console.log(`[Email] Subject: ${subject}`);
|
|
13
|
+
console.log(`[Email] Body: ${body}`);
|
|
14
|
+
// In practice, you'd use something like:
|
|
15
|
+
// import { createClient } from "nodemailer";
|
|
16
|
+
// const transporter = nodemailer.createTransport({ ... });
|
|
17
|
+
// await transporter.sendMail({ ... });
|
|
18
|
+
}
|
|
19
|
+
export class EmailAdapter extends BaseChannelAdapter {
|
|
20
|
+
id = "email";
|
|
21
|
+
type = "email";
|
|
22
|
+
constructor(config) {
|
|
23
|
+
super({ id: "email", type: "email", enabled: true, config });
|
|
24
|
+
}
|
|
25
|
+
async initialize() {
|
|
26
|
+
// Verify SMTP connection
|
|
27
|
+
try {
|
|
28
|
+
const cfg = this.config.config;
|
|
29
|
+
// In production, verify SMTP credentials
|
|
30
|
+
return Boolean(cfg.smtpHost && cfg.smtpUser && cfg.from && cfg.to.length > 0);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async send(payload) {
|
|
37
|
+
try {
|
|
38
|
+
const cfg = this.config.config;
|
|
39
|
+
const subject = `${this.getEmoji(payload.event)} ${payload.title}`;
|
|
40
|
+
const body = this.formatBody(payload);
|
|
41
|
+
await sendSmtpEmail(cfg.smtpHost, cfg.smtpPort, cfg.smtpUser, cfg.smtpPassword, cfg.from, cfg.to, subject, body, cfg.tls);
|
|
42
|
+
return { success: true, channel: this.id };
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
return {
|
|
46
|
+
success: false,
|
|
47
|
+
channel: this.id,
|
|
48
|
+
error: String(error),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
formatBody(payload) {
|
|
53
|
+
const lines = [
|
|
54
|
+
payload.message,
|
|
55
|
+
"",
|
|
56
|
+
"---",
|
|
57
|
+
`Event: ${payload.event}`,
|
|
58
|
+
`Time: ${payload.timestamp}`,
|
|
59
|
+
];
|
|
60
|
+
if (payload.details?.taskTitle) {
|
|
61
|
+
lines.push(`Task: ${payload.details.taskTitle}`);
|
|
62
|
+
}
|
|
63
|
+
if (payload.details?.jobId) {
|
|
64
|
+
lines.push(`Job ID: ${payload.details.jobId}`);
|
|
65
|
+
}
|
|
66
|
+
if (payload.details?.error) {
|
|
67
|
+
lines.push("", `Error: ${payload.details.error}`);
|
|
68
|
+
}
|
|
69
|
+
return lines.join("\n");
|
|
70
|
+
}
|
|
71
|
+
getEmoji(event) {
|
|
72
|
+
const map = {
|
|
73
|
+
JobStarted: "[π]",
|
|
74
|
+
TaskCompleted: "[β
]",
|
|
75
|
+
TaskFailed: "[β]",
|
|
76
|
+
QuotaPaused: "[βΈ]",
|
|
77
|
+
ResumeScheduled: "[βΆ]",
|
|
78
|
+
ContextCompacted: "[π¦]",
|
|
79
|
+
OutputLimitContinued: "[π]",
|
|
80
|
+
E2EFailed: "[π§ͺ]",
|
|
81
|
+
HumanReviewNeeded: "[π€]",
|
|
82
|
+
ReadyForClient: "[π]",
|
|
83
|
+
JobCancelled: "[π«]",
|
|
84
|
+
Error: "[β ]",
|
|
85
|
+
};
|
|
86
|
+
return map[event] ?? "[π’]";
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=email-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-adapter.js","sourceRoot":"","sources":["../../src/adapters/email-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LINE Adapter β RFC-0022
|
|
3
|
+
*
|
|
4
|
+
* Sends notifications via LINE Messaging API.
|
|
5
|
+
*/
|
|
6
|
+
import type { NotificationPayload, NotificationResult, LineConfig } from "../types.js";
|
|
7
|
+
import { BaseChannelAdapter } from "../base-adapter.js";
|
|
8
|
+
export declare class LineAdapter extends BaseChannelAdapter {
|
|
9
|
+
readonly id = "line";
|
|
10
|
+
readonly type = "line";
|
|
11
|
+
constructor(config: LineConfig);
|
|
12
|
+
initialize(): Promise<boolean>;
|
|
13
|
+
send(payload: NotificationPayload): Promise<NotificationResult>;
|
|
14
|
+
private formatMessage;
|
|
15
|
+
private getEmoji;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=line-adapter.d.ts.map
|
|
@@ -0,0 +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;AAExD,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,CAgBnC;IAEK,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0CpE;IAED,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,QAAQ;CAiBhB"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LINE Adapter β RFC-0022
|
|
3
|
+
*
|
|
4
|
+
* Sends notifications via LINE Messaging API.
|
|
5
|
+
*/
|
|
6
|
+
import { BaseChannelAdapter } from "../base-adapter.js";
|
|
7
|
+
export class LineAdapter extends BaseChannelAdapter {
|
|
8
|
+
id = "line";
|
|
9
|
+
type = "line";
|
|
10
|
+
constructor(config) {
|
|
11
|
+
super({ id: "line", type: "line", enabled: true, config });
|
|
12
|
+
}
|
|
13
|
+
async initialize() {
|
|
14
|
+
try {
|
|
15
|
+
const cfg = this.config.config;
|
|
16
|
+
// Verify access token by getting profile
|
|
17
|
+
const response = await fetch("https://api.line.me/v2/bot/profile", {
|
|
18
|
+
headers: {
|
|
19
|
+
Authorization: `Bearer ${cfg.channelAccessToken}`,
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
return response.ok;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async send(payload) {
|
|
29
|
+
try {
|
|
30
|
+
const cfg = this.config.config;
|
|
31
|
+
const message = this.formatMessage(payload);
|
|
32
|
+
const response = await fetch("https://api.line.me/v2/bot/message/push", {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: {
|
|
35
|
+
"Content-Type": "application/json",
|
|
36
|
+
Authorization: `Bearer ${cfg.channelAccessToken}`,
|
|
37
|
+
},
|
|
38
|
+
body: JSON.stringify({
|
|
39
|
+
to: cfg.userId,
|
|
40
|
+
messages: [
|
|
41
|
+
{
|
|
42
|
+
type: "text",
|
|
43
|
+
text: message,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
}),
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
const error = await response.text();
|
|
50
|
+
return {
|
|
51
|
+
success: false,
|
|
52
|
+
channel: this.id,
|
|
53
|
+
error: `LINE API error: ${error}`,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return { success: true, channel: this.id };
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
channel: this.id,
|
|
62
|
+
error: String(error),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
formatMessage(payload) {
|
|
67
|
+
const emoji = this.getEmoji(payload.event);
|
|
68
|
+
const title = `${emoji} ${payload.title}`;
|
|
69
|
+
const lines = [title, "", payload.message];
|
|
70
|
+
if (payload.details?.taskTitle) {
|
|
71
|
+
lines.push("", `Task: ${payload.details.taskTitle}`);
|
|
72
|
+
}
|
|
73
|
+
if (payload.details?.jobId) {
|
|
74
|
+
lines.push(`Job: ${payload.details.jobId}`);
|
|
75
|
+
}
|
|
76
|
+
if (payload.details?.error) {
|
|
77
|
+
lines.push("", `Error: ${payload.details.error}`);
|
|
78
|
+
}
|
|
79
|
+
return lines.filter(Boolean).join("\n");
|
|
80
|
+
}
|
|
81
|
+
getEmoji(event) {
|
|
82
|
+
const map = {
|
|
83
|
+
JobStarted: "π",
|
|
84
|
+
TaskCompleted: "β
",
|
|
85
|
+
TaskFailed: "β",
|
|
86
|
+
QuotaPaused: "βΈοΈ",
|
|
87
|
+
ResumeScheduled: "βΆοΈ",
|
|
88
|
+
ContextCompacted: "π¦",
|
|
89
|
+
OutputLimitContinued: "π",
|
|
90
|
+
E2EFailed: "π§ͺ",
|
|
91
|
+
HumanReviewNeeded: "π€",
|
|
92
|
+
ReadyForClient: "π",
|
|
93
|
+
JobCancelled: "π«",
|
|
94
|
+
Error: "β οΈ",
|
|
95
|
+
};
|
|
96
|
+
return map[event] ?? "π’";
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=line-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-adapter.js","sourceRoot":"","sources":["../../src/adapters/line-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ntfy Adapter β RFC-0022
|
|
3
|
+
*
|
|
4
|
+
* Sends notifications via ntfy.sh (or self-hosted ntfy server).
|
|
5
|
+
*/
|
|
6
|
+
import type { NotificationPayload, NotificationResult, NtfyConfig } from "../types.js";
|
|
7
|
+
import { BaseChannelAdapter } from "../base-adapter.js";
|
|
8
|
+
export declare class NtfyAdapter extends BaseChannelAdapter {
|
|
9
|
+
readonly id = "ntfy";
|
|
10
|
+
readonly type = "ntfy";
|
|
11
|
+
constructor(config: NtfyConfig);
|
|
12
|
+
initialize(): Promise<boolean>;
|
|
13
|
+
send(payload: NotificationPayload): Promise<NotificationResult>;
|
|
14
|
+
private formatMessage;
|
|
15
|
+
private getTags;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ntfy-adapter.d.ts.map
|
|
@@ -0,0 +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;AAExD,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"}
|