@agentick/connector 0.5.0

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.
@@ -0,0 +1,125 @@
1
+ import { isToolUseBlock } from "@agentick/shared";
2
+ /**
3
+ * Default tool summaries for common tools.
4
+ * Returns null for unknown tools (falls through to generic summary).
5
+ */
6
+ const filePathSummary = (verb) => (i) => `[${verb} ${i.path ?? i.file_path ?? "a file"}]`;
7
+ const shellSummary = (i) => {
8
+ const cmd = i.command;
9
+ if (typeof cmd === "string") {
10
+ const short = cmd.length > 50 ? cmd.slice(0, 50) + "..." : cmd;
11
+ return `[Ran: ${short}]`;
12
+ }
13
+ return `[Ran a command]`;
14
+ };
15
+ const searchFileSummary = (i) => `[Searched for files matching "${i.pattern ?? "..."}"]`;
16
+ const searchContentSummary = (i) => `[Searched for "${i.pattern ?? "..."}" in files]`;
17
+ const DEFAULT_SUMMARIES = {
18
+ // Lookup is case-insensitive via lowercasing, so only need lowercase keys.
19
+ // Tool names like "ReadFile" become "readfile", "read_file" stays "read_file".
20
+ glob: searchFileSummary,
21
+ grep: searchContentSummary,
22
+ read_file: filePathSummary("Read"),
23
+ readfile: filePathSummary("Read"),
24
+ write_file: filePathSummary("Wrote"),
25
+ writefile: filePathSummary("Wrote"),
26
+ edit_file: filePathSummary("Edited"),
27
+ editfile: filePathSummary("Edited"),
28
+ shell: shellSummary,
29
+ };
30
+ /**
31
+ * Create a tool summarizer with optional custom overrides.
32
+ * Custom summaries are checked first, then defaults, then generic fallback.
33
+ */
34
+ export function createToolSummarizer(custom) {
35
+ return (name, input) => {
36
+ const lower = name.toLowerCase();
37
+ // Custom overrides first
38
+ if (custom?.[lower])
39
+ return custom[lower](input);
40
+ if (custom?.[name])
41
+ return custom[name](input);
42
+ // Built-in defaults
43
+ if (DEFAULT_SUMMARIES[lower])
44
+ return DEFAULT_SUMMARIES[lower](input);
45
+ // Generic fallback
46
+ return `[Used ${name}]`;
47
+ };
48
+ }
49
+ /** Default summarizer instance. */
50
+ const defaultSummarizer = createToolSummarizer();
51
+ /**
52
+ * Build a filter function from a ContentPolicy.
53
+ */
54
+ export function buildContentFilter(policy, toolSummarizer) {
55
+ if (typeof policy === "function")
56
+ return policy;
57
+ const summarize = toolSummarizer ?? defaultSummarizer;
58
+ switch (policy) {
59
+ case "full":
60
+ return (msg) => msg;
61
+ case "text-only":
62
+ return filterTextOnly;
63
+ case "summarized":
64
+ return (msg) => filterSummarized(msg, summarize);
65
+ }
66
+ }
67
+ /**
68
+ * Strip tool_use and tool_result blocks, keeping text and images.
69
+ */
70
+ function filterTextOnly(message) {
71
+ if (typeof message.content === "string")
72
+ return message;
73
+ const filtered = message.content.filter((block) => block.type === "text" || block.type === "image");
74
+ if (filtered.length === 0)
75
+ return null;
76
+ return {
77
+ ...message,
78
+ content: filtered,
79
+ toolCalls: undefined,
80
+ };
81
+ }
82
+ /**
83
+ * Collapse tool_use blocks into brief text summaries, keep text content.
84
+ */
85
+ function filterSummarized(message, summarize) {
86
+ if (typeof message.content === "string")
87
+ return message;
88
+ const blocks = [];
89
+ for (const block of message.content) {
90
+ if (block.type === "text" || block.type === "image") {
91
+ blocks.push(block);
92
+ }
93
+ else if (isToolUseBlock(block)) {
94
+ const summary = summarize(block.name, block.input);
95
+ blocks.push({ type: "text", text: summary });
96
+ }
97
+ // tool_result blocks are dropped — the summary from tool_use is enough
98
+ }
99
+ if (blocks.length === 0)
100
+ return null;
101
+ return {
102
+ ...message,
103
+ content: blocks,
104
+ toolCalls: undefined,
105
+ };
106
+ }
107
+ /**
108
+ * Apply the content filter to a batch of messages.
109
+ * Returns only messages that survive filtering.
110
+ */
111
+ export function applyContentPolicy(messages, filter) {
112
+ const result = [];
113
+ for (const msg of messages) {
114
+ // Only filter assistant messages — user messages pass through
115
+ if (msg.role === "user") {
116
+ result.push(msg);
117
+ continue;
118
+ }
119
+ const filtered = filter(msg);
120
+ if (filtered)
121
+ result.push(filtered);
122
+ }
123
+ return result;
124
+ }
125
+ //# sourceMappingURL=content-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-pipeline.js","sourceRoot":"","sources":["../src/content-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { AgentickClient } from "@agentick/client";
2
+ import type { ConnectorConfig, ConnectorPlatform, ConnectorStatus, ConnectorStatusEvent } from "./types.js";
3
+ export interface ConnectorHandle {
4
+ start(): Promise<void>;
5
+ stop(): Promise<void>;
6
+ readonly status: ConnectorStatus;
7
+ onStatus(handler: (event: ConnectorStatusEvent) => void): () => void;
8
+ }
9
+ /**
10
+ * Wire a platform adapter to an Agentick session.
11
+ *
12
+ * Creates a ConnectorSession, builds the bridge, and hands it to the platform.
13
+ * Returns start/stop controls with status reporting.
14
+ */
15
+ export declare function createConnector(client: AgentickClient, platform: ConnectorPlatform, config: ConnectorConfig): ConnectorHandle;
16
+ //# sourceMappingURL=create-connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-connector.d.ts","sourceRoot":"","sources":["../src/create-connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EAEjB,eAAe,EACf,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,eAAe;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACtE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,eAAe,GACtB,eAAe,CA6EjB"}
@@ -0,0 +1,83 @@
1
+ import { ConnectorSession } from "./connector-session.js";
2
+ /**
3
+ * Wire a platform adapter to an Agentick session.
4
+ *
5
+ * Creates a ConnectorSession, builds the bridge, and hands it to the platform.
6
+ * Returns start/stop controls with status reporting.
7
+ */
8
+ export function createConnector(client, platform, config) {
9
+ let session = null;
10
+ // Own listener set — survives start/stop cycles, unsubs always work
11
+ const statusListeners = new Set();
12
+ return {
13
+ async start() {
14
+ session = new ConnectorSession(client, config);
15
+ // Fan out session status events to our own listeners
16
+ session.onStatus((event) => {
17
+ for (const listener of statusListeners) {
18
+ listener(event);
19
+ }
20
+ });
21
+ const bridge = {
22
+ send(text) {
23
+ session?.send(text);
24
+ },
25
+ sendInput(input) {
26
+ session?.sendInput(input);
27
+ },
28
+ onDeliver(handler) {
29
+ if (!session)
30
+ return () => { };
31
+ return session.onDeliver(handler);
32
+ },
33
+ onConfirmation(handler) {
34
+ if (!session)
35
+ return () => { };
36
+ return session.onConfirmation(handler);
37
+ },
38
+ reportStatus(status, error) {
39
+ session?.reportStatus(status, error);
40
+ },
41
+ onExecutionStart(handler) {
42
+ if (!session)
43
+ return () => { };
44
+ return session.onExecutionStart(handler);
45
+ },
46
+ onExecutionEnd(handler) {
47
+ if (!session)
48
+ return () => { };
49
+ return session.onExecutionEnd(handler);
50
+ },
51
+ abort(reason) {
52
+ session?.abort(reason);
53
+ },
54
+ destroy() {
55
+ session?.destroy();
56
+ session = null;
57
+ },
58
+ };
59
+ try {
60
+ await platform.start(bridge);
61
+ }
62
+ catch (err) {
63
+ session.reportStatus("error", err);
64
+ session.destroy();
65
+ session = null;
66
+ throw err;
67
+ }
68
+ },
69
+ async stop() {
70
+ await platform.stop();
71
+ session?.destroy();
72
+ session = null;
73
+ },
74
+ get status() {
75
+ return session?.status ?? "disconnected";
76
+ },
77
+ onStatus(handler) {
78
+ statusListeners.add(handler);
79
+ return () => statusListeners.delete(handler);
80
+ },
81
+ };
82
+ }
83
+ //# sourceMappingURL=create-connector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-connector.js","sourceRoot":"","sources":["../src/create-connector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { DeliveryStrategy, RateLimitConfig } from "./types.js";
2
+ export interface DeliveryBufferOptions {
3
+ strategy: DeliveryStrategy;
4
+ debounceMs: number;
5
+ onDeliver: () => void;
6
+ }
7
+ /**
8
+ * Controls when outbound messages are delivered to the platform.
9
+ *
10
+ * - `"immediate"` — calls onDeliver on every poke
11
+ * - `"on-idle"` — calls onDeliver only when markIdle() is called
12
+ * - `"debounced"` — calls onDeliver after debounceMs of no pokes
13
+ */
14
+ export declare class DeliveryBuffer {
15
+ private readonly _strategy;
16
+ private readonly _debounceMs;
17
+ private readonly _onDeliver;
18
+ private _timer;
19
+ private _hasPending;
20
+ constructor(options: DeliveryBufferOptions);
21
+ /**
22
+ * Signal that new content is available.
23
+ */
24
+ poke(): void;
25
+ /**
26
+ * Signal that execution is complete (idle).
27
+ * For "on-idle" strategy, this triggers delivery.
28
+ * For "debounced", this flushes immediately if anything is pending.
29
+ */
30
+ markIdle(): void;
31
+ /**
32
+ * Force immediate delivery of any pending content.
33
+ */
34
+ flush(): void;
35
+ destroy(): void;
36
+ private _deliver;
37
+ private _resetTimer;
38
+ private _clearTimer;
39
+ }
40
+ /**
41
+ * Sliding-window rate limiter for inbound messages.
42
+ * Tracks per-minute and per-day counts.
43
+ */
44
+ export declare class RateLimiter {
45
+ private readonly _maxPerMinute;
46
+ private readonly _maxPerDay;
47
+ private readonly _onLimited?;
48
+ private _minuteTimestamps;
49
+ private _dayCount;
50
+ private _dayStart;
51
+ constructor(config: RateLimitConfig);
52
+ /**
53
+ * Check if a message should be allowed through.
54
+ * Returns `{ allowed: true }` or `{ allowed: false, reply?: string }`.
55
+ */
56
+ check(): {
57
+ allowed: true;
58
+ } | {
59
+ allowed: false;
60
+ reply?: string;
61
+ };
62
+ }
63
+ //# sourceMappingURL=delivery-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-buffer.d.ts","sourceRoot":"","sources":["../src/delivery-buffer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAMpE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;;;;;GAMG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,MAAM,CAA8C;IAC5D,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,qBAAqB;IAM1C;;OAEG;IACH,IAAI,IAAI,IAAI;IAgBZ;;;;OAIG;IACH,QAAQ,IAAI,IAAI;IAOhB;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,WAAW;CAMpB;AAMD;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAA+B;IAC3D,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAK;gBAEV,MAAM,EAAE,eAAe;IAOnC;;;OAGG;IACH,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;CAmChE"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Controls when outbound messages are delivered to the platform.
3
+ *
4
+ * - `"immediate"` — calls onDeliver on every poke
5
+ * - `"on-idle"` — calls onDeliver only when markIdle() is called
6
+ * - `"debounced"` — calls onDeliver after debounceMs of no pokes
7
+ */
8
+ export class DeliveryBuffer {
9
+ _strategy;
10
+ _debounceMs;
11
+ _onDeliver;
12
+ _timer = null;
13
+ _hasPending = false;
14
+ constructor(options) {
15
+ this._strategy = options.strategy;
16
+ this._debounceMs = options.debounceMs;
17
+ this._onDeliver = options.onDeliver;
18
+ }
19
+ /**
20
+ * Signal that new content is available.
21
+ */
22
+ poke() {
23
+ this._hasPending = true;
24
+ switch (this._strategy) {
25
+ case "immediate":
26
+ this._deliver();
27
+ break;
28
+ case "on-idle":
29
+ // Wait for markIdle()
30
+ break;
31
+ case "debounced":
32
+ this._resetTimer();
33
+ break;
34
+ }
35
+ }
36
+ /**
37
+ * Signal that execution is complete (idle).
38
+ * For "on-idle" strategy, this triggers delivery.
39
+ * For "debounced", this flushes immediately if anything is pending.
40
+ */
41
+ markIdle() {
42
+ if (this._hasPending) {
43
+ this._clearTimer();
44
+ this._deliver();
45
+ }
46
+ }
47
+ /**
48
+ * Force immediate delivery of any pending content.
49
+ */
50
+ flush() {
51
+ if (this._hasPending) {
52
+ this._clearTimer();
53
+ this._deliver();
54
+ }
55
+ }
56
+ destroy() {
57
+ this._clearTimer();
58
+ }
59
+ _deliver() {
60
+ this._hasPending = false;
61
+ this._onDeliver();
62
+ }
63
+ _resetTimer() {
64
+ this._clearTimer();
65
+ this._timer = setTimeout(() => {
66
+ this._timer = null;
67
+ if (this._hasPending)
68
+ this._deliver();
69
+ }, this._debounceMs);
70
+ }
71
+ _clearTimer() {
72
+ if (this._timer !== null) {
73
+ clearTimeout(this._timer);
74
+ this._timer = null;
75
+ }
76
+ }
77
+ }
78
+ // ============================================================================
79
+ // Rate Limiter
80
+ // ============================================================================
81
+ /**
82
+ * Sliding-window rate limiter for inbound messages.
83
+ * Tracks per-minute and per-day counts.
84
+ */
85
+ export class RateLimiter {
86
+ _maxPerMinute;
87
+ _maxPerDay;
88
+ _onLimited;
89
+ _minuteTimestamps = [];
90
+ _dayCount = 0;
91
+ _dayStart = 0;
92
+ constructor(config) {
93
+ this._maxPerMinute = config.maxPerMinute ?? Infinity;
94
+ this._maxPerDay = config.maxPerDay ?? Infinity;
95
+ this._onLimited = config.onLimited;
96
+ this._dayStart = startOfDay(Date.now());
97
+ }
98
+ /**
99
+ * Check if a message should be allowed through.
100
+ * Returns `{ allowed: true }` or `{ allowed: false, reply?: string }`.
101
+ */
102
+ check() {
103
+ const now = Date.now();
104
+ // Reset daily counter if we're in a new day
105
+ const today = startOfDay(now);
106
+ if (today !== this._dayStart) {
107
+ this._dayStart = today;
108
+ this._dayCount = 0;
109
+ }
110
+ // Prune minute window
111
+ const oneMinuteAgo = now - 60_000;
112
+ this._minuteTimestamps = this._minuteTimestamps.filter((t) => t > oneMinuteAgo);
113
+ // Check daily limit
114
+ if (this._dayCount >= this._maxPerDay) {
115
+ const resetMs = this._dayStart + 86_400_000 - now;
116
+ const reply = this._onLimited?.({ remaining: 0, resetMs });
117
+ return { allowed: false, reply: reply ?? undefined };
118
+ }
119
+ // Check per-minute limit
120
+ if (this._minuteTimestamps.length >= this._maxPerMinute) {
121
+ const oldestInWindow = this._minuteTimestamps[0];
122
+ const resetMs = oldestInWindow + 60_000 - now;
123
+ const remaining = 0;
124
+ const reply = this._onLimited?.({ remaining, resetMs });
125
+ return { allowed: false, reply: reply ?? undefined };
126
+ }
127
+ // Allow
128
+ this._minuteTimestamps.push(now);
129
+ this._dayCount++;
130
+ return { allowed: true };
131
+ }
132
+ }
133
+ function startOfDay(ms) {
134
+ const d = new Date(ms);
135
+ d.setHours(0, 0, 0, 0);
136
+ return d.getTime();
137
+ }
138
+ //# sourceMappingURL=delivery-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-buffer.js","sourceRoot":"","sources":["../src/delivery-buffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export { ConnectorSession } from "./connector-session.js";
2
+ export { createConnector } from "./create-connector.js";
3
+ export type { ConnectorHandle } from "./create-connector.js";
4
+ export { buildContentFilter, applyContentPolicy, createToolSummarizer, } from "./content-pipeline.js";
5
+ export type { ToolSummarizer } from "./content-pipeline.js";
6
+ export { DeliveryBuffer, RateLimiter } from "./delivery-buffer.js";
7
+ export { splitMessage } from "./message-splitter.js";
8
+ export type { ContentPolicy, ContentPolicyFn, DeliveryStrategy, RateLimitConfig, RetryConfig, ConnectorConfig, ConnectorOutput, ConnectorPlatform, ConnectorBridge, ConnectorStatus, ConnectorStatusEvent, } from "./types.js";
9
+ export type { DeliveryBufferOptions } from "./delivery-buffer.js";
10
+ export type { SplitOptions } from "./message-splitter.js";
11
+ export { extractText } from "@agentick/shared";
12
+ export { parseTextConfirmation, formatConfirmationMessage } from "./text-utils.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,YAAY,EACV,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export { ConnectorSession } from "./connector-session.js";
2
+ export { createConnector } from "./create-connector.js";
3
+ export { buildContentFilter, applyContentPolicy, createToolSummarizer, } from "./content-pipeline.js";
4
+ export { DeliveryBuffer, RateLimiter } from "./delivery-buffer.js";
5
+ export { splitMessage } from "./message-splitter.js";
6
+ // Re-export extractText from shared — the canonical implementation lives there.
7
+ // Connector-specific text utilities (confirmation parsing/formatting) live here.
8
+ export { extractText } from "@agentick/shared";
9
+ export { parseTextConfirmation, formatConfirmationMessage } from "./text-utils.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAmBrD,gFAAgF;AAChF,iFAAiF;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface SplitOptions {
2
+ /** Platform character limit. */
3
+ maxLength: number;
4
+ /** Preferred split points, tried in order. Default: ["\n\n", "\n", ". ", " "]. */
5
+ splitOn?: string[];
6
+ /** Appended to all chunks except the last. Default: "". */
7
+ continuation?: string;
8
+ }
9
+ /**
10
+ * Split text to fit within a platform's character limit.
11
+ *
12
+ * Greedy algorithm: finds the last occurrence of the highest-priority
13
+ * split point before maxLength, splits there, repeats for the remainder.
14
+ */
15
+ export declare function splitMessage(text: string, options: SplitOptions): string[];
16
+ //# sourceMappingURL=message-splitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-splitter.d.ts","sourceRoot":"","sources":["../src/message-splitter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,EAAE,CAwC1E"}
@@ -0,0 +1,41 @@
1
+ const DEFAULT_SPLIT_POINTS = ["\n\n", "\n", ". ", " "];
2
+ /**
3
+ * Split text to fit within a platform's character limit.
4
+ *
5
+ * Greedy algorithm: finds the last occurrence of the highest-priority
6
+ * split point before maxLength, splits there, repeats for the remainder.
7
+ */
8
+ export function splitMessage(text, options) {
9
+ const { maxLength, continuation = "" } = options;
10
+ const splitOn = options.splitOn ?? DEFAULT_SPLIT_POINTS;
11
+ if (text.length <= maxLength)
12
+ return [text];
13
+ const effectiveMax = maxLength - continuation.length;
14
+ if (effectiveMax <= 0) {
15
+ throw new Error("maxLength must be greater than continuation length");
16
+ }
17
+ const chunks = [];
18
+ let remaining = text;
19
+ while (remaining.length > maxLength) {
20
+ let splitIndex = -1;
21
+ for (const delimiter of splitOn) {
22
+ const idx = remaining.lastIndexOf(delimiter, effectiveMax);
23
+ if (idx > 0) {
24
+ splitIndex = idx + delimiter.length;
25
+ break;
26
+ }
27
+ }
28
+ // No split point found — hard break at effectiveMax
29
+ if (splitIndex <= 0) {
30
+ splitIndex = effectiveMax;
31
+ }
32
+ const chunk = remaining.slice(0, splitIndex).trimEnd();
33
+ chunks.push(chunk + continuation);
34
+ remaining = remaining.slice(splitIndex).trimStart();
35
+ }
36
+ if (remaining.length > 0) {
37
+ chunks.push(remaining);
38
+ }
39
+ return chunks;
40
+ }
41
+ //# sourceMappingURL=message-splitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-splitter.js","sourceRoot":"","sources":["../src/message-splitter.ts"],"names":[],"mappings":"AASA,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAAqB;IAC9D,MAAM,EAAE,SAAS,EAAE,YAAY,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,oBAAoB,CAAC;IAExD,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5C,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC;IACrD,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,SAAS,GAAG,IAAI,CAAC;IAErB,OAAO,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QACpC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;QAEpB,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YAC3D,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACZ,UAAU,GAAG,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC;gBACpC,MAAM;YACR,CAAC;QACH,CAAC;QAED,oDAAoD;QACpD,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,UAAU,GAAG,YAAY,CAAC;QAC5B,CAAC;QAED,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC;QAClC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,CAAC;IACtD,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { ToolConfirmationResponse } from "@agentick/shared";
2
+ /**
3
+ * Parse a natural language confirmation response.
4
+ *
5
+ * Accepts common affirmative phrases ("yes", "y", "ok", "go ahead", "do it")
6
+ * and treats everything else as denial. The full text is always passed as
7
+ * `reason` so the model can interpret nuanced responses like
8
+ * "yes but skip the tests".
9
+ */
10
+ export declare function parseTextConfirmation(text: string): ToolConfirmationResponse;
11
+ /**
12
+ * Format a tool confirmation request as a human-readable message.
13
+ */
14
+ export declare function formatConfirmationMessage(request: {
15
+ name: string;
16
+ message?: string;
17
+ arguments: Record<string, unknown>;
18
+ }): string;
19
+ //# sourceMappingURL=text-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-utils.d.ts","sourceRoot":"","sources":["../src/text-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAEjE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,wBAAwB,CAgB5E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,GAAG,MAAM,CAcT"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Parse a natural language confirmation response.
3
+ *
4
+ * Accepts common affirmative phrases ("yes", "y", "ok", "go ahead", "do it")
5
+ * and treats everything else as denial. The full text is always passed as
6
+ * `reason` so the model can interpret nuanced responses like
7
+ * "yes but skip the tests".
8
+ */
9
+ export function parseTextConfirmation(text) {
10
+ const lower = text.trim().toLowerCase();
11
+ const approved = lower === "yes" ||
12
+ lower === "y" ||
13
+ lower === "ok" ||
14
+ lower === "approve" ||
15
+ lower === "go" ||
16
+ lower === "go ahead" ||
17
+ lower === "do it" ||
18
+ lower.startsWith("yes ");
19
+ return {
20
+ approved,
21
+ reason: text.trim(),
22
+ };
23
+ }
24
+ /**
25
+ * Format a tool confirmation request as a human-readable message.
26
+ */
27
+ export function formatConfirmationMessage(request) {
28
+ const msg = request.message ?? `Allow ${request.name} to execute?`;
29
+ const args = Object.entries(request.arguments);
30
+ if (args.length === 0)
31
+ return msg;
32
+ const argSummary = args
33
+ .map(([k, v]) => {
34
+ const val = typeof v === "string" ? v : JSON.stringify(v);
35
+ const short = val.length > 80 ? val.slice(0, 80) + "..." : val;
36
+ return ` ${k}: ${short}`;
37
+ })
38
+ .join("\n");
39
+ return `${msg}\n\n${argSummary}`;
40
+ }
41
+ //# sourceMappingURL=text-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-utils.js","sourceRoot":"","sources":["../src/text-utils.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,QAAQ,GACZ,KAAK,KAAK,KAAK;QACf,KAAK,KAAK,GAAG;QACb,KAAK,KAAK,IAAI;QACd,KAAK,KAAK,SAAS;QACnB,KAAK,KAAK,IAAI;QACd,KAAK,KAAK,UAAU;QACpB,KAAK,KAAK,OAAO;QACjB,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAE3B,OAAO;QACL,QAAQ;QACR,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE;KACpB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAIzC;IACC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,OAAO,CAAC,IAAI,cAAc,CAAC;IACnE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAElC,MAAM,UAAU,GAAG,IAAI;SACpB,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;QACd,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/D,OAAO,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC;IAC5B,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,GAAG,GAAG,OAAO,UAAU,EAAE,CAAC;AACnC,CAAC"}