@grackle-ai/plugin-core 0.115.0 → 0.115.2
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/channel-config.d.ts +22 -0
- package/dist/channel-config.d.ts.map +1 -0
- package/dist/channel-config.js +23 -0
- package/dist/channel-config.js.map +1 -0
- package/dist/channel-handlers.d.ts +13 -0
- package/dist/channel-handlers.d.ts.map +1 -0
- package/dist/channel-handlers.js +77 -0
- package/dist/channel-handlers.js.map +1 -0
- package/dist/channel-ingest.d.ts +35 -0
- package/dist/channel-ingest.d.ts.map +1 -0
- package/dist/channel-ingest.js +96 -0
- package/dist/channel-ingest.js.map +1 -0
- package/dist/grpc-service.d.ts.map +1 -1
- package/dist/grpc-service.js +3 -0
- package/dist/grpc-service.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime configuration for channel-capability handlers.
|
|
3
|
+
*
|
|
4
|
+
* Channel handlers are stateless module functions, but minting tokens and
|
|
5
|
+
* building ingress URLs requires the signing secret and the public web base
|
|
6
|
+
* URL — known only at server startup. The composition root calls
|
|
7
|
+
* {@link setChannelConfig} once; handlers read it via {@link getChannelConfig}.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
/** Configuration required by channel-capability handlers. */
|
|
12
|
+
export interface ChannelConfig {
|
|
13
|
+
/** HMAC signing secret for channel tokens (the server API key). */
|
|
14
|
+
signingSecret: string;
|
|
15
|
+
/** Public base URL for ingress webhook URLs, e.g. `http://127.0.0.1:3000`. */
|
|
16
|
+
ingressBaseUrl: string;
|
|
17
|
+
}
|
|
18
|
+
/** Configure channel handlers. Called once at server startup. */
|
|
19
|
+
export declare function setChannelConfig(next: ChannelConfig): void;
|
|
20
|
+
/** Get the channel config, throwing if {@link setChannelConfig} was not called. */
|
|
21
|
+
export declare function getChannelConfig(): ChannelConfig;
|
|
22
|
+
//# sourceMappingURL=channel-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-config.d.ts","sourceRoot":"","sources":["../src/channel-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,cAAc,EAAE,MAAM,CAAC;CACxB;AAID,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAE1D;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,IAAI,aAAa,CAKhD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime configuration for channel-capability handlers.
|
|
3
|
+
*
|
|
4
|
+
* Channel handlers are stateless module functions, but minting tokens and
|
|
5
|
+
* building ingress URLs requires the signing secret and the public web base
|
|
6
|
+
* URL — known only at server startup. The composition root calls
|
|
7
|
+
* {@link setChannelConfig} once; handlers read it via {@link getChannelConfig}.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
let config;
|
|
12
|
+
/** Configure channel handlers. Called once at server startup. */
|
|
13
|
+
export function setChannelConfig(next) {
|
|
14
|
+
config = next;
|
|
15
|
+
}
|
|
16
|
+
/** Get the channel config, throwing if {@link setChannelConfig} was not called. */
|
|
17
|
+
export function getChannelConfig() {
|
|
18
|
+
if (!config) {
|
|
19
|
+
throw new Error("Channel handlers not configured: call setChannelConfig() at startup");
|
|
20
|
+
}
|
|
21
|
+
return config;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=channel-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-config.js","sourceRoot":"","sources":["../src/channel-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,IAAI,MAAiC,CAAC;AAEtC,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,IAAmB;IAClD,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { grackle } from "@grackle-ai/common";
|
|
2
|
+
/**
|
|
3
|
+
* Mint a capability token exposing a single session channel for inbound
|
|
4
|
+
* user-message injection, and persist a revocable grant.
|
|
5
|
+
*
|
|
6
|
+
* v0 supports session targets only (`grackle:/sessions/<id>`).
|
|
7
|
+
*/
|
|
8
|
+
export declare function exposeChannel(req: grackle.ExposeChannelRequest): Promise<grackle.ExposeChannelResponse>;
|
|
9
|
+
/** List all channel grants. */
|
|
10
|
+
export declare function listChannelGrants(_req: grackle.ListChannelGrantsRequest): Promise<grackle.ChannelGrantList>;
|
|
11
|
+
/** Revoke a channel grant; its webhook token stops working immediately. */
|
|
12
|
+
export declare function revokeChannelGrant(req: grackle.RevokeChannelGrantRequest): Promise<grackle.Empty>;
|
|
13
|
+
//# sourceMappingURL=channel-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-handlers.d.ts","sourceRoot":"","sources":["../src/channel-handlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAyB7C;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAmC7G;AAED,+BAA+B;AAC/B,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAGjH;AAED,2EAA2E;AAC3E,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,yBAAyB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CASvG"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { ConnectError, Code } from "@connectrpc/connect";
|
|
2
|
+
import { create } from "@bufbuild/protobuf";
|
|
3
|
+
import { grackle } from "@grackle-ai/common";
|
|
4
|
+
import { channelGrantStore, sessionStore } from "@grackle-ai/database";
|
|
5
|
+
import { createChannelToken, verifyChannelToken } from "@grackle-ai/auth";
|
|
6
|
+
import { ulid } from "ulid";
|
|
7
|
+
import { getChannelConfig } from "./channel-config.js";
|
|
8
|
+
/** Verbs currently supported on a channel. */
|
|
9
|
+
const SUPPORTED_VERBS = new Set(["send_input"]);
|
|
10
|
+
/** Default verb set when a request omits `verbs`. */
|
|
11
|
+
const DEFAULT_VERBS = ["send_input"];
|
|
12
|
+
/** Convert a stored grant row to its proto representation. */
|
|
13
|
+
function grantRowToProto(row) {
|
|
14
|
+
return create(grackle.ChannelGrantSchema, {
|
|
15
|
+
grantId: row.id,
|
|
16
|
+
channelUri: row.channelUri,
|
|
17
|
+
verbs: row.verbs ? row.verbs.split(",") : [],
|
|
18
|
+
label: row.label,
|
|
19
|
+
createdAt: row.createdAt,
|
|
20
|
+
expiresAt: row.expiresAt ?? "",
|
|
21
|
+
revoked: row.revoked,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Mint a capability token exposing a single session channel for inbound
|
|
26
|
+
* user-message injection, and persist a revocable grant.
|
|
27
|
+
*
|
|
28
|
+
* v0 supports session targets only (`grackle:/sessions/<id>`).
|
|
29
|
+
*/
|
|
30
|
+
export async function exposeChannel(req) {
|
|
31
|
+
if (req.target.case !== "sessionId" || !req.target.value) {
|
|
32
|
+
throw new ConnectError("a session_id target is required", Code.InvalidArgument);
|
|
33
|
+
}
|
|
34
|
+
const sessionId = req.target.value;
|
|
35
|
+
if (!sessionStore.getSession(sessionId)) {
|
|
36
|
+
throw new ConnectError(`Session not found: ${sessionId}`, Code.NotFound);
|
|
37
|
+
}
|
|
38
|
+
const verbs = req.verbs.length > 0 ? req.verbs : [...DEFAULT_VERBS];
|
|
39
|
+
for (const verb of verbs) {
|
|
40
|
+
if (!SUPPORTED_VERBS.has(verb)) {
|
|
41
|
+
throw new ConnectError(`Unsupported verb: ${verb}`, Code.InvalidArgument);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const channelUri = `grackle:/sessions/${sessionId}`;
|
|
45
|
+
const grantId = ulid();
|
|
46
|
+
const { signingSecret, ingressBaseUrl } = getChannelConfig();
|
|
47
|
+
const ttlMs = req.ttlSeconds > 0 ? req.ttlSeconds * 1000 : undefined;
|
|
48
|
+
const token = createChannelToken({ chan: channelUri, verbs, jti: grantId }, signingSecret, ttlMs);
|
|
49
|
+
// Decode the freshly-minted token to read its expiry without duplicating TTL logic.
|
|
50
|
+
const claims = verifyChannelToken(token, signingSecret);
|
|
51
|
+
const expiresAt = claims ? new Date(claims.exp * 1000).toISOString() : "";
|
|
52
|
+
channelGrantStore.createGrant(grantId, channelUri, verbs.join(","), req.label, expiresAt || null);
|
|
53
|
+
return create(grackle.ExposeChannelResponseSchema, {
|
|
54
|
+
channelUri,
|
|
55
|
+
grantId,
|
|
56
|
+
token,
|
|
57
|
+
ingressUrl: `${ingressBaseUrl}/hook/${token}`,
|
|
58
|
+
expiresAt,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/** List all channel grants. */
|
|
62
|
+
export async function listChannelGrants(_req) {
|
|
63
|
+
const rows = channelGrantStore.listGrants();
|
|
64
|
+
return create(grackle.ChannelGrantListSchema, { grants: rows.map(grantRowToProto) });
|
|
65
|
+
}
|
|
66
|
+
/** Revoke a channel grant; its webhook token stops working immediately. */
|
|
67
|
+
export async function revokeChannelGrant(req) {
|
|
68
|
+
if (!req.grantId) {
|
|
69
|
+
throw new ConnectError("grant_id is required", Code.InvalidArgument);
|
|
70
|
+
}
|
|
71
|
+
if (!channelGrantStore.getGrant(req.grantId)) {
|
|
72
|
+
throw new ConnectError(`grant not found: ${req.grantId}`, Code.NotFound);
|
|
73
|
+
}
|
|
74
|
+
channelGrantStore.revokeGrant(req.grantId);
|
|
75
|
+
return create(grackle.EmptySchema, {});
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=channel-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-handlers.js","sourceRoot":"","sources":["../src/channel-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inbound channel message ingestion — the data-plane logic behind the
|
|
3
|
+
* `POST /hook/<token>` webhook. Verifies a capability token, checks the
|
|
4
|
+
* persisted (revocable) grant, then injects the message into the target
|
|
5
|
+
* session via the existing {@link sendInput} handler.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
/** Structural result of handling an inbound webhook (mirrors web-server `WebhookResult`). */
|
|
10
|
+
export interface IngestResult {
|
|
11
|
+
/** Outcome category (maps to an HTTP status in the web server). */
|
|
12
|
+
outcome: "delivered" | "buffered" | "forbidden" | "not_found" | "ended" | "bad_request";
|
|
13
|
+
/** Resolved channel URI, when known. */
|
|
14
|
+
channelUri?: string;
|
|
15
|
+
/** Resolved session ID, when delivered. */
|
|
16
|
+
sessionId?: string;
|
|
17
|
+
}
|
|
18
|
+
/** Inbound webhook payload (mirrors web-server `WebhookBody`). */
|
|
19
|
+
export interface IngestBody {
|
|
20
|
+
/** The user message text to inject into the target session. */
|
|
21
|
+
message: string;
|
|
22
|
+
/** Optional sender attribution, prefixed onto the injected message. */
|
|
23
|
+
from?: string;
|
|
24
|
+
/** Optional dedupe key for webhook retries (hashed before use). */
|
|
25
|
+
idempotencyKey?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Verify a channel capability token and inject the message into its session.
|
|
29
|
+
*
|
|
30
|
+
* @param token - The capability token (from the URL or Bearer header).
|
|
31
|
+
* @param body - The inbound message payload.
|
|
32
|
+
* @returns An {@link IngestResult} the web server maps to an HTTP status.
|
|
33
|
+
*/
|
|
34
|
+
export declare function ingestChannelMessage(token: string, body: IngestBody): Promise<IngestResult>;
|
|
35
|
+
//# sourceMappingURL=channel-ingest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-ingest.d.ts","sourceRoot":"","sources":["../src/channel-ingest.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,6FAA6F;AAC7F,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,OAAO,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,aAAa,CAAC;IACxF,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,kEAAkE;AAClE,MAAM,WAAW,UAAU;IACzB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA8BD;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAkDjG"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inbound channel message ingestion — the data-plane logic behind the
|
|
3
|
+
* `POST /hook/<token>` webhook. Verifies a capability token, checks the
|
|
4
|
+
* persisted (revocable) grant, then injects the message into the target
|
|
5
|
+
* session via the existing {@link sendInput} handler.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { createHash } from "node:crypto";
|
|
10
|
+
import { Code, ConnectError } from "@connectrpc/connect";
|
|
11
|
+
import { create } from "@bufbuild/protobuf";
|
|
12
|
+
import { grackle } from "@grackle-ai/common";
|
|
13
|
+
import { channelGrantStore } from "@grackle-ai/database";
|
|
14
|
+
import { verifyChannelToken } from "@grackle-ai/auth";
|
|
15
|
+
import { getChannelConfig } from "./channel-config.js";
|
|
16
|
+
import { sendInput } from "./session-handlers.js";
|
|
17
|
+
const SESSION_CHANNEL_PREFIX = "grackle:/sessions/";
|
|
18
|
+
/**
|
|
19
|
+
* Best-effort, process-local idempotency dedupe. Entries expire by age so the
|
|
20
|
+
* dedupe window is bounded and predictable; cross-process/persistent dedupe
|
|
21
|
+
* (e.g. a DB-backed store) is a deliberate follow-up (#1255).
|
|
22
|
+
*/
|
|
23
|
+
const IDEMPOTENCY_TTL_MS = 10 * 60 * 1000;
|
|
24
|
+
const MAX_SEEN_KEYS = 1000;
|
|
25
|
+
const seenKeys = new Map();
|
|
26
|
+
/** Record an idempotency key; returns true if seen within the TTL window. */
|
|
27
|
+
function alreadySeen(key) {
|
|
28
|
+
const now = Date.now();
|
|
29
|
+
const seenAt = seenKeys.get(key);
|
|
30
|
+
if (seenAt !== undefined && now - seenAt < IDEMPOTENCY_TTL_MS) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
seenKeys.set(key, now);
|
|
34
|
+
if (seenKeys.size > MAX_SEEN_KEYS) {
|
|
35
|
+
const oldest = seenKeys.keys().next().value;
|
|
36
|
+
if (oldest !== undefined) {
|
|
37
|
+
seenKeys.delete(oldest);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Verify a channel capability token and inject the message into its session.
|
|
44
|
+
*
|
|
45
|
+
* @param token - The capability token (from the URL or Bearer header).
|
|
46
|
+
* @param body - The inbound message payload.
|
|
47
|
+
* @returns An {@link IngestResult} the web server maps to an HTTP status.
|
|
48
|
+
*/
|
|
49
|
+
export async function ingestChannelMessage(token, body) {
|
|
50
|
+
const { signingSecret } = getChannelConfig();
|
|
51
|
+
const claims = verifyChannelToken(token, signingSecret);
|
|
52
|
+
if (!claims) {
|
|
53
|
+
return { outcome: "forbidden" };
|
|
54
|
+
}
|
|
55
|
+
const grant = channelGrantStore.getGrant(claims.jti);
|
|
56
|
+
if (!grant || grant.revoked) {
|
|
57
|
+
return { outcome: "forbidden", channelUri: claims.chan };
|
|
58
|
+
}
|
|
59
|
+
// Defense-in-depth: the persisted grant must match the signed token claims,
|
|
60
|
+
// and both must permit send_input.
|
|
61
|
+
const grantVerbs = grant.verbs ? grant.verbs.split(",") : [];
|
|
62
|
+
if (grant.channelUri !== claims.chan ||
|
|
63
|
+
!claims.verbs.includes("send_input") ||
|
|
64
|
+
!grantVerbs.includes("send_input")) {
|
|
65
|
+
return { outcome: "forbidden", channelUri: claims.chan };
|
|
66
|
+
}
|
|
67
|
+
if (!claims.chan.startsWith(SESSION_CHANNEL_PREFIX)) {
|
|
68
|
+
return { outcome: "bad_request", channelUri: claims.chan };
|
|
69
|
+
}
|
|
70
|
+
const sessionId = claims.chan.slice(SESSION_CHANNEL_PREFIX.length);
|
|
71
|
+
// Dedupe webhook retries (scoped to the grant). Hash the caller-supplied key
|
|
72
|
+
// so an arbitrarily long key can't bloat the in-memory dedupe map.
|
|
73
|
+
if (body.idempotencyKey) {
|
|
74
|
+
const dedupeKey = `${claims.jti}:${createHash("sha256").update(body.idempotencyKey).digest("base64url")}`;
|
|
75
|
+
if (alreadySeen(dedupeKey)) {
|
|
76
|
+
return { outcome: "delivered", channelUri: claims.chan, sessionId };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const text = body.from ? `[${body.from}] ${body.message}` : body.message;
|
|
80
|
+
try {
|
|
81
|
+
await sendInput(create(grackle.InputMessageSchema, { sessionId, text }));
|
|
82
|
+
return { outcome: "delivered", channelUri: claims.chan, sessionId };
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
if (err instanceof ConnectError) {
|
|
86
|
+
if (err.code === Code.NotFound) {
|
|
87
|
+
return { outcome: "not_found", channelUri: claims.chan };
|
|
88
|
+
}
|
|
89
|
+
if (err.code === Code.FailedPrecondition) {
|
|
90
|
+
return { outcome: "ended", channelUri: claims.chan };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
throw err;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=channel-ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-ingest.js","sourceRoot":"","sources":["../src/channel-ingest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grpc-service.d.ts","sourceRoot":"","sources":["../src/grpc-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"grpc-service.d.ts","sourceRoot":"","sources":["../src/grpc-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAiBzD;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAkBzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAatD;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,IAAI,gBAAgB,CAQ/D;AAED,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAEjE"}
|
package/dist/grpc-service.js
CHANGED
|
@@ -23,6 +23,7 @@ import * as dockerContainers from "./docker-handlers.js";
|
|
|
23
23
|
import * as settings from "./settings-handlers.js";
|
|
24
24
|
import * as pluginHandlers from "./plugin-handlers.js";
|
|
25
25
|
import * as githubAccounts from "./github-account-handlers.js";
|
|
26
|
+
import * as channels from "./channel-handlers.js";
|
|
26
27
|
/**
|
|
27
28
|
* Create a `ServiceCollector` pre-loaded with all built-in Grackle handler groups.
|
|
28
29
|
*
|
|
@@ -45,6 +46,7 @@ export function createDefaultCollector() {
|
|
|
45
46
|
collector.addHandlers(grackle.GrackleCore, settings);
|
|
46
47
|
collector.addHandlers(grackle.GrackleCore, pluginHandlers);
|
|
47
48
|
collector.addHandlers(grackle.GrackleCore, githubAccounts);
|
|
49
|
+
collector.addHandlers(grackle.GrackleCore, channels);
|
|
48
50
|
return collector;
|
|
49
51
|
}
|
|
50
52
|
/**
|
|
@@ -68,6 +70,7 @@ export function createCoreCollector() {
|
|
|
68
70
|
collector.addHandlers(grackle.GrackleCore, settings);
|
|
69
71
|
collector.addHandlers(grackle.GrackleCore, pluginHandlers);
|
|
70
72
|
collector.addHandlers(grackle.GrackleCore, githubAccounts);
|
|
73
|
+
collector.addHandlers(grackle.GrackleCore, channels);
|
|
71
74
|
return collector;
|
|
72
75
|
}
|
|
73
76
|
/**
|
package/dist/grpc-service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grpc-service.js","sourceRoot":"","sources":["../src/grpc-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAyB,MAAM,kBAAkB,CAAC;AAEjF,OAAO,KAAK,YAAY,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,QAAQ,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,KAAK,MAAM,oBAAoB,CAAC;AAC5C,OAAO,KAAK,UAAU,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,QAAQ,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,QAAQ,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,WAAW,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,UAAU,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,gBAAgB,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,cAAc,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"grpc-service.js","sourceRoot":"","sources":["../src/grpc-service.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,6 +15,10 @@ export type { EnvironmentReconciliationDeps } from "./environment-reconciliation
|
|
|
15
15
|
export { setLoadedPluginNames, PLUGIN_REGISTRY } from "./plugin-registry.js";
|
|
16
16
|
export type { PluginRegistryEntry } from "./plugin-registry.js";
|
|
17
17
|
export { killSessionAndCleanup } from "./grpc-shared.js";
|
|
18
|
+
export { setChannelConfig } from "./channel-config.js";
|
|
19
|
+
export type { ChannelConfig } from "./channel-config.js";
|
|
20
|
+
export { ingestChannelMessage } from "./channel-ingest.js";
|
|
21
|
+
export type { IngestBody, IngestResult } from "./channel-ingest.js";
|
|
18
22
|
export { cleanupLifecycleStream, ensureLifecycleStream } from "./lifecycle.js";
|
|
19
23
|
export { toDialableHost, validatePipeInputs, resolveAncestorEnvironmentId, VALID_PIPE_MODES } from "./grpc-shared.js";
|
|
20
24
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAGrI,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5G,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,oCAAoC,EAAE,MAAM,iCAAiC,CAAC;AACvF,YAAY,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAGrF,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC7E,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAGhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAGzD,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAGrI,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5G,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,oCAAoC,EAAE,MAAM,iCAAiC,CAAC;AACvF,YAAY,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAGrF,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC7E,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAGhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAGzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGpE,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,9 @@ export { createEnvironmentReconciliationPhase } from "./environment-reconciliati
|
|
|
15
15
|
export { setLoadedPluginNames, PLUGIN_REGISTRY } from "./plugin-registry.js";
|
|
16
16
|
// ─── Handler Utilities ──────────────────────────────────────
|
|
17
17
|
export { killSessionAndCleanup } from "./grpc-shared.js";
|
|
18
|
+
// ─── Channel Capability I/O ─────────────────────────────────
|
|
19
|
+
export { setChannelConfig } from "./channel-config.js";
|
|
20
|
+
export { ingestChannelMessage } from "./channel-ingest.js";
|
|
18
21
|
// ─── Re-exports from other modules ──────────────────────────
|
|
19
22
|
export { cleanupLifecycleStream, ensureLifecycleStream } from "./lifecycle.js";
|
|
20
23
|
export { toDialableHost, validatePipeInputs, resolveAncestorEnvironmentId, VALID_PIPE_MODES } from "./grpc-shared.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAErI,+DAA+D;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5G,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAGnE,+DAA+D;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,oCAAoC,EAAE,MAAM,iCAAiC,CAAC;AAGvF,+DAA+D;AAC/D,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG7E,+DAA+D;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,+DAA+D;AAC/D,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAErI,+DAA+D;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5G,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAGnE,+DAA+D;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,oCAAoC,EAAE,MAAM,iCAAiC,CAAC;AAGvF,+DAA+D;AAC/D,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG7E,+DAA+D;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,+DAA+D;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,+DAA+D;AAC/D,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grackle-ai/plugin-core",
|
|
3
|
-
"version": "0.115.
|
|
3
|
+
"version": "0.115.2",
|
|
4
4
|
"description": "Core plugin for Grackle — gRPC handlers, reconciliation phases, and event subscribers",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -33,14 +33,14 @@
|
|
|
33
33
|
"pino": "^10.3.1",
|
|
34
34
|
"ulid": "^2.3.0",
|
|
35
35
|
"uuid": "^11.1.1",
|
|
36
|
-
"@grackle-ai/adapter-sdk": "0.115.
|
|
37
|
-
"@grackle-ai/common": "0.115.
|
|
38
|
-
"@grackle-ai/
|
|
39
|
-
"@grackle-ai/
|
|
40
|
-
"@grackle-ai/auth": "0.115.
|
|
41
|
-
"@grackle-ai/plugin-sdk": "0.115.
|
|
42
|
-
"@grackle-ai/knowledge": "0.115.
|
|
43
|
-
"@grackle-ai/prompt": "0.115.
|
|
36
|
+
"@grackle-ai/adapter-sdk": "0.115.2",
|
|
37
|
+
"@grackle-ai/common": "0.115.2",
|
|
38
|
+
"@grackle-ai/database": "0.115.2",
|
|
39
|
+
"@grackle-ai/core": "0.115.2",
|
|
40
|
+
"@grackle-ai/auth": "0.115.2",
|
|
41
|
+
"@grackle-ai/plugin-sdk": "0.115.2",
|
|
42
|
+
"@grackle-ai/knowledge": "0.115.2",
|
|
43
|
+
"@grackle-ai/prompt": "0.115.2"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@rushstack/heft": "1.2.7",
|