managed-deepagents 0.9.6-dev.15 → 0.9.6-dev.17
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/README.md +57 -953
- package/dist/agent-auth.d.ts +1 -1
- package/dist/agent-auth.d.ts.map +1 -1
- package/dist/agent-auth.js +12 -36
- package/dist/agent-auth.js.map +1 -1
- package/dist/channels/assistant-text.d.ts +0 -24
- package/dist/channels/assistant-text.d.ts.map +1 -1
- package/dist/channels/assistant-text.js +1 -65
- package/dist/channels/assistant-text.js.map +1 -1
- package/dist/channels/binding.d.ts +1 -20
- package/dist/channels/binding.d.ts.map +1 -1
- package/dist/channels/binding.js +10 -39
- package/dist/channels/binding.js.map +1 -1
- package/dist/channels/http/http.d.ts.map +1 -1
- package/dist/channels/http/http.js +65 -386
- package/dist/channels/http/http.js.map +1 -1
- package/dist/channels/http/index.d.ts +1 -2
- package/dist/channels/http/index.d.ts.map +1 -1
- package/dist/channels/http/index.js +10 -14
- package/dist/channels/http/index.js.map +1 -1
- package/dist/channels/http/ingress.d.ts +5 -65
- package/dist/channels/http/ingress.d.ts.map +1 -1
- package/dist/channels/http/ingress.js +33 -149
- package/dist/channels/http/ingress.js.map +1 -1
- package/dist/channels/http/types.d.ts +2 -143
- package/dist/channels/http/types.d.ts.map +1 -1
- package/dist/channels/message-schema.d.ts +0 -2
- package/dist/channels/message-schema.d.ts.map +1 -1
- package/dist/channels/message-schema.js +0 -4
- package/dist/channels/message-schema.js.map +1 -1
- package/dist/channels/messaging-registry.d.ts +0 -16
- package/dist/channels/messaging-registry.d.ts.map +1 -1
- package/dist/channels/messaging-registry.js +0 -29
- package/dist/channels/messaging-registry.js.map +1 -1
- package/dist/channels/runtime.d.ts +1 -1
- package/dist/channels/runtime.d.ts.map +1 -1
- package/dist/channels/runtime.js +1 -1
- package/dist/channels/runtime.js.map +1 -1
- package/dist/channels/schedule-delivery.d.ts +1 -1
- package/dist/channels/schedule-delivery.d.ts.map +1 -1
- package/dist/channels/schedule-delivery.js +23 -12
- package/dist/channels/schedule-delivery.js.map +1 -1
- package/dist/channels/slack/api.d.ts +0 -2
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +0 -6
- package/dist/channels/slack/api.js.map +1 -1
- package/dist/channels/slack/files.d.ts.map +1 -1
- package/dist/channels/slack/files.js +3 -2
- package/dist/channels/slack/files.js.map +1 -1
- package/dist/channels/slack/index.d.ts +2 -76
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +6 -177
- package/dist/channels/slack/index.js.map +1 -1
- package/dist/channels/slack/message-content.d.ts.map +1 -1
- package/dist/channels/slack/message-content.js +28 -23
- package/dist/channels/slack/message-content.js.map +1 -1
- package/dist/channels/source-providers.js +1 -1
- package/dist/channels/source-providers.js.map +1 -1
- package/dist/channels/trigger/client.d.ts.map +1 -1
- package/dist/channels/trigger/client.js +12 -6
- package/dist/channels/trigger/client.js.map +1 -1
- package/dist/channels/trigger/http.d.ts +3 -114
- package/dist/channels/trigger/http.d.ts.map +1 -1
- package/dist/channels/trigger/http.js +82 -314
- package/dist/channels/trigger/http.js.map +1 -1
- package/dist/channels/trigger/identity-context.d.ts +1 -1
- package/dist/channels/trigger/identity-context.d.ts.map +1 -1
- package/dist/channels/trigger/identity-context.js +3 -5
- package/dist/channels/trigger/identity-context.js.map +1 -1
- package/dist/channels/trigger/ingress.d.ts +1 -38
- package/dist/channels/trigger/ingress.d.ts.map +1 -1
- package/dist/channels/trigger/ingress.js +24 -49
- package/dist/channels/trigger/ingress.js.map +1 -1
- package/dist/channels/trigger/types.d.ts +3 -82
- package/dist/channels/trigger/types.d.ts.map +1 -1
- package/dist/channels/trigger/types.js +0 -36
- package/dist/channels/trigger/types.js.map +1 -1
- package/dist/channels/types.d.ts +3 -19
- package/dist/channels/types.d.ts.map +1 -1
- package/dist/channels/types.js +0 -2
- package/dist/channels/types.js.map +1 -1
- package/dist/concurrency/batch-processor.d.ts +51 -0
- package/dist/concurrency/batch-processor.d.ts.map +1 -0
- package/dist/concurrency/batch-processor.js +99 -0
- package/dist/concurrency/batch-processor.js.map +1 -0
- package/dist/connections.d.ts +1 -42
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +14 -127
- package/dist/connections.js.map +1 -1
- package/dist/credential-gate.d.ts +0 -2
- package/dist/credential-gate.d.ts.map +1 -1
- package/dist/credential-gate.js +3 -37
- package/dist/credential-gate.js.map +1 -1
- package/dist/define-deep-agent.d.ts.map +1 -1
- package/dist/define-deep-agent.js +0 -6
- package/dist/define-deep-agent.js.map +1 -1
- package/dist/identity/loopback.d.ts +7 -2
- package/dist/identity/loopback.d.ts.map +1 -1
- package/dist/identity/loopback.js +15 -4
- package/dist/identity/loopback.js.map +1 -1
- package/dist/identity/slack/links.js +3 -2
- package/dist/identity/slack/links.js.map +1 -1
- package/dist/index.d.ts +4 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/ingress/index.d.ts +8 -0
- package/dist/ingress/index.d.ts.map +1 -1
- package/dist/ingress/index.js +32 -2
- package/dist/ingress/index.js.map +1 -1
- package/dist/ingress/loopback.js +4 -3
- package/dist/ingress/loopback.js.map +1 -1
- package/dist/ingress/runs.d.ts +1 -74
- package/dist/ingress/runs.d.ts.map +1 -1
- package/dist/ingress/runs.js +16 -176
- package/dist/ingress/runs.js.map +1 -1
- package/dist/managed-composition.d.ts.map +1 -1
- package/dist/managed-composition.js +13 -8
- package/dist/managed-composition.js.map +1 -1
- package/dist/memory/instructions-middleware.d.ts.map +1 -1
- package/dist/memory/instructions-middleware.js +6 -5
- package/dist/memory/instructions-middleware.js.map +1 -1
- package/dist/namespaces.d.ts +21 -21
- package/dist/namespaces.d.ts.map +1 -1
- package/dist/namespaces.js +29 -4
- package/dist/namespaces.js.map +1 -1
- package/dist/resilience/retry.d.ts +21 -0
- package/dist/resilience/retry.d.ts.map +1 -0
- package/dist/resilience/retry.js +40 -0
- package/dist/resilience/retry.js.map +1 -0
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +21 -151
- package/dist/runtime/auth.js.map +1 -1
- package/dist/runtime/channel.d.ts +0 -6
- package/dist/runtime/channel.d.ts.map +1 -1
- package/dist/runtime/channel.js.map +1 -1
- package/dist/runtime/graph-build-timing.d.ts +30 -0
- package/dist/runtime/graph-build-timing.d.ts.map +1 -0
- package/dist/runtime/graph-build-timing.js +50 -0
- package/dist/runtime/graph-build-timing.js.map +1 -0
- package/dist/runtime/http.d.ts +15 -0
- package/dist/runtime/http.d.ts.map +1 -1
- package/dist/runtime/http.js +37 -0
- package/dist/runtime/http.js.map +1 -1
- package/dist/runtime/identity-http.d.ts +0 -2
- package/dist/runtime/identity-http.d.ts.map +1 -1
- package/dist/runtime/identity-http.js +16 -40
- package/dist/runtime/identity-http.js.map +1 -1
- package/dist/runtime/identity-runtime.d.ts +0 -10
- package/dist/runtime/identity-runtime.d.ts.map +1 -1
- package/dist/runtime/identity-runtime.js +0 -22
- package/dist/runtime/identity-runtime.js.map +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +47 -46
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/langsmith-env.d.ts +19 -0
- package/dist/runtime/langsmith-env.d.ts.map +1 -0
- package/dist/runtime/langsmith-env.js +38 -0
- package/dist/runtime/langsmith-env.js.map +1 -0
- package/dist/runtime/log.d.ts +8 -14
- package/dist/runtime/log.d.ts.map +1 -1
- package/dist/runtime/log.js +16 -7
- package/dist/runtime/log.js.map +1 -1
- package/dist/runtime/managed-middleware.d.ts.map +1 -1
- package/dist/runtime/managed-middleware.js +1 -14
- package/dist/runtime/managed-middleware.js.map +1 -1
- package/dist/runtime/managed-tools.d.ts +10 -10
- package/dist/runtime/managed-tools.d.ts.map +1 -1
- package/dist/runtime/managed-tools.js +24 -24
- package/dist/runtime/managed-tools.js.map +1 -1
- package/dist/runtime/memory/mounts.d.ts +82 -11
- package/dist/runtime/memory/mounts.d.ts.map +1 -1
- package/dist/runtime/memory/mounts.js +173 -34
- package/dist/runtime/memory/mounts.js.map +1 -1
- package/dist/runtime/memory/policy.d.ts.map +1 -1
- package/dist/runtime/memory/policy.js +3 -1
- package/dist/runtime/memory/policy.js.map +1 -1
- package/dist/runtime/run-input.d.ts +0 -10
- package/dist/runtime/run-input.d.ts.map +1 -1
- package/dist/runtime/run-input.js +19 -47
- package/dist/runtime/run-input.js.map +1 -1
- package/dist/runtime/sandbox-manager.d.ts +1 -1
- package/dist/runtime/sandbox-manager.d.ts.map +1 -1
- package/dist/runtime/sandbox-manager.js +10 -15
- package/dist/runtime/sandbox-manager.js.map +1 -1
- package/dist/runtime/schedule-auth.d.ts +0 -17
- package/dist/runtime/schedule-auth.d.ts.map +1 -1
- package/dist/runtime/schedule-auth.js +3 -40
- package/dist/runtime/schedule-auth.js.map +1 -1
- package/dist/runtime/selected-skills-backend.d.ts +3 -3
- package/dist/runtime/selected-skills-backend.d.ts.map +1 -1
- package/dist/runtime/selected-skills-backend.js +5 -5
- package/dist/runtime/selected-skills-backend.js.map +1 -1
- package/dist/runtime/types.d.ts +1 -5
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime-schedules.d.ts +0 -13
- package/dist/runtime-schedules.d.ts.map +1 -1
- package/dist/runtime-schedules.js +22 -86
- package/dist/runtime-schedules.js.map +1 -1
- package/dist/sandbox.d.ts +6 -0
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sandbox.js +7 -3
- package/dist/sandbox.js.map +1 -1
- package/dist/schedule-channel.d.ts +2 -5
- package/dist/schedule-channel.d.ts.map +1 -1
- package/dist/schedule-channel.js +12 -13
- package/dist/schedule-channel.js.map +1 -1
- package/dist/telemetry/lifecycle.d.ts +26 -0
- package/dist/telemetry/lifecycle.d.ts.map +1 -0
- package/dist/telemetry/lifecycle.js +49 -0
- package/dist/telemetry/lifecycle.js.map +1 -0
- package/dist/telemetry/metadata.d.ts.map +1 -1
- package/dist/telemetry/metadata.js +4 -4
- package/dist/telemetry/metadata.js.map +1 -1
- package/dist/telemetry/otel/context.d.ts +57 -0
- package/dist/telemetry/otel/context.d.ts.map +1 -0
- package/dist/telemetry/otel/context.js +122 -0
- package/dist/telemetry/otel/context.js.map +1 -0
- package/dist/telemetry/otel/exporter.d.ts +53 -0
- package/dist/telemetry/otel/exporter.d.ts.map +1 -0
- package/dist/telemetry/otel/exporter.js +190 -0
- package/dist/telemetry/otel/exporter.js.map +1 -0
- package/dist/telemetry/otel/index.d.ts +6 -0
- package/dist/telemetry/otel/index.d.ts.map +1 -0
- package/dist/telemetry/otel/index.js +3 -0
- package/dist/telemetry/otel/index.js.map +1 -0
- package/dist/telemetry/otel/otlp.d.ts +44 -0
- package/dist/telemetry/otel/otlp.d.ts.map +1 -0
- package/dist/telemetry/otel/otlp.js +7 -0
- package/dist/telemetry/otel/otlp.js.map +1 -0
- package/dist/telemetry/otel/truncate.d.ts +10 -0
- package/dist/telemetry/otel/truncate.d.ts.map +1 -0
- package/dist/telemetry/otel/truncate.js +39 -0
- package/dist/telemetry/otel/truncate.js.map +1 -0
- package/dist/telemetry/run-listener.d.ts +1 -1
- package/dist/telemetry/run-listener.d.ts.map +1 -1
- package/dist/telemetry/run-listener.js +32 -2
- package/dist/telemetry/run-listener.js.map +1 -1
- package/dist/telemetry/transport/posthog.d.ts +13 -1
- package/dist/telemetry/transport/posthog.d.ts.map +1 -1
- package/dist/telemetry/transport/posthog.js +68 -30
- package/dist/telemetry/transport/posthog.js.map +1 -1
- package/package.json +11 -11
- package/dist/channels/actor.d.ts +0 -43
- package/dist/channels/actor.d.ts.map +0 -1
- package/dist/channels/actor.js +0 -2
- package/dist/channels/actor.js.map +0 -1
- package/dist/channels/delivery.d.ts +0 -21
- package/dist/channels/delivery.d.ts.map +0 -1
- package/dist/channels/delivery.js +0 -196
- package/dist/channels/delivery.js.map +0 -1
- package/dist/channels/github/connections.d.ts +0 -11
- package/dist/channels/github/connections.d.ts.map +0 -1
- package/dist/channels/github/connections.js +0 -14
- package/dist/channels/github/connections.js.map +0 -1
- package/dist/channels/github/index.d.ts +0 -8
- package/dist/channels/github/index.d.ts.map +0 -1
- package/dist/channels/github/index.js +0 -274
- package/dist/channels/github/index.js.map +0 -1
- package/dist/channels/github/mentions.d.ts +0 -12
- package/dist/channels/github/mentions.d.ts.map +0 -1
- package/dist/channels/github/mentions.js +0 -185
- package/dist/channels/github/mentions.js.map +0 -1
- package/dist/channels/github/schema.d.ts +0 -4165
- package/dist/channels/github/schema.d.ts.map +0 -1
- package/dist/channels/github/schema.js +0 -221
- package/dist/channels/github/schema.js.map +0 -1
- package/dist/channels/github/types.d.ts +0 -163
- package/dist/channels/github/types.d.ts.map +0 -1
- package/dist/channels/github/types.js +0 -2
- package/dist/channels/github/types.js.map +0 -1
- package/dist/channels/http/endpoint.d.ts +0 -95
- package/dist/channels/http/endpoint.d.ts.map +0 -1
- package/dist/channels/http/endpoint.js +0 -276
- package/dist/channels/http/endpoint.js.map +0 -1
- package/dist/channels/http/provider.d.ts +0 -119
- package/dist/channels/http/provider.d.ts.map +0 -1
- package/dist/channels/http/provider.js +0 -227
- package/dist/channels/http/provider.js.map +0 -1
- package/dist/channels/http/studio.d.ts +0 -24
- package/dist/channels/http/studio.d.ts.map +0 -1
- package/dist/channels/http/studio.js +0 -95
- package/dist/channels/http/studio.js.map +0 -1
- package/dist/channels/http/threads.d.ts +0 -7
- package/dist/channels/http/threads.d.ts.map +0 -1
- package/dist/channels/http/threads.js +0 -10
- package/dist/channels/http/threads.js.map +0 -1
- package/dist/channels/linear/connections.d.ts +0 -11
- package/dist/channels/linear/connections.d.ts.map +0 -1
- package/dist/channels/linear/connections.js +0 -14
- package/dist/channels/linear/connections.js.map +0 -1
- package/dist/channels/linear/graphql.d.ts +0 -57
- package/dist/channels/linear/graphql.d.ts.map +0 -1
- package/dist/channels/linear/graphql.js +0 -167
- package/dist/channels/linear/graphql.js.map +0 -1
- package/dist/channels/linear/index.d.ts +0 -9
- package/dist/channels/linear/index.d.ts.map +0 -1
- package/dist/channels/linear/index.js +0 -489
- package/dist/channels/linear/index.js.map +0 -1
- package/dist/channels/linear/schema.d.ts +0 -1050
- package/dist/channels/linear/schema.d.ts.map +0 -1
- package/dist/channels/linear/schema.js +0 -255
- package/dist/channels/linear/schema.js.map +0 -1
- package/dist/channels/linear/types.d.ts +0 -162
- package/dist/channels/linear/types.d.ts.map +0 -1
- package/dist/channels/linear/types.js +0 -2
- package/dist/channels/linear/types.js.map +0 -1
- package/dist/channels/reserved-connections.d.ts +0 -12
- package/dist/channels/reserved-connections.d.ts.map +0 -1
- package/dist/channels/reserved-connections.js +0 -55
- package/dist/channels/reserved-connections.js.map +0 -1
- package/dist/channels/run-input.d.ts +0 -71
- package/dist/channels/run-input.d.ts.map +0 -1
- package/dist/channels/run-input.js +0 -155
- package/dist/channels/run-input.js.map +0 -1
- package/dist/channels/slack/connections.d.ts +0 -6
- package/dist/channels/slack/connections.d.ts.map +0 -1
- package/dist/channels/slack/connections.js +0 -6
- package/dist/channels/slack/connections.js.map +0 -1
- package/dist/channels/slack/events.d.ts +0 -272
- package/dist/channels/slack/events.d.ts.map +0 -1
- package/dist/channels/slack/events.js +0 -235
- package/dist/channels/slack/events.js.map +0 -1
- package/dist/channels/slack/status.d.ts +0 -76
- package/dist/channels/slack/status.d.ts.map +0 -1
- package/dist/channels/slack/status.js +0 -427
- package/dist/channels/slack/status.js.map +0 -1
- package/dist/runtime/channel-icon.d.ts +0 -22
- package/dist/runtime/channel-icon.d.ts.map +0 -1
- package/dist/runtime/channel-icon.js +0 -70
- package/dist/runtime/channel-icon.js.map +0 -1
- package/dist/runtime/managed-thread.d.ts +0 -60
- package/dist/runtime/managed-thread.d.ts.map +0 -1
- package/dist/runtime/managed-thread.js +0 -76
- package/dist/runtime/managed-thread.js.map +0 -1
- package/dist/runtime/thread-record.d.ts +0 -81
- package/dist/runtime/thread-record.d.ts.map +0 -1
- package/dist/runtime/thread-record.js +0 -205
- package/dist/runtime/thread-record.js.map +0 -1
- package/dist/values.d.ts +0 -15
- package/dist/values.d.ts.map +0 -1
- package/dist/values.js +0 -31
- package/dist/values.js.map +0 -1
|
@@ -1,427 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The status a Slack channel shows while a run works: a line, or a list of
|
|
3
|
-
* steps, in place of Trigger Server's own working phrases.
|
|
4
|
-
*
|
|
5
|
-
* It is a courtesy, like `reactions`: a chooser that throws, hangs, or
|
|
6
|
-
* answers with something that is not a status leaves what Slack shows, and
|
|
7
|
-
* posting it never fails or slows the run.
|
|
8
|
-
*/
|
|
9
|
-
import { randomUUID } from "node:crypto";
|
|
10
|
-
import { getConfig } from "@langchain/langgraph";
|
|
11
|
-
import { createMiddleware } from "langchain";
|
|
12
|
-
import { z } from "zod";
|
|
13
|
-
import { logger } from "../../runtime/log.js";
|
|
14
|
-
import { isRecord, nonblankString } from "../../values.js";
|
|
15
|
-
import { resolveChannelBinding } from "../binding.js";
|
|
16
|
-
import { createTriggerClient, } from "../trigger/client.js";
|
|
17
|
-
const STEP_STATUSES = new Set([
|
|
18
|
-
"pending",
|
|
19
|
-
"in_progress",
|
|
20
|
-
"complete",
|
|
21
|
-
"error",
|
|
22
|
-
]);
|
|
23
|
-
/** Slack's limit on a task's or plan's title. */
|
|
24
|
-
const MAX_TITLE_LENGTH = 256;
|
|
25
|
-
/** Slack's limit on a plan's tasks. */
|
|
26
|
-
const MAX_STEPS = 50;
|
|
27
|
-
/** How long a chooser may take before what's shown stays. */
|
|
28
|
-
const CHOOSER_TIMEOUT_MS = 1_000;
|
|
29
|
-
/** How often a chooser is asked again while a model or tool call runs. */
|
|
30
|
-
const HEARTBEAT_MS = 4_000;
|
|
31
|
-
/** The least time between two status updates of a run. */
|
|
32
|
-
const MIN_UPDATE_GAP_MS = 1_000;
|
|
33
|
-
/** How long the end of a run waits for its last status update. */
|
|
34
|
-
const DRAIN_TIMEOUT_MS = 2_000;
|
|
35
|
-
/** Runs whose status is tracked at once; an interrupted run never says it ended. */
|
|
36
|
-
const MAX_TRACKED_RUNS = 256;
|
|
37
|
-
/** `text` on one line, at most Slack's title length; `undefined` when blank. */
|
|
38
|
-
function oneLine(text) {
|
|
39
|
-
const line = text.split(/\s+/u).filter(Boolean).join(" ");
|
|
40
|
-
return line ? [...line].slice(0, MAX_TITLE_LENGTH).join("") : undefined;
|
|
41
|
-
}
|
|
42
|
-
function statusStep(value) {
|
|
43
|
-
if (typeof value === "string") {
|
|
44
|
-
const title = oneLine(value);
|
|
45
|
-
return title === undefined ? undefined : { title, status: "pending" };
|
|
46
|
-
}
|
|
47
|
-
if (!isRecord(value) || typeof value.title !== "string")
|
|
48
|
-
return undefined;
|
|
49
|
-
const title = oneLine(value.title);
|
|
50
|
-
const status = value.status ?? "pending";
|
|
51
|
-
if (title === undefined || typeof status !== "string")
|
|
52
|
-
return undefined;
|
|
53
|
-
if (!STEP_STATUSES.has(status))
|
|
54
|
-
return undefined;
|
|
55
|
-
return { title, status: status };
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* A status value as Trigger Server takes it, or `undefined` when `value` is
|
|
59
|
-
* not one. A plan keeps its first steps, as many as Slack shows.
|
|
60
|
-
*/
|
|
61
|
-
export function slackStatusFields(value) {
|
|
62
|
-
if (typeof value === "string") {
|
|
63
|
-
const text = oneLine(value);
|
|
64
|
-
return text === undefined ? undefined : { message: { text } };
|
|
65
|
-
}
|
|
66
|
-
if (!Array.isArray(value))
|
|
67
|
-
return undefined;
|
|
68
|
-
const steps = [];
|
|
69
|
-
for (const entry of value.slice(0, MAX_STEPS)) {
|
|
70
|
-
const step = statusStep(entry);
|
|
71
|
-
if (!step)
|
|
72
|
-
return undefined;
|
|
73
|
-
steps.push(step);
|
|
74
|
-
}
|
|
75
|
-
return { steps };
|
|
76
|
-
}
|
|
77
|
-
/** Whether `value` is a status value a channel can show. */
|
|
78
|
-
export function isSlackStatusValue(value) {
|
|
79
|
-
return slackStatusFields(value) !== undefined;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* What a run's `run.started` tells Trigger Server about its status: a custom
|
|
83
|
-
* status shows as a plan, whose title is the line, and a fixed one from the
|
|
84
|
-
* start. `undefined` keeps Trigger Server's working phrases.
|
|
85
|
-
*/
|
|
86
|
-
export function startedStatus(choice) {
|
|
87
|
-
if (choice === undefined)
|
|
88
|
-
return undefined;
|
|
89
|
-
if (typeof choice === "function")
|
|
90
|
-
return { display: "plan" };
|
|
91
|
-
return { display: "plan", ...slackStatusFields(choice) };
|
|
92
|
-
}
|
|
93
|
-
/** What a chooser says, as Trigger Server takes it; `null` to leave what's shown. */
|
|
94
|
-
async function chooseStatus(chooser, context, warn) {
|
|
95
|
-
let timer;
|
|
96
|
-
try {
|
|
97
|
-
const chosen = await Promise.race([
|
|
98
|
-
Promise.resolve(chooser(context)),
|
|
99
|
-
new Promise((_, reject) => {
|
|
100
|
-
timer = setTimeout(() => reject(new Error(`timed out after ${CHOOSER_TIMEOUT_MS}ms`)), CHOOSER_TIMEOUT_MS);
|
|
101
|
-
}),
|
|
102
|
-
]);
|
|
103
|
-
// An empty list, as a to-do list is before the agent writes one, leaves
|
|
104
|
-
// what's shown too.
|
|
105
|
-
if (chosen === null || (Array.isArray(chosen) && chosen.length === 0))
|
|
106
|
-
return null;
|
|
107
|
-
const fields = slackStatusFields(chosen);
|
|
108
|
-
if (fields)
|
|
109
|
-
return fields;
|
|
110
|
-
warn("Slack status chooser did not answer with a status line or steps; leaving the status.");
|
|
111
|
-
}
|
|
112
|
-
catch (error) {
|
|
113
|
-
warn(`Slack status chooser failed (${logger.safeErrorLabel(error)}); leaving the status.`);
|
|
114
|
-
}
|
|
115
|
-
finally {
|
|
116
|
-
if (timer !== undefined)
|
|
117
|
-
clearTimeout(timer);
|
|
118
|
-
}
|
|
119
|
-
return null;
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* One run's status updates: one chooser call at a time, at most one update a
|
|
123
|
-
* second, and only when the status changed. Updates are posted in order, in
|
|
124
|
-
* the background; a failed post is logged.
|
|
125
|
-
*/
|
|
126
|
-
class RunStatus {
|
|
127
|
-
#chooser;
|
|
128
|
-
#target;
|
|
129
|
-
/** The newest state not yet shown to the chooser. */
|
|
130
|
-
#pending;
|
|
131
|
-
#draining;
|
|
132
|
-
#shown;
|
|
133
|
-
#updatedAt = 0;
|
|
134
|
-
#closed = false;
|
|
135
|
-
/** Bumped when what the chooser was asked about is out of date. */
|
|
136
|
-
#generation = 0;
|
|
137
|
-
#warned = false;
|
|
138
|
-
#wake;
|
|
139
|
-
/** The model and tool calls under way, and the state the heartbeat asks with. */
|
|
140
|
-
#calls = 0;
|
|
141
|
-
#callState;
|
|
142
|
-
#heartbeat;
|
|
143
|
-
constructor(chooser, target) {
|
|
144
|
-
this.#chooser = chooser;
|
|
145
|
-
this.#target = target;
|
|
146
|
-
}
|
|
147
|
-
/** Ask the chooser about `state`, once the previous call is done. */
|
|
148
|
-
update(state) {
|
|
149
|
-
if (this.#closed)
|
|
150
|
-
return;
|
|
151
|
-
this.#pending = state;
|
|
152
|
-
this.#draining ??= this.#drain().finally(() => {
|
|
153
|
-
this.#draining = undefined;
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
/** Run a model or tool call, asking the chooser again while it runs. */
|
|
157
|
-
async during(state, call) {
|
|
158
|
-
this.#calls += 1;
|
|
159
|
-
this.#callState = state;
|
|
160
|
-
if (this.#calls === 1 && !this.#closed) {
|
|
161
|
-
this.#heartbeat = setInterval(() => {
|
|
162
|
-
if (this.#callState)
|
|
163
|
-
this.update(this.#callState);
|
|
164
|
-
}, HEARTBEAT_MS);
|
|
165
|
-
this.#heartbeat.unref?.();
|
|
166
|
-
}
|
|
167
|
-
try {
|
|
168
|
-
return await call();
|
|
169
|
-
}
|
|
170
|
-
catch (error) {
|
|
171
|
-
// The run is failing, interrupted, or cancelled, and may never reach
|
|
172
|
-
// `afterAgent`: show nothing more, as Trigger Server hears it ended.
|
|
173
|
-
this.close();
|
|
174
|
-
throw error;
|
|
175
|
-
}
|
|
176
|
-
finally {
|
|
177
|
-
this.#calls -= 1;
|
|
178
|
-
if (this.#calls === 0) {
|
|
179
|
-
this.#stopHeartbeat();
|
|
180
|
-
this.#dropStale();
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
/** Whether the run's status updates are over. */
|
|
185
|
-
get closed() {
|
|
186
|
-
return this.#closed;
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* A finished call leaves what was asked during it out of date. The next
|
|
190
|
-
* hook asks again, unless the run stops first, as an interrupt in a later
|
|
191
|
-
* hook stops it.
|
|
192
|
-
*/
|
|
193
|
-
#dropStale() {
|
|
194
|
-
this.#pending = undefined;
|
|
195
|
-
this.#generation += 1;
|
|
196
|
-
this.#wake?.();
|
|
197
|
-
}
|
|
198
|
-
/** Stop asking, and wait a little for an update already on its way. */
|
|
199
|
-
async close() {
|
|
200
|
-
this.#closed = true;
|
|
201
|
-
this.#pending = undefined;
|
|
202
|
-
this.#stopHeartbeat();
|
|
203
|
-
this.#wake?.();
|
|
204
|
-
const draining = this.#draining;
|
|
205
|
-
if (!draining)
|
|
206
|
-
return;
|
|
207
|
-
let timer;
|
|
208
|
-
await Promise.race([
|
|
209
|
-
draining,
|
|
210
|
-
new Promise((resolve) => {
|
|
211
|
-
timer = setTimeout(resolve, DRAIN_TIMEOUT_MS);
|
|
212
|
-
}),
|
|
213
|
-
]);
|
|
214
|
-
clearTimeout(timer);
|
|
215
|
-
}
|
|
216
|
-
#stopHeartbeat() {
|
|
217
|
-
if (this.#heartbeat !== undefined)
|
|
218
|
-
clearInterval(this.#heartbeat);
|
|
219
|
-
this.#heartbeat = undefined;
|
|
220
|
-
this.#callState = undefined;
|
|
221
|
-
}
|
|
222
|
-
async #drain() {
|
|
223
|
-
while (this.#pending !== undefined && !this.#closed) {
|
|
224
|
-
await this.#gap();
|
|
225
|
-
const state = this.#pending;
|
|
226
|
-
this.#pending = undefined;
|
|
227
|
-
if (state === undefined || this.#closed)
|
|
228
|
-
return;
|
|
229
|
-
const generation = this.#generation;
|
|
230
|
-
const fields = await chooseStatus(this.#chooser, { state }, (message) => this.#warnOnce(message));
|
|
231
|
-
if (fields === null || this.#closed)
|
|
232
|
-
continue;
|
|
233
|
-
if (generation !== this.#generation)
|
|
234
|
-
continue;
|
|
235
|
-
const shown = JSON.stringify(fields);
|
|
236
|
-
if (shown === this.#shown)
|
|
237
|
-
continue;
|
|
238
|
-
this.#updatedAt = Date.now();
|
|
239
|
-
// Only a status Trigger Server took counts as shown; a failed one is
|
|
240
|
-
// posted again when the chooser answers it again.
|
|
241
|
-
if (await this.#post(fields))
|
|
242
|
-
this.#shown = shown;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
/** Wait out the least time between updates; closing ends the wait. */
|
|
246
|
-
async #gap() {
|
|
247
|
-
const wait = this.#updatedAt + MIN_UPDATE_GAP_MS - Date.now();
|
|
248
|
-
if (wait <= 0)
|
|
249
|
-
return;
|
|
250
|
-
await new Promise((resolve) => {
|
|
251
|
-
const timer = setTimeout(resolve, wait);
|
|
252
|
-
this.#wake = () => {
|
|
253
|
-
clearTimeout(timer);
|
|
254
|
-
resolve();
|
|
255
|
-
};
|
|
256
|
-
});
|
|
257
|
-
this.#wake = undefined;
|
|
258
|
-
}
|
|
259
|
-
async #post(fields) {
|
|
260
|
-
const target = this.#target;
|
|
261
|
-
try {
|
|
262
|
-
await target.client.postRuntimeEvent(target.channelId, {
|
|
263
|
-
id: randomUUID(),
|
|
264
|
-
type: "run.thinking",
|
|
265
|
-
delivery_id: target.deliveryId,
|
|
266
|
-
source_thread_key: target.sourceThreadKey,
|
|
267
|
-
address: target.address,
|
|
268
|
-
run_thread_id: target.threadId,
|
|
269
|
-
run_id: target.runId,
|
|
270
|
-
display: "plan",
|
|
271
|
-
...fields,
|
|
272
|
-
});
|
|
273
|
-
return true;
|
|
274
|
-
}
|
|
275
|
-
catch (error) {
|
|
276
|
-
logger.warn(`Slack status update failed (${logger.safeErrorLabel(error)}).`);
|
|
277
|
-
return false;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
/** A broken chooser fails on every call; say so once per run. */
|
|
281
|
-
#warnOnce(message) {
|
|
282
|
-
if (this.#warned)
|
|
283
|
-
return;
|
|
284
|
-
this.#warned = true;
|
|
285
|
-
logger.warn(message);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
function currentConfig() {
|
|
289
|
-
try {
|
|
290
|
-
return getConfig();
|
|
291
|
-
}
|
|
292
|
-
catch {
|
|
293
|
-
// Outside a runnable context.
|
|
294
|
-
return undefined;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
/** The run's Trigger Slack delivery, verified against the run's own source. */
|
|
298
|
-
function statusTarget(binding, config) {
|
|
299
|
-
const target = binding.target;
|
|
300
|
-
const runId = nonblankString(config.metadata?.run_id);
|
|
301
|
-
const threadId = nonblankString(config.configurable?.thread_id);
|
|
302
|
-
if (!runId || !threadId || !isRecord(target.address))
|
|
303
|
-
return undefined;
|
|
304
|
-
return {
|
|
305
|
-
channelId: target.channel_id,
|
|
306
|
-
address: target.address,
|
|
307
|
-
deliveryId: binding.deliveryId,
|
|
308
|
-
sourceThreadKey: binding.sourceThreadKey,
|
|
309
|
-
runId,
|
|
310
|
-
threadId,
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
/** LangGraph's checkpoint namespaces nest with `|`. */
|
|
314
|
-
function nestedGraph(config) {
|
|
315
|
-
const namespace = config.configurable?.checkpoint_ns;
|
|
316
|
-
return typeof namespace === "string" && namespace.includes("|");
|
|
317
|
-
}
|
|
318
|
-
function statusState(state) {
|
|
319
|
-
return state;
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* The state fields a chooser reads beyond `messages`. LangChain hands a
|
|
323
|
-
* middleware only the fields it declares, so without this a chooser never
|
|
324
|
-
* saw the to-do list. It is the to-do list middleware's own schema, so
|
|
325
|
-
* declaring it again changes nothing for agents that keep one.
|
|
326
|
-
*/
|
|
327
|
-
const statusStateSchema = z.object({
|
|
328
|
-
todos: z
|
|
329
|
-
.array(z.object({
|
|
330
|
-
content: z.string(),
|
|
331
|
-
status: z.enum(["pending", "in_progress", "completed"]),
|
|
332
|
-
}))
|
|
333
|
-
.default([]),
|
|
334
|
-
});
|
|
335
|
-
/**
|
|
336
|
-
* Show what each Slack channel's status chooser says while a run of the
|
|
337
|
-
* channel works. Runs from other channels, and channels with a fixed status
|
|
338
|
-
* or none, pass through: `run.started` carries a fixed status.
|
|
339
|
-
*/
|
|
340
|
-
export function createSlackStatusMiddleware(channels) {
|
|
341
|
-
const choosers = new Map();
|
|
342
|
-
for (const channel of channels) {
|
|
343
|
-
const status = channel.status;
|
|
344
|
-
if (channel.kind === "slack" &&
|
|
345
|
-
channel.name &&
|
|
346
|
-
typeof status === "function")
|
|
347
|
-
choosers.set(channel.name, status);
|
|
348
|
-
}
|
|
349
|
-
const runs = new Map();
|
|
350
|
-
/**
|
|
351
|
-
* The current run's status updates, when its channel has a chooser; new
|
|
352
|
-
* ones only with `start`.
|
|
353
|
-
*/
|
|
354
|
-
const currentRun = (start = true) => {
|
|
355
|
-
const config = currentConfig();
|
|
356
|
-
// A subagent forked inside a tool call shares the run's config; only the
|
|
357
|
-
// run's own agent, at the root of its graph, shows the status.
|
|
358
|
-
if (!config || nestedGraph(config))
|
|
359
|
-
return undefined;
|
|
360
|
-
const binding = resolveChannelBinding(config.context, config.configurable);
|
|
361
|
-
if (!binding || binding.transport !== "trigger_server")
|
|
362
|
-
return undefined;
|
|
363
|
-
const chooser = choosers.get(binding.name);
|
|
364
|
-
const target = chooser && statusTarget(binding, config);
|
|
365
|
-
if (!chooser || !target)
|
|
366
|
-
return undefined;
|
|
367
|
-
const key = target.runId;
|
|
368
|
-
let run = runs.get(key);
|
|
369
|
-
if (run?.closed) {
|
|
370
|
-
runs.delete(key);
|
|
371
|
-
run = undefined;
|
|
372
|
-
}
|
|
373
|
-
if (!run) {
|
|
374
|
-
if (!start)
|
|
375
|
-
return undefined;
|
|
376
|
-
const client = createTriggerClient();
|
|
377
|
-
if (!client)
|
|
378
|
-
return undefined;
|
|
379
|
-
if (runs.size >= MAX_TRACKED_RUNS) {
|
|
380
|
-
const [oldest, stale] = runs.entries().next().value;
|
|
381
|
-
runs.delete(oldest);
|
|
382
|
-
// Not awaited: it only stops the stale run's heartbeat.
|
|
383
|
-
stale.close();
|
|
384
|
-
}
|
|
385
|
-
run = new RunStatus(chooser, { client, ...target });
|
|
386
|
-
runs.set(key, run);
|
|
387
|
-
}
|
|
388
|
-
return { key, run };
|
|
389
|
-
};
|
|
390
|
-
const update = (state) => {
|
|
391
|
-
currentRun()?.run.update(statusState(state));
|
|
392
|
-
return undefined;
|
|
393
|
-
};
|
|
394
|
-
return createMiddleware({
|
|
395
|
-
name: "mda-slack-status",
|
|
396
|
-
stateSchema: statusStateSchema,
|
|
397
|
-
beforeAgent: update,
|
|
398
|
-
beforeModel: update,
|
|
399
|
-
afterModel: update,
|
|
400
|
-
async afterAgent() {
|
|
401
|
-
const current = currentRun(false);
|
|
402
|
-
if (!current)
|
|
403
|
-
return undefined;
|
|
404
|
-
runs.delete(current.key);
|
|
405
|
-
await current.run.close();
|
|
406
|
-
return undefined;
|
|
407
|
-
},
|
|
408
|
-
async wrapModelCall(request, handler) {
|
|
409
|
-
const current = currentRun();
|
|
410
|
-
return current
|
|
411
|
-
? current.run.during(statusState(request.state), async () => handler(request))
|
|
412
|
-
: handler(request);
|
|
413
|
-
},
|
|
414
|
-
async wrapToolCall(request, handler) {
|
|
415
|
-
const current = currentRun();
|
|
416
|
-
return current
|
|
417
|
-
? current.run.during(statusState(request.state), async () => handler(request))
|
|
418
|
-
: handler(request);
|
|
419
|
-
},
|
|
420
|
-
});
|
|
421
|
-
}
|
|
422
|
-
/** Whether a channel's status needs the status middleware in its runs. */
|
|
423
|
-
export function hasSlackStatusChooser(channels) {
|
|
424
|
-
return channels.some((channel) => channel.kind === "slack" &&
|
|
425
|
-
typeof channel.status === "function");
|
|
426
|
-
}
|
|
427
|
-
//# sourceMappingURL=status.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/channels/slack/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/** Largest icon a channel serves. */
|
|
2
|
-
export declare const CHANNEL_ICON_MAX_BYTES: number;
|
|
3
|
-
/** A channel icon read from the project, ready to serve. */
|
|
4
|
-
export interface ChannelIcon {
|
|
5
|
-
bytes: Uint8Array;
|
|
6
|
-
contentType: string;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Check an icon option: a path relative to the project's `channels/`, such as
|
|
10
|
-
* `assets/icon.png`, of a PNG or JPEG image, as for the Slack channel's icon.
|
|
11
|
-
* Returns the path with `/` separators.
|
|
12
|
-
*/
|
|
13
|
-
export declare function validateChannelIconPath(path: string, option: string): string;
|
|
14
|
-
/**
|
|
15
|
-
* Read a channel's icon from `channels/` in the project at `root`. Only a PNG
|
|
16
|
-
* or JPEG file inside `channels/`, of at most {@link CHANNEL_ICON_MAX_BYTES},
|
|
17
|
-
* whose content matches its extension, is served; anything else throws.
|
|
18
|
-
*/
|
|
19
|
-
export declare function loadChannelIcon(root: string, path: string): ChannelIcon;
|
|
20
|
-
/** Headers for a served icon: an image that never runs as a page. */
|
|
21
|
-
export declare function channelIconHeaders(icon: ChannelIcon): Record<string, string>;
|
|
22
|
-
//# sourceMappingURL=channel-icon.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"channel-icon.d.ts","sourceRoot":"","sources":["../../src/runtime/channel-icon.ts"],"names":[],"mappings":"AAGA,qCAAqC;AACrC,eAAO,MAAM,sBAAsB,QAAc,CAAC;AAalD,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AASD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAgB5E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAuBvE;AAED,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQ5E"}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { readFileSync, realpathSync, statSync } from "node:fs";
|
|
2
|
-
import { isAbsolute, relative, resolve, sep } from "node:path";
|
|
3
|
-
/** Largest icon a channel serves. */
|
|
4
|
-
export const CHANNEL_ICON_MAX_BYTES = 1024 * 1024;
|
|
5
|
-
const ICON_TYPES = {
|
|
6
|
-
png: {
|
|
7
|
-
contentType: "image/png",
|
|
8
|
-
magic: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a],
|
|
9
|
-
},
|
|
10
|
-
jpg: { contentType: "image/jpeg", magic: [0xff, 0xd8, 0xff] },
|
|
11
|
-
jpeg: { contentType: "image/jpeg", magic: [0xff, 0xd8, 0xff] },
|
|
12
|
-
};
|
|
13
|
-
function iconExtension(path) {
|
|
14
|
-
const extension = /\.([a-z]+)$/i.exec(path)?.[1]?.toLowerCase();
|
|
15
|
-
return extension && Object.hasOwn(ICON_TYPES, extension)
|
|
16
|
-
? extension
|
|
17
|
-
: undefined;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Check an icon option: a path relative to the project's `channels/`, such as
|
|
21
|
-
* `assets/icon.png`, of a PNG or JPEG image, as for the Slack channel's icon.
|
|
22
|
-
* Returns the path with `/` separators.
|
|
23
|
-
*/
|
|
24
|
-
export function validateChannelIconPath(path, option) {
|
|
25
|
-
const trimmed = path.trim();
|
|
26
|
-
const segments = trimmed.split("/");
|
|
27
|
-
if (!trimmed ||
|
|
28
|
-
isAbsolute(trimmed) ||
|
|
29
|
-
trimmed.includes("\\") ||
|
|
30
|
-
segments.some((segment) => !segment || segment === "." || segment === "..") ||
|
|
31
|
-
!iconExtension(trimmed))
|
|
32
|
-
throw new TypeError(`${option} must be a path relative to channels/, such as assets/icon.png, of a PNG or JPEG image`);
|
|
33
|
-
return trimmed;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Read a channel's icon from `channels/` in the project at `root`. Only a PNG
|
|
37
|
-
* or JPEG file inside `channels/`, of at most {@link CHANNEL_ICON_MAX_BYTES},
|
|
38
|
-
* whose content matches its extension, is served; anything else throws.
|
|
39
|
-
*/
|
|
40
|
-
export function loadChannelIcon(root, path) {
|
|
41
|
-
const relativePath = validateChannelIconPath(path, "icon");
|
|
42
|
-
const extension = iconExtension(relativePath);
|
|
43
|
-
const realRoot = realpathSync(resolve(root, "channels"));
|
|
44
|
-
// Resolve links before the containment check, so none leads out.
|
|
45
|
-
const file = realpathSync(resolve(realRoot, relativePath));
|
|
46
|
-
const inside = relative(realRoot, file);
|
|
47
|
-
if (!inside || inside.split(sep)[0] === ".." || isAbsolute(inside))
|
|
48
|
-
throw new Error("icon is outside channels/");
|
|
49
|
-
const stats = statSync(file);
|
|
50
|
-
if (!stats.isFile() ||
|
|
51
|
-
stats.size === 0 ||
|
|
52
|
-
stats.size > CHANNEL_ICON_MAX_BYTES)
|
|
53
|
-
throw new Error(`icon must be a file of at most ${CHANNEL_ICON_MAX_BYTES} bytes`);
|
|
54
|
-
const bytes = new Uint8Array(readFileSync(file));
|
|
55
|
-
const { contentType, magic } = ICON_TYPES[extension];
|
|
56
|
-
if (!magic.every((byte, index) => bytes[index] === byte))
|
|
57
|
-
throw new Error(`icon is not a ${extension.toUpperCase()} image`);
|
|
58
|
-
return { bytes, contentType };
|
|
59
|
-
}
|
|
60
|
-
/** Headers for a served icon: an image that never runs as a page. */
|
|
61
|
-
export function channelIconHeaders(icon) {
|
|
62
|
-
return {
|
|
63
|
-
"Content-Type": icon.contentType,
|
|
64
|
-
"Content-Length": String(icon.bytes.byteLength),
|
|
65
|
-
"Cache-Control": "public, max-age=3600",
|
|
66
|
-
"Content-Security-Policy": "default-src 'none'",
|
|
67
|
-
"X-Content-Type-Options": "nosniff",
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=channel-icon.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"channel-icon.js","sourceRoot":"","sources":["../../src/runtime/channel-icon.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { type ChannelBinding } from "../channels/binding.js";
|
|
2
|
-
import type { ChannelEvent, JsonValue, RuntimeChannel } from "../channels/types.js";
|
|
3
|
-
import { type OriginBinding } from "./thread-record.js";
|
|
4
|
-
/** A person on the thread. */
|
|
5
|
-
export interface ThreadParticipant {
|
|
6
|
-
/** Their `principal.id`, the same as `runtime.serverInfo.principal.id`. */
|
|
7
|
-
readonly id: string;
|
|
8
|
-
/** The first person on a thread owns it; everyone after is a member. */
|
|
9
|
-
readonly role: "owner" | "member";
|
|
10
|
-
}
|
|
11
|
-
/** The channel conversation a thread came from. */
|
|
12
|
-
export interface ThreadOrigin {
|
|
13
|
-
/** Where answers go. Its `event` is set only in the run the event started. */
|
|
14
|
-
readonly channel: RuntimeChannel;
|
|
15
|
-
/** Who sent the latest channel event, or `null` when that was not a person. */
|
|
16
|
-
readonly sender: ThreadParticipant | null;
|
|
17
|
-
}
|
|
18
|
-
/** The thread a run is on. */
|
|
19
|
-
export interface ManagedThread {
|
|
20
|
-
/** The LangGraph thread id. */
|
|
21
|
-
readonly id: string;
|
|
22
|
-
/** `null` on a thread no channel event reached. */
|
|
23
|
-
readonly origin: ThreadOrigin | null;
|
|
24
|
-
/** The people on the thread, in the order they joined. */
|
|
25
|
-
readonly participants: readonly ThreadParticipant[];
|
|
26
|
-
}
|
|
27
|
-
/** A run's thread, with the binding its origin posts through. */
|
|
28
|
-
export interface RunThread {
|
|
29
|
-
/** Absent only when the run has no thread id, such as a direct invoke. */
|
|
30
|
-
thread?: ManagedThread;
|
|
31
|
-
/** The origin's channel, also without a thread id. */
|
|
32
|
-
channel?: RuntimeChannel;
|
|
33
|
-
origin?: OriginBinding & {
|
|
34
|
-
event: ChannelEvent | null;
|
|
35
|
-
rawEvent?: JsonValue;
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Build a run's thread from its config. The origin is the event's own
|
|
40
|
-
* channel when ingress delivered one; otherwise the record's.
|
|
41
|
-
*
|
|
42
|
-
* The record comes from the run's metadata, which merges the thread's. The
|
|
43
|
-
* auth handler strips record keys from every write except managed ingress's,
|
|
44
|
-
* and in-process `/noauth` calls come from the agent's own trusted code.
|
|
45
|
-
*/
|
|
46
|
-
export declare function resolveRunThread(input: {
|
|
47
|
-
configurable: Record<string, unknown> | undefined;
|
|
48
|
-
metadata: unknown;
|
|
49
|
-
/** The delivery the run's ingress verified. */
|
|
50
|
-
binding?: ChannelBinding;
|
|
51
|
-
}): RunThread;
|
|
52
|
-
/**
|
|
53
|
-
* The thread the run built when it started, else one built from a tool or
|
|
54
|
-
* middleware runtime and the running LangGraph node.
|
|
55
|
-
*/
|
|
56
|
-
export declare function currentRunThread(runtime: {
|
|
57
|
-
context?: unknown;
|
|
58
|
-
config?: unknown;
|
|
59
|
-
} | undefined, configurable: Record<string, unknown> | undefined): RunThread;
|
|
60
|
-
//# sourceMappingURL=managed-thread.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"managed-thread.d.ts","sourceRoot":"","sources":["../../src/runtime/managed-thread.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE3E,8BAA8B;AAC9B,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;CACnC;AAED,mDAAmD;AACnD,MAAM,WAAW,YAAY;IAC3B,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC3C;AAED,8BAA8B;AAC9B,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IACrC,0DAA0D;IAC1D,QAAQ,CAAC,YAAY,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACrD;AAED,iEAAiE;AACjE,MAAM,WAAW,SAAS;IACxB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,sDAAsD;IACtD,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,MAAM,CAAC,EAAE,aAAa,GAAG;QAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;CAC/E;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAClD,QAAQ,EAAE,OAAO,CAAC;IAClB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B,GAAG,SAAS,CAyBZ;AAwBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,EAC5D,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAChD,SAAS,CAaX"}
|