pi-harness-runtime 1.1.160 → 1.1.162
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/harness/telegram-auth.ts +150 -0
- package/harness/telegram-content-filter.ts +223 -0
- 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/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/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/telegram-adapter.d.ts.map +1 -1
- package/packages/notification/dist/adapters/telegram-adapter.js +20 -9
- package/packages/notification/dist/adapters/telegram-adapter.js.map +1 -1
- package/packages/notification/dist/index.d.ts +1 -0
- package/packages/notification/dist/index.d.ts.map +1 -1
- package/packages/notification/dist/index.js +1 -0
- package/packages/notification/dist/index.js.map +1 -1
- package/packages/notification/dist/mask-secrets.d.ts +31 -0
- package/packages/notification/dist/mask-secrets.d.ts.map +1 -0
- package/packages/notification/dist/mask-secrets.js +141 -0
- package/packages/notification/dist/mask-secrets.js.map +1 -0
- package/packages/notification/package.json +1 -1
- package/packages/notification/src/adapters/telegram-adapter.ts +22 -9
- package/packages/notification/src/index.ts +7 -0
- package/packages/notification/src/mask-secrets.ts +160 -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/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
- package/scripts/telegram-webhook-server.ts +85 -6
- package/scripts/tsconfig.json +9 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secret Masking Utility
|
|
3
|
+
*
|
|
4
|
+
* Masks sensitive values in strings before sending to Telegram/other channels.
|
|
5
|
+
* Shows first 4 + last 4 characters for identification.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Patterns that match sensitive values
|
|
10
|
+
*/
|
|
11
|
+
const SENSITIVE_PATTERNS: RegExp[] = [
|
|
12
|
+
// Telegram bot tokens: format is \d+:[-A-Za-z0-9_]{35,}
|
|
13
|
+
/\d+:[-A-Za-z0-9_]{35,}/g,
|
|
14
|
+
// Generic API keys, tokens, secrets
|
|
15
|
+
/[a-zA-Z0-9_-]{32,}/g, // Long alphanumeric strings (likely keys)
|
|
16
|
+
/[A-Fa-f0-9]{32,}/g, // Hex strings (likely hashes/keys)
|
|
17
|
+
/sk-[a-zA-Z0-9]{20,}/g, // OpenAI-style keys
|
|
18
|
+
/Bearer\s+[a-zA-Z0-9_-]{20,}/gi, // Bearer tokens
|
|
19
|
+
/token[=:]\s*[a-zA-Z0-9_-]{20,}/gi, // token=xxx patterns
|
|
20
|
+
/secret[=:]\s*[a-zA-Z0-9_-]{20,}/gi, // secret=xxx patterns
|
|
21
|
+
/key[=:]\s*[a-zA-Z0-9_-]{20,}/gi, // key=xxx patterns
|
|
22
|
+
/password[=:]\s*[^\s,}]+/gi, // password=xxx patterns
|
|
23
|
+
/client[_-]?secret[=:]\s*[^\s,}]+/gi, // client_secret=xxx
|
|
24
|
+
/client[_-]?id[=:]\s*[a-zA-Z0-9_-]{20,}/gi, // client_id=xxx
|
|
25
|
+
/infisical[_-]?(client[_-])?(secret|id)[=:]\s*[a-zA-Z0-9_-]{20,}/gi,
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
// Specific Infisical field names to mask
|
|
29
|
+
const INFISICAL_FIELDS = [
|
|
30
|
+
"infisical_client_secret",
|
|
31
|
+
"infisical_client_id",
|
|
32
|
+
"infisical_project_id",
|
|
33
|
+
"INFISICAL_CLIENT_SECRET",
|
|
34
|
+
"INFISICAL_CLIENT_ID",
|
|
35
|
+
"INFISICAL_PROJECT_ID",
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
// General sensitive field patterns
|
|
39
|
+
const SENSITIVE_FIELD_PATTERNS = [
|
|
40
|
+
/_api_key$/i,
|
|
41
|
+
/_secret$/i,
|
|
42
|
+
/_token$/i,
|
|
43
|
+
/_password$/i,
|
|
44
|
+
/_credential$/i,
|
|
45
|
+
/_auth$/i,
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Mask a value showing first and last characters
|
|
50
|
+
*/
|
|
51
|
+
export function maskValue(value: string): string {
|
|
52
|
+
// Telegram bot tokens use the format \d+:[-A-Za-z0-9_]{35,}
|
|
53
|
+
// Mask these completely - no prefix/suffix preserved
|
|
54
|
+
if (/^\d+:[-A-Za-z0-9_]+$/.test(value)) {
|
|
55
|
+
return "[REDACTED]";
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// For other values, show first 4 + last 4
|
|
59
|
+
if (!value || value.length <= 8) {
|
|
60
|
+
return "****";
|
|
61
|
+
}
|
|
62
|
+
return `${value.slice(0, 4)}...${value.slice(-4)}`;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Check if a field name is sensitive
|
|
67
|
+
*/
|
|
68
|
+
export function isSensitiveField(fieldName: string): boolean {
|
|
69
|
+
const lower = fieldName.toLowerCase();
|
|
70
|
+
|
|
71
|
+
// Check specific Infisical fields
|
|
72
|
+
if (INFISICAL_FIELDS.some(f => lower === f.toLowerCase())) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Check general patterns
|
|
77
|
+
return SENSITIVE_FIELD_PATTERNS.some(pattern => pattern.test(lower));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Mask a string value
|
|
82
|
+
*/
|
|
83
|
+
function maskStringValue(input: string): string {
|
|
84
|
+
let result = input;
|
|
85
|
+
|
|
86
|
+
// First, mask any field=value patterns for sensitive fields
|
|
87
|
+
for (const field of INFISICAL_FIELDS) {
|
|
88
|
+
const escapedField = field.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
89
|
+
const pattern = new RegExp(`(${escapedField})\\s*[=:]\\s*([a-zA-Z0-9_-]+)`, "gi");
|
|
90
|
+
result = result.replace(pattern, (_match, _field, value) => `${field}: ${maskValue(value)}`);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Then mask generic patterns
|
|
94
|
+
for (const pattern of SENSITIVE_PATTERNS) {
|
|
95
|
+
result = result.replace(pattern, (match) => maskValue(match));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Mask sensitive patterns in a string
|
|
103
|
+
*/
|
|
104
|
+
export function maskString(input: string): string {
|
|
105
|
+
return maskStringValue(input);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Mask JSON object fields that are sensitive
|
|
110
|
+
*/
|
|
111
|
+
export function maskObject(obj: unknown, depth: number = 0): Record<string, unknown> | unknown[] | string | number | boolean | null {
|
|
112
|
+
// Prevent infinite recursion
|
|
113
|
+
if (depth > 10 || obj === null || obj === undefined) {
|
|
114
|
+
return obj as null;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (typeof obj === "string") {
|
|
118
|
+
return maskStringValue(obj);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (typeof obj === "number" || typeof obj === "boolean") {
|
|
122
|
+
return obj;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (Array.isArray(obj)) {
|
|
126
|
+
return obj.map(item => maskObject(item, depth + 1));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (typeof obj === "object") {
|
|
130
|
+
const result: Record<string, unknown> = {};
|
|
131
|
+
for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {
|
|
132
|
+
if (isSensitiveField(key)) {
|
|
133
|
+
result[key] = typeof value === "string" ? maskValue(value) : value;
|
|
134
|
+
} else {
|
|
135
|
+
result[key] = maskObject(value, depth + 1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return result as Record<string, unknown>;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// SAFETY: obj is one of the primitive types at this point
|
|
142
|
+
return obj as unknown as (Record<string, unknown> | unknown[] | string | number | boolean | null);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Mask a message/notification payload
|
|
147
|
+
*/
|
|
148
|
+
export function maskPayload(obj: unknown): Record<string, unknown> | unknown[] | string | number | boolean | null {
|
|
149
|
+
return maskObject(obj);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Format a value for display, masking if sensitive
|
|
154
|
+
*/
|
|
155
|
+
export function formatValue(key: string, value: unknown): string {
|
|
156
|
+
if (isSensitiveField(key) && typeof value === "string") {
|
|
157
|
+
return `${key}: ${maskValue(value)}`;
|
|
158
|
+
}
|
|
159
|
+
return `${key}: ${value}`;
|
|
160
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-harness/provider-router",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.162",
|
|
4
4
|
"description": "Enhanced Provider Router for pi-harness-runtime — intelligent routing with capabilities, costs, and quotas",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/provider-router.js",
|