@symerian/symi 3.0.18 → 3.0.19
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/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/package.json +1 -1
- package/extensions/copilot-proxy/README.md +0 -24
- package/extensions/copilot-proxy/index.ts +0 -154
- package/extensions/copilot-proxy/node_modules/.bin/symi +0 -21
- package/extensions/copilot-proxy/package.json +0 -15
- package/extensions/copilot-proxy/symi.plugin.json +0 -9
- package/extensions/device-pair/index.ts +0 -642
- package/extensions/device-pair/symi.plugin.json +0 -20
- package/extensions/diagnostics-otel/index.ts +0 -15
- package/extensions/diagnostics-otel/node_modules/.bin/acorn +0 -21
- package/extensions/diagnostics-otel/node_modules/.bin/symi +0 -21
- package/extensions/diagnostics-otel/package.json +0 -27
- package/extensions/diagnostics-otel/src/service.test.ts +0 -290
- package/extensions/diagnostics-otel/src/service.ts +0 -666
- package/extensions/diagnostics-otel/symi.plugin.json +0 -8
- package/extensions/google-antigravity-auth/README.md +0 -24
- package/extensions/google-antigravity-auth/index.ts +0 -424
- package/extensions/google-antigravity-auth/node_modules/.bin/symi +0 -21
- package/extensions/google-antigravity-auth/package.json +0 -15
- package/extensions/google-antigravity-auth/symi.plugin.json +0 -9
- package/extensions/google-gemini-cli-auth/README.md +0 -35
- package/extensions/google-gemini-cli-auth/index.ts +0 -75
- package/extensions/google-gemini-cli-auth/node_modules/.bin/symi +0 -21
- package/extensions/google-gemini-cli-auth/oauth.test.ts +0 -162
- package/extensions/google-gemini-cli-auth/oauth.ts +0 -636
- package/extensions/google-gemini-cli-auth/package.json +0 -15
- package/extensions/google-gemini-cli-auth/symi.plugin.json +0 -9
- package/extensions/learning-loop/index.ts +0 -159
- package/extensions/learning-loop/node_modules/.bin/symi +0 -21
- package/extensions/learning-loop/package.json +0 -18
- package/extensions/learning-loop/src/analytics/gateway-methods.ts +0 -230
- package/extensions/learning-loop/src/analytics/metrics-aggregator.ts +0 -153
- package/extensions/learning-loop/src/capture/run-tracker.ts +0 -181
- package/extensions/learning-loop/src/capture/serializer.ts +0 -74
- package/extensions/learning-loop/src/db.ts +0 -583
- package/extensions/learning-loop/src/feedback/explicit-feedback.ts +0 -58
- package/extensions/learning-loop/src/feedback/implicit-signals.ts +0 -89
- package/extensions/learning-loop/src/graph/edge-inference.ts +0 -189
- package/extensions/learning-loop/src/graph/graph-retrieval.ts +0 -144
- package/extensions/learning-loop/src/graph/graph-store.ts +0 -183
- package/extensions/learning-loop/src/hooks.ts +0 -244
- package/extensions/learning-loop/src/injection/cache.ts +0 -73
- package/extensions/learning-loop/src/injection/context-injector.ts +0 -104
- package/extensions/learning-loop/src/injection/prompt-builder.ts +0 -43
- package/extensions/learning-loop/src/learning/embedding-bridge.ts +0 -54
- package/extensions/learning-loop/src/learning/learning-extractor.ts +0 -217
- package/extensions/learning-loop/src/learning/learning-store.ts +0 -158
- package/extensions/learning-loop/src/learning/retrieval.ts +0 -87
- package/extensions/learning-loop/src/math/confidence-intervals.ts +0 -62
- package/extensions/learning-loop/src/math/ewma.ts +0 -51
- package/extensions/learning-loop/src/math/weighted-scorer.ts +0 -42
- package/extensions/learning-loop/src/schema.ts +0 -176
- package/extensions/learning-loop/src/scoring/normalization.ts +0 -32
- package/extensions/learning-loop/src/scoring/quality-engine.ts +0 -78
- package/extensions/learning-loop/src/scoring/signal-extractors.ts +0 -155
- package/extensions/learning-loop/src/test/context-injector.test.ts +0 -142
- package/extensions/learning-loop/src/test/fixes.test.ts +0 -1286
- package/extensions/learning-loop/src/test/graph.test.ts +0 -711
- package/extensions/learning-loop/src/test/integration.test.ts +0 -312
- package/extensions/learning-loop/src/test/learning-store.test.ts +0 -191
- package/extensions/learning-loop/src/test/math.test.ts +0 -148
- package/extensions/learning-loop/src/test/quality-engine.test.ts +0 -231
- package/extensions/learning-loop/src/test/run-tracker.test.ts +0 -143
- package/extensions/learning-loop/src/types.ts +0 -281
- package/extensions/learning-loop/symi.plugin.json +0 -46
- package/extensions/llm-task/README.md +0 -97
- package/extensions/llm-task/index.ts +0 -6
- package/extensions/llm-task/package.json +0 -12
- package/extensions/llm-task/src/llm-task-tool.test.ts +0 -138
- package/extensions/llm-task/src/llm-task-tool.ts +0 -249
- package/extensions/llm-task/symi.plugin.json +0 -21
- package/extensions/memory-lancedb/config.ts +0 -161
- package/extensions/memory-lancedb/index.test.ts +0 -330
- package/extensions/memory-lancedb/index.ts +0 -670
- package/extensions/memory-lancedb/node_modules/.bin/arrow2csv +0 -21
- package/extensions/memory-lancedb/node_modules/.bin/openai +0 -21
- package/extensions/memory-lancedb/node_modules/.bin/symi +0 -21
- package/extensions/memory-lancedb/package.json +0 -20
- package/extensions/memory-lancedb/symi.plugin.json +0 -71
- package/extensions/minimax-portal-auth/README.md +0 -33
- package/extensions/minimax-portal-auth/index.ts +0 -161
- package/extensions/minimax-portal-auth/node_modules/.bin/symi +0 -21
- package/extensions/minimax-portal-auth/oauth.ts +0 -247
- package/extensions/minimax-portal-auth/package.json +0 -15
- package/extensions/minimax-portal-auth/symi.plugin.json +0 -9
- package/extensions/model-equalizer/index.ts +0 -80
- package/extensions/model-equalizer/skills/model-equalizer/SKILL.md +0 -58
- package/extensions/model-equalizer/src/detection.ts +0 -62
- package/extensions/model-equalizer/src/enhancer.ts +0 -63
- package/extensions/model-equalizer/src/test/detection.test.ts +0 -218
- package/extensions/model-equalizer/src/test/enhancer.test.ts +0 -137
- package/extensions/model-equalizer/src/test/integration.test.ts +0 -185
- package/extensions/model-equalizer/src/types.ts +0 -24
- package/extensions/model-equalizer/symi.plugin.json +0 -12
- package/extensions/phone-control/index.ts +0 -421
- package/extensions/phone-control/symi.plugin.json +0 -10
- package/extensions/pipeline/README.md +0 -75
- package/extensions/pipeline/SKILL.md +0 -97
- package/extensions/pipeline/index.ts +0 -18
- package/extensions/pipeline/package.json +0 -11
- package/extensions/pipeline/src/pipeline-tool.test.ts +0 -345
- package/extensions/pipeline/src/pipeline-tool.ts +0 -266
- package/extensions/pipeline/src/windows-spawn.test.ts +0 -148
- package/extensions/pipeline/src/windows-spawn.ts +0 -193
- package/extensions/pipeline/symi.plugin.json +0 -10
- package/extensions/qwen-portal-auth/README.md +0 -24
- package/extensions/qwen-portal-auth/index.ts +0 -134
- package/extensions/qwen-portal-auth/oauth.ts +0 -190
- package/extensions/qwen-portal-auth/symi.plugin.json +0 -9
- package/extensions/talk-voice/index.ts +0 -150
- package/extensions/talk-voice/symi.plugin.json +0 -10
- package/extensions/thread-ownership/index.test.ts +0 -180
- package/extensions/thread-ownership/index.ts +0 -133
- package/extensions/thread-ownership/symi.plugin.json +0 -28
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import type { SymiConfig, SymiPluginApi } from "symi/plugin-sdk";
|
|
2
|
-
|
|
3
|
-
type ThreadOwnershipConfig = {
|
|
4
|
-
forwarderUrl?: string;
|
|
5
|
-
abTestChannels?: string[];
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
type AgentEntry = NonNullable<NonNullable<SymiConfig["agents"]>["list"]>[number];
|
|
9
|
-
|
|
10
|
-
// In-memory set of {channel}:{thread} keys where this agent was @-mentioned.
|
|
11
|
-
// Entries expire after 5 minutes.
|
|
12
|
-
const mentionedThreads = new Map<string, number>();
|
|
13
|
-
const MENTION_TTL_MS = 5 * 60 * 1000;
|
|
14
|
-
|
|
15
|
-
function cleanExpiredMentions(): void {
|
|
16
|
-
const now = Date.now();
|
|
17
|
-
for (const [key, ts] of mentionedThreads) {
|
|
18
|
-
if (now - ts > MENTION_TTL_MS) {
|
|
19
|
-
mentionedThreads.delete(key);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function resolveOwnershipAgent(config: SymiConfig): { id: string; name: string } {
|
|
25
|
-
const list = Array.isArray(config.agents?.list)
|
|
26
|
-
? config.agents.list.filter((entry): entry is AgentEntry =>
|
|
27
|
-
Boolean(entry && typeof entry === "object"),
|
|
28
|
-
)
|
|
29
|
-
: [];
|
|
30
|
-
const selected = list.find((entry) => entry.default === true) ?? list[0];
|
|
31
|
-
|
|
32
|
-
const id =
|
|
33
|
-
typeof selected?.id === "string" && selected.id.trim() ? selected.id.trim() : "unknown";
|
|
34
|
-
const identityName =
|
|
35
|
-
typeof selected?.identity?.name === "string" ? selected.identity.name.trim() : "";
|
|
36
|
-
const fallbackName = typeof selected?.name === "string" ? selected.name.trim() : "";
|
|
37
|
-
const name = identityName || fallbackName;
|
|
38
|
-
|
|
39
|
-
return { id, name };
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export default function register(api: SymiPluginApi) {
|
|
43
|
-
const pluginCfg = (api.pluginConfig ?? {}) as ThreadOwnershipConfig;
|
|
44
|
-
const forwarderUrl = (
|
|
45
|
-
pluginCfg.forwarderUrl ??
|
|
46
|
-
process.env.SLACK_FORWARDER_URL ??
|
|
47
|
-
"http://slack-forwarder:8750"
|
|
48
|
-
).replace(/\/$/, "");
|
|
49
|
-
|
|
50
|
-
const abTestChannels = new Set(
|
|
51
|
-
pluginCfg.abTestChannels ??
|
|
52
|
-
process.env.THREAD_OWNERSHIP_CHANNELS?.split(",").filter(Boolean) ??
|
|
53
|
-
[],
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
const { id: agentId, name: agentName } = resolveOwnershipAgent(api.config);
|
|
57
|
-
const botUserId = process.env.SLACK_BOT_USER_ID ?? "";
|
|
58
|
-
|
|
59
|
-
// ---------------------------------------------------------------------------
|
|
60
|
-
// message_received: track @-mentions so the agent can reply even if it
|
|
61
|
-
// doesn't own the thread.
|
|
62
|
-
// ---------------------------------------------------------------------------
|
|
63
|
-
api.on("message_received", async (event, ctx) => {
|
|
64
|
-
if (ctx.channelId !== "slack") return;
|
|
65
|
-
|
|
66
|
-
const text = event.content ?? "";
|
|
67
|
-
const threadTs = (event.metadata?.threadTs as string) ?? "";
|
|
68
|
-
const channelId = (event.metadata?.channelId as string) ?? ctx.conversationId ?? "";
|
|
69
|
-
|
|
70
|
-
if (!threadTs || !channelId) return;
|
|
71
|
-
|
|
72
|
-
// Check if this agent was @-mentioned.
|
|
73
|
-
const mentioned =
|
|
74
|
-
(agentName && text.includes(`@${agentName}`)) ||
|
|
75
|
-
(botUserId && text.includes(`<@${botUserId}>`));
|
|
76
|
-
|
|
77
|
-
if (mentioned) {
|
|
78
|
-
cleanExpiredMentions();
|
|
79
|
-
mentionedThreads.set(`${channelId}:${threadTs}`, Date.now());
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
// ---------------------------------------------------------------------------
|
|
84
|
-
// message_sending: check thread ownership before sending to Slack.
|
|
85
|
-
// Returns { cancel: true } if another agent owns the thread.
|
|
86
|
-
// ---------------------------------------------------------------------------
|
|
87
|
-
api.on("message_sending", async (event, ctx) => {
|
|
88
|
-
if (ctx.channelId !== "slack") return;
|
|
89
|
-
|
|
90
|
-
const threadTs = (event.metadata?.threadTs as string) ?? "";
|
|
91
|
-
const channelId = (event.metadata?.channelId as string) ?? event.to;
|
|
92
|
-
|
|
93
|
-
// Top-level messages (no thread) are always allowed.
|
|
94
|
-
if (!threadTs) return;
|
|
95
|
-
|
|
96
|
-
// Only enforce in A/B test channels (if set is empty, skip entirely).
|
|
97
|
-
if (abTestChannels.size > 0 && !abTestChannels.has(channelId)) return;
|
|
98
|
-
|
|
99
|
-
// If this agent was @-mentioned in this thread recently, skip ownership check.
|
|
100
|
-
cleanExpiredMentions();
|
|
101
|
-
if (mentionedThreads.has(`${channelId}:${threadTs}`)) return;
|
|
102
|
-
|
|
103
|
-
// Try to claim ownership via the forwarder HTTP API.
|
|
104
|
-
try {
|
|
105
|
-
const resp = await fetch(`${forwarderUrl}/api/v1/ownership/${channelId}/${threadTs}`, {
|
|
106
|
-
method: "POST",
|
|
107
|
-
headers: { "Content-Type": "application/json" },
|
|
108
|
-
body: JSON.stringify({ agent_id: agentId }),
|
|
109
|
-
signal: AbortSignal.timeout(3000),
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
if (resp.ok) {
|
|
113
|
-
// We own it (or just claimed it), proceed.
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
if (resp.status === 409) {
|
|
118
|
-
// Another agent owns this thread — cancel the send.
|
|
119
|
-
const body = (await resp.json()) as { owner?: string };
|
|
120
|
-
api.logger.info?.(
|
|
121
|
-
`thread-ownership: cancelled send to ${channelId}:${threadTs} — owned by ${body.owner}`,
|
|
122
|
-
);
|
|
123
|
-
return { cancel: true };
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Unexpected status — fail open.
|
|
127
|
-
api.logger.warn?.(`thread-ownership: unexpected status ${resp.status}, allowing send`);
|
|
128
|
-
} catch (err) {
|
|
129
|
-
// Network error — fail open.
|
|
130
|
-
api.logger.warn?.(`thread-ownership: ownership check failed (${String(err)}), allowing send`);
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "thread-ownership",
|
|
3
|
-
"name": "Thread Ownership",
|
|
4
|
-
"description": "Prevents multiple agents from responding in the same Slack thread. Uses HTTP calls to the slack-forwarder ownership API.",
|
|
5
|
-
"configSchema": {
|
|
6
|
-
"type": "object",
|
|
7
|
-
"additionalProperties": false,
|
|
8
|
-
"properties": {
|
|
9
|
-
"forwarderUrl": {
|
|
10
|
-
"type": "string"
|
|
11
|
-
},
|
|
12
|
-
"abTestChannels": {
|
|
13
|
-
"type": "array",
|
|
14
|
-
"items": { "type": "string" }
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
"uiHints": {
|
|
19
|
-
"forwarderUrl": {
|
|
20
|
-
"label": "Forwarder URL",
|
|
21
|
-
"help": "Base URL of the slack-forwarder ownership API (default: http://slack-forwarder:8750)"
|
|
22
|
-
},
|
|
23
|
-
"abTestChannels": {
|
|
24
|
-
"label": "A/B Test Channels",
|
|
25
|
-
"help": "Slack channel IDs where thread ownership is enforced"
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|