pi-harness-runtime 1.1.427 → 1.1.428

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.
Files changed (153) hide show
  1. package/AGENTS.md +2 -2
  2. package/RULES.md +2 -3
  3. package/package.json +1 -1
  4. package/packages/a2a-adapter/package.json +1 -1
  5. package/packages/agent-policy/package.json +1 -1
  6. package/packages/architecture-generator/package.json +1 -1
  7. package/packages/auth/package.json +1 -1
  8. package/packages/autonomous-refactor/package.json +1 -1
  9. package/packages/autonomous-runtime/package.json +1 -1
  10. package/packages/cache-strategy/package.json +1 -1
  11. package/packages/capability-registry/package.json +1 -1
  12. package/packages/checkpoint/package.json +1 -1
  13. package/packages/cli-plugin-sdk/package.json +1 -1
  14. package/packages/clipboard/package.json +1 -1
  15. package/packages/clipboard-plugin/package.json +1 -1
  16. package/packages/code-generation/package.json +1 -1
  17. package/packages/code-review/package.json +1 -1
  18. package/packages/codex-adapter/package.json +1 -1
  19. package/packages/codex-watcher/package.json +1 -1
  20. package/packages/config-capture/package.json +1 -1
  21. package/packages/connection-runtime/package.json +1 -1
  22. package/packages/context-compiler/package.json +1 -1
  23. package/packages/context-discovery/package.json +1 -1
  24. package/packages/context-manager/package.json +1 -1
  25. package/packages/contracts/package.json +1 -1
  26. package/packages/cookie-sanitizer/package.json +1 -1
  27. package/packages/cost-optimizer/package.json +1 -1
  28. package/packages/dependency-analyzer/package.json +1 -1
  29. package/packages/django-plugin/package.json +1 -1
  30. package/packages/doc-generator/package.json +1 -1
  31. package/packages/durable-review/package.json +1 -1
  32. package/packages/e2e-tester/package.json +1 -1
  33. package/packages/evaluation-engine/package.json +1 -1
  34. package/packages/evaluation-runner/package.json +1 -1
  35. package/packages/event-bus/package.json +1 -1
  36. package/packages/event-sink/package.json +1 -1
  37. package/packages/event-store/package.json +1 -1
  38. package/packages/experience-replay/package.json +1 -1
  39. package/packages/feedback-collector/package.json +1 -1
  40. package/packages/file-copy-helper/package.json +1 -1
  41. package/packages/framework-detector/package.json +1 -1
  42. package/packages/framework-plugin-sdk/package.json +1 -1
  43. package/packages/frappe-plugin/package.json +1 -1
  44. package/packages/generic-web-plugin/package.json +1 -1
  45. package/packages/health-monitor/package.json +1 -1
  46. package/packages/intent-analyzer/package.json +1 -1
  47. package/packages/jev-judge/package.json +1 -1
  48. package/packages/knowledge-graph/package.json +1 -1
  49. package/packages/knowledge-retrieval/package.json +1 -1
  50. package/packages/laravel-plugin/package.json +1 -1
  51. package/packages/learning-engine/package.json +1 -1
  52. package/packages/logging/package.json +1 -1
  53. package/packages/mcp-adapter/package.json +1 -1
  54. package/packages/memory-engine/package.json +1 -1
  55. package/packages/milestone-manager/package.json +1 -1
  56. package/packages/model-registry/package.json +1 -1
  57. package/packages/nextjs-plugin/package.json +1 -1
  58. package/packages/notification/package.json +1 -1
  59. package/packages/observability/package.json +1 -1
  60. package/packages/okf-indexer/package.json +1 -1
  61. package/packages/paperclip-integration/package.json +1 -1
  62. package/packages/performance-optimizer/package.json +1 -1
  63. package/packages/permission-mode/package.json +1 -1
  64. package/packages/privilege-broker/package.json +1 -1
  65. package/packages/project-analyzer/package.json +1 -1
  66. package/packages/project-bootstrap/package.json +1 -1
  67. package/packages/projection-engine/package.json +1 -1
  68. package/packages/prompt-compiler/package.json +1 -1
  69. package/packages/prompt-versioning/package.json +1 -1
  70. package/packages/provider-adapter-sdk/package.json +1 -1
  71. package/packages/provider-router/package.json +1 -1
  72. package/packages/provider-selector/package.json +1 -1
  73. package/packages/providers/package.json +1 -1
  74. package/packages/qdrant-skills/package.json +1 -1
  75. package/packages/quota-manager/package.json +1 -1
  76. package/packages/rate-limiter/package.json +1 -1
  77. package/packages/react-vite-plugin/package.json +1 -1
  78. package/packages/relay/package.json +1 -1
  79. package/packages/release-manager/package.json +1 -1
  80. package/packages/requirement-compiler/package.json +1 -1
  81. package/packages/runtime/package.json +1 -1
  82. package/packages/scheduler/package.json +1 -1
  83. package/packages/scheduler-adapter/package.json +1 -1
  84. package/packages/session/package.json +1 -1
  85. package/packages/session-api/package.json +1 -1
  86. package/packages/session-export/package.json +1 -1
  87. package/packages/shared-context/package.json +1 -1
  88. package/packages/skill-mcp-client/package.json +1 -1
  89. package/packages/skill-registry/package.json +1 -1
  90. package/packages/skills/package.json +1 -1
  91. package/packages/sprint-planner/package.json +1 -1
  92. package/packages/subscription-engine/package.json +1 -1
  93. package/packages/task-compiler/package.json +1 -1
  94. package/packages/tencentdb-memory/package.json +1 -1
  95. package/packages/tencentdb-sync/package.json +1 -1
  96. package/packages/test-data-generator/package.json +1 -1
  97. package/packages/test-generator/package.json +1 -1
  98. package/packages/todo-bd-sync/package.json +1 -1
  99. package/packages/token-estimation/package.json +1 -1
  100. package/packages/token-optimizer/package.json +1 -1
  101. package/packages/tooling-preference/package.json +1 -1
  102. package/packages/trajectory/package.json +1 -1
  103. package/packages/tui/package.json +1 -1
  104. package/packages/two-phase-review/package.json +1 -1
  105. package/packages/types/package.json +1 -1
  106. package/packages/voice-api/package.json +1 -1
  107. package/packages/webmcp-tester/package.json +1 -1
  108. package/packages/wiki/package.json +1 -1
  109. package/packages/workflow-events/package.json +1 -1
  110. package/packages/workspace-scanner/package.json +1 -1
  111. package/packages/worktree/package.json +1 -1
  112. package/packages/write-review/package.json +1 -1
  113. package/scripts/lib/runtime-imports.ts +199 -0
  114. package/scripts/verify-package-contents.ts +70 -18
  115. package/packages/telegram/package.json +0 -22
  116. package/packages/telegram/src/agent-messages.d.ts +0 -28
  117. package/packages/telegram/src/agent-messages.js +0 -90
  118. package/packages/telegram/src/bindings.d.ts +0 -296
  119. package/packages/telegram/src/bindings.js +0 -1086
  120. package/packages/telegram/src/bus.d.ts +0 -759
  121. package/packages/telegram/src/bus.js +0 -2732
  122. package/packages/telegram/src/commands.d.ts +0 -761
  123. package/packages/telegram/src/commands.js +0 -2622
  124. package/packages/telegram/src/config.d.ts +0 -222
  125. package/packages/telegram/src/config.js +0 -844
  126. package/packages/telegram/src/delivery.d.ts +0 -161
  127. package/packages/telegram/src/delivery.js +0 -550
  128. package/packages/telegram/src/extension.d.ts +0 -7
  129. package/packages/telegram/src/extension.js +0 -2444
  130. package/packages/telegram/src/inbound.d.ts +0 -94
  131. package/packages/telegram/src/inbound.js +0 -478
  132. package/packages/telegram/src/index.d.ts +0 -6
  133. package/packages/telegram/src/index.js +0 -6
  134. package/packages/telegram/src/keyboard.d.ts +0 -21
  135. package/packages/telegram/src/keyboard.js +0 -37
  136. package/packages/telegram/src/lifecycle.d.ts +0 -210
  137. package/packages/telegram/src/lifecycle.js +0 -538
  138. package/packages/telegram/src/pi.d.ts +0 -76
  139. package/packages/telegram/src/pi.js +0 -130
  140. package/packages/telegram/src/polling.d.ts +0 -332
  141. package/packages/telegram/src/polling.js +0 -1219
  142. package/packages/telegram/src/replies.d.ts +0 -210
  143. package/packages/telegram/src/replies.js +0 -752
  144. package/packages/telegram/src/routing.d.ts +0 -388
  145. package/packages/telegram/src/routing.js +0 -7886
  146. package/packages/telegram/src/runtime.d.ts +0 -159
  147. package/packages/telegram/src/runtime.js +0 -351
  148. package/packages/telegram/src/telegram-api.d.ts +0 -564
  149. package/packages/telegram/src/telegram-api.js +0 -1332
  150. package/packages/telegram/src/turns.d.ts +0 -108
  151. package/packages/telegram/src/turns.js +0 -482
  152. package/packages/telegram/src/updates.d.ts +0 -1545
  153. package/packages/telegram/src/updates.js +0 -6420
@@ -30,6 +30,10 @@ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
30
30
  import { execFile, spawnSync } from "node:child_process";
31
31
  import { join, resolve, dirname, relative } from "node:path";
32
32
  import { fileURLToPath } from "node:url";
33
+ import {
34
+ extractRelativeValueImports,
35
+ resolveRelativeImport,
36
+ } from "./lib/runtime-imports.js";
33
37
 
34
38
  const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
35
39
  const verifyTarball = process.argv.includes("--pack");
@@ -38,6 +42,7 @@ interface Problem {
38
42
  kind:
39
43
  | "missing-dist"
40
44
  | "missing-import"
45
+ | "broken-import"
41
46
  | "missing-tarball"
42
47
  | "missing-package"
43
48
  | "forbidden-path"
@@ -406,8 +411,13 @@ function checkStaleOutputs(): void {
406
411
  }
407
412
  }
408
413
 
409
- /** The tarball npm would publish must contain the built output. */
410
- async function inspectTarball(): Promise<void> {
414
+ /**
415
+ * The files npm would publish.
416
+ *
417
+ * The list comes from npm itself, so a check sees exactly what a consumer
418
+ * gets - not what the repository happens to contain.
419
+ */
420
+ async function packFileList(): Promise<string[]> {
411
421
  const stdout = await new Promise<string>((resolveText, rejectText) => {
412
422
  execFile(
413
423
  "npm",
@@ -423,29 +433,59 @@ async function inspectTarball(): Promise<void> {
423
433
  );
424
434
  });
425
435
 
426
- let files: string[] = [];
427
436
  try {
428
437
  // `npm pack --json` returns an array with one entry per packed tarball.
429
438
  const parsed = JSON.parse(stdout) as
430
439
  | { files?: { path: string }[] }[]
431
440
  | { files?: { path: string }[] };
432
441
  const entries = Array.isArray(parsed) ? parsed : [parsed];
433
- files = entries.flatMap((entry) => entry?.files ?? []).map((file) => file.path);
434
- if (files.length === 0) {
442
+ return entries.flatMap((entry) => entry?.files ?? []).map((file) => file.path);
443
+ } catch {
444
+ return [];
445
+ }
446
+ }
447
+
448
+ /**
449
+ * Every relative import of a published file must resolve.
450
+ *
451
+ * The published app reaches its internal packages through relative paths,
452
+ * so an import that does not resolve is a module graph that breaks when it
453
+ * runs. A published `.js` file has to reach a published file: a consumer
454
+ * never sees the repository. A published `.ts` file is resolved by the
455
+ * compiler, so it may reach a source file in the repository.
456
+ *
457
+ * The earlier import check only followed specifiers that contained
458
+ * "packages/" and never looked at the compiled output, so an import inside
459
+ * a package was never verified. That is how a package whose entry point
460
+ * could not be imported reached the registry.
461
+ */
462
+ function checkRelativeImports(files: string[]): void {
463
+ const published = new Set(files);
464
+ for (const path of files) {
465
+ if (!/\.(ts|mts|cts|mjs|js|cjs)$/.test(path)) continue;
466
+ if (path.endsWith(".d.ts") || path.endsWith(".d.mts")) continue;
467
+ const full = join(ROOT, path);
468
+ if (!existsSync(full)) continue;
469
+ const content = readFileSync(full, "utf8");
470
+ for (const specifier of extractRelativeValueImports(content)) {
471
+ const result = resolveRelativeImport({
472
+ importer: full,
473
+ specifier,
474
+ exists: existsSync,
475
+ isPublished: (candidate) =>
476
+ published.has(relative(ROOT, candidate).split("\\").join("/")),
477
+ });
478
+ if (result.ok) continue;
435
479
  problems.push({
436
- kind: "missing-tarball",
437
- detail: "npm pack --dry-run did not return a file list",
480
+ kind: "broken-import",
481
+ detail: `${path} imports ${specifier} but ${result.reason}`,
438
482
  });
439
- return;
440
483
  }
441
- } catch {
442
- problems.push({
443
- kind: "missing-tarball",
444
- detail: "npm pack --dry-run did not return a file list",
445
- });
446
- return;
447
484
  }
485
+ }
448
486
 
487
+ /** The tarball npm would publish must contain the built output. */
488
+ function inspectTarball(files: string[]): void {
449
489
  for (const file of files) {
450
490
  const posix = file.split("\\").join("/");
451
491
  for (const prefix of FORBIDDEN_PACKAGE_PREFIXES) {
@@ -503,7 +543,19 @@ checkPluginCopySource();
503
543
  checkImports();
504
544
  checkPackageEntries();
505
545
  checkStaleOutputs();
506
- if (verifyTarball) await inspectTarball();
546
+
547
+ // The published file list drives both the import check and the tarball
548
+ // check: it is what a consumer receives.
549
+ const publishedFiles = await packFileList();
550
+ if (publishedFiles.length === 0) {
551
+ problems.push({
552
+ kind: "missing-tarball",
553
+ detail: "npm pack --dry-run did not return a file list",
554
+ });
555
+ } else {
556
+ checkRelativeImports(publishedFiles);
557
+ if (verifyTarball) inspectTarball(publishedFiles);
558
+ }
507
559
 
508
560
  if (problems.length > 0) {
509
561
  console.error(`[verify-package-contents] FAILED with ${problems.length} problem(s):`);
@@ -518,7 +570,7 @@ if (problems.length > 0) {
518
570
  }
519
571
 
520
572
  console.log(
521
- `[verify-package-contents] OK - ${runtimeImports.size} runtime import(s) resolved${
522
- verifyTarball ? ", tarball verified" : ""
523
- }`,
573
+ `[verify-package-contents] OK - ${runtimeImports.size} runtime import(s) resolved, ${
574
+ publishedFiles.length
575
+ } published file(s) checked${verifyTarball ? ", tarball verified" : ""}`,
524
576
  );
@@ -1,22 +0,0 @@
1
- {
2
- "name": "@pi-harness/telegram",
3
- "version": "1.1.427",
4
- "description": "pi-harness-runtime — Telegram inbound/outbound",
5
- "type": "module",
6
- "main": "./src/index.js",
7
- "types": "./src/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "import": "./src/index.js",
11
- "types": "./src/index.d.ts"
12
- }
13
- },
14
- "files": [
15
- "src"
16
- ],
17
- "scripts": {
18
- "build": "tsc",
19
- "test": "bun test"
20
- },
21
- "dependencies": {}
22
- }
@@ -1,28 +0,0 @@
1
- /**
2
- * Cross-instance Telegram agent message resolution and turn injection
3
- * Zones: multi-instance bus, inbound routing, operational delivery
4
- * Owns live target resolution, source attribution, same-target fencing, and synthetic turn construction; excludes Bot API delivery and bus transport.
5
- */
6
- import type { TelegramBusAgentMessage, TelegramBusAgentTargetSelector, TelegramBusFollowerRegistry } from "./bus.ts";
7
- import type { TelegramTarget } from "./target.ts";
8
- export interface TelegramAgentMessageRuntimeDeps<TContext, TUpdate> {
9
- instanceId: string;
10
- getAllowedChatId: () => number | undefined;
11
- getLeaderTarget: () => TelegramTarget | undefined;
12
- getLeaderThreadName: () => string | undefined;
13
- getDisplayTitle?: (target: TelegramTarget) => string | undefined;
14
- followerRegistry: TelegramBusFollowerRegistry;
15
- getContext: () => TContext | undefined;
16
- handleUpdate: (update: TUpdate, ctx: TContext) => Promise<void>;
17
- getNowMs?: () => number;
18
- }
19
- export declare function createTelegramAgentMessageRuntime<TContext, TUpdate>(deps: TelegramAgentMessageRuntimeDeps<TContext, TUpdate>): {
20
- resolveTarget: (selector: TelegramBusAgentTargetSelector, sourceTarget?: TelegramTarget) => (TelegramTarget & {
21
- threadId: number;
22
- }) | undefined;
23
- route(input: {
24
- sourceTarget?: TelegramTarget;
25
- sourceThreadName?: string;
26
- message: TelegramBusAgentMessage;
27
- }): Promise<void>;
28
- };
@@ -1,90 +0,0 @@
1
- /**
2
- * Cross-instance Telegram agent message resolution and turn injection
3
- * Zones: multi-instance bus, inbound routing, operational delivery
4
- * Owns live target resolution, source attribution, same-target fencing, and synthetic turn construction; excludes Bot API delivery and bus transport.
5
- */
6
- import { TELEGRAM_INTERNAL_AGENT_MESSAGE } from "./updates.js";
7
- export function createTelegramAgentMessageRuntime(deps) {
8
- const getNowMs = deps.getNowMs ?? Date.now;
9
- const sameTarget = (left, right) => left?.chatId === right?.chatId && left?.threadId === right?.threadId;
10
- const listLiveTargets = () => {
11
- const targets = [];
12
- const leaderTarget = deps.getLeaderTarget();
13
- if (leaderTarget?.threadId) {
14
- targets.push({
15
- target: {
16
- chatId: leaderTarget.chatId,
17
- threadId: leaderTarget.threadId,
18
- },
19
- threadName: deps.getDisplayTitle?.(leaderTarget) ?? deps.getLeaderThreadName(),
20
- });
21
- }
22
- for (const follower of deps.followerRegistry.list()) {
23
- if (!follower.target?.threadId)
24
- continue;
25
- targets.push({
26
- target: {
27
- chatId: follower.target.chatId,
28
- threadId: follower.target.threadId,
29
- },
30
- threadName: deps.getDisplayTitle?.(follower.target) ?? follower.threadName,
31
- });
32
- }
33
- return targets;
34
- };
35
- const resolveTarget = (selector, sourceTarget) => {
36
- const allowedChatId = deps.getAllowedChatId();
37
- const chatId = selector.chatId ?? allowedChatId;
38
- if (chatId === undefined || chatId !== allowedChatId)
39
- return undefined;
40
- const matches = listLiveTargets().filter((candidate) => {
41
- if (candidate.target.chatId !== chatId)
42
- return false;
43
- if (selector.threadId !== undefined) {
44
- return candidate.target.threadId === selector.threadId;
45
- }
46
- const requestedName = selector.threadName?.trim().toLocaleLowerCase();
47
- return (requestedName !== undefined &&
48
- requestedName.length > 0 &&
49
- candidate.threadName?.trim().toLocaleLowerCase() === requestedName);
50
- });
51
- if (matches.length !== 1)
52
- return undefined;
53
- return sameTarget(matches[0].target, sourceTarget)
54
- ? undefined
55
- : matches[0].target;
56
- };
57
- return {
58
- resolveTarget,
59
- async route(input) {
60
- const target = resolveTarget({
61
- chatId: input.message.target.chatId,
62
- threadId: input.message.target.threadId,
63
- }, input.sourceTarget);
64
- if (!target)
65
- throw new Error("Telegram agent target is no longer live.");
66
- const allowedChatId = deps.getAllowedChatId();
67
- const ctx = deps.getContext();
68
- if (allowedChatId === undefined || !ctx) {
69
- throw new Error("Telegram agent turn routing is unavailable.");
70
- }
71
- const sourceTitle = (input.sourceTarget
72
- ? deps.getDisplayTitle?.(input.sourceTarget)
73
- : undefined) ?? input.sourceThreadName;
74
- const sourceLabel = sourceTitle
75
- ?.replace(/[\r\n\[\]]+/g, " ")
76
- .trim()
77
- .slice(0, 64) || "Pi";
78
- const message = {
79
- message_id: input.message.messageId,
80
- date: Math.floor(getNowMs() / 1000),
81
- chat: { id: target.chatId, type: "private" },
82
- from: { id: allowedChatId, is_bot: false, first_name: "Pi Agent" },
83
- message_thread_id: target.threadId,
84
- pi_telegram_agent_source_thread: sourceLabel,
85
- text: input.message.text,
86
- };
87
- await deps.handleUpdate({ message, [TELEGRAM_INTERNAL_AGENT_MESSAGE]: true }, ctx);
88
- },
89
- };
90
- }
@@ -1,296 +0,0 @@
1
- /**
2
- * Telegram bridge binding composition
3
- * Zones: telegram, pi agent, orchestration
4
- * Owns pi-facing tool, command, and lifecycle hook registration for the entrypoint
5
- */
6
- import * as ActivityVerbosity from "./activity-verbosity.ts";
7
- import * as Activity from "./activity.ts";
8
- import * as BusApi from "./bus-api.ts";
9
- import type { TelegramBusFollowerCommandOwner } from "./bus-follower.ts";
10
- import type { TelegramBusLiveRebindWorkState } from "./bus.ts";
11
- import * as ChannelPosts from "./channel-posts.ts";
12
- import * as Commands from "./commands.ts";
13
- import * as Config from "./config.ts";
14
- import * as Delivery from "./delivery.ts";
15
- import * as GenerativeApps from "./generative-apps.ts";
16
- import * as Keyboard from "./keyboard.ts";
17
- import * as Lifecycle from "./lifecycle.ts";
18
- import * as Locks from "./locks.ts";
19
- import * as Menu from "./menu.ts";
20
- import * as Model from "./model.ts";
21
- import * as OutboundAttachments from "./outbound-attachments.ts";
22
- import * as OutboundHandlers from "./outbound.ts";
23
- import * as Pi from "./pi.ts";
24
- import * as Preview from "./preview.ts";
25
- import * as Prompts from "./prompts.ts";
26
- import * as Queue from "./queue.ts";
27
- import * as Replies from "./replies.ts";
28
- import * as Routing from "./routing.ts";
29
- import * as Runtime from "./runtime.ts";
30
- import * as Setup from "./setup.ts";
31
- import * as Status from "./status.ts";
32
- import type { TelegramTarget } from "./target.ts";
33
- import * as TelegramApi from "./telegram-api.ts";
34
- /** Compose any registered held command over captured recipient effects; no ordinary follower API fallback. */
35
- export declare function createTelegramFollowerSelectedCommandBinding<TContext, TModel extends Model.MenuModel = Model.MenuModel>(deps: {
36
- ctx: TContext;
37
- operationId: string;
38
- registrationGeneration: string;
39
- name: string;
40
- target: TelegramTarget & {
41
- threadId: number;
42
- };
43
- recipient: Pick<TelegramBusFollowerCommandOwner<TContext>, "isCurrent" | "assertRecipientCurrent">;
44
- command: Pick<ReturnType<typeof Commands.createTelegramCommandHandlerTargetRuntime<Commands.TelegramCommandRuntimeMessage, TContext>>, "prepareHeldCommand" | "canPrepareHeldCommand">;
45
- menu?: Omit<Menu.TelegramMenuActionRuntimeDeps<TContext, TModel>, "sendTextReply" | "sendInteractiveMessage" | "editInteractiveMessage">;
46
- deliver: Parameters<typeof BusApi.createTelegramSelectedMenuTextApi>[0]["deliver"];
47
- recordOwnership: NonNullable<Replies.TelegramRenderedMessageDeliveryRuntimeDeps<Menu.TelegramReplyMarkup>["recordOwnership"]>;
48
- }): TelegramBusFollowerCommandOwner<TContext> | undefined;
49
- type ActivePiModel = NonNullable<Pi.ExtensionContext["model"]>;
50
- type TelegramRuntimeEventRecorder = (category: string, error: unknown, details?: Record<string, unknown>) => void;
51
- type TelegramBridgeStatusUpdater = Status.TelegramStatusRuntime<Pi.ExtensionContext>["updateStatus"];
52
- type TelegramAgentTargetResolver = NonNullable<OutboundAttachments.TelegramOutboundMessageToolRegistrationDeps["resolveAgentTarget"]>;
53
- type TelegramAgentMessageRouter = NonNullable<OutboundAttachments.TelegramOutboundMessageToolRegistrationDeps["routeAgentMessage"]>;
54
- export interface TelegramQueueBindingRuntime<TContext> {
55
- mutation: Queue.TelegramQueueMutationController<TContext>;
56
- dispatchNext: (ctx: TContext) => void;
57
- requestNextDispatchAnnouncement: () => void;
58
- cancelNextDispatchAnnouncement: () => void;
59
- watchdog: Queue.TelegramQueueDispatchWatchdogRuntime<TContext>;
60
- }
61
- export declare function createTelegramQueueBindingRuntime<TContext>(deps: {
62
- store: Queue.TelegramQueueStateStore<TContext>;
63
- queue: Pick<Runtime.TelegramBridgeRuntime["queue"], "allocateItemOrder">;
64
- lifecycle: Pick<Runtime.TelegramBridgeRuntime["lifecycle"], "isCompactionInProgress" | "hasDispatchPending">;
65
- activeTurn: Pick<Queue.TelegramActiveTurnStore, "has">;
66
- admission: {
67
- getSettlement: () => {
68
- onItemsDiscarded: (items: readonly Queue.TelegramQueueItem<TContext>[], ctx: TContext) => boolean;
69
- isItemReady: (item: Queue.TelegramQueueItem<TContext>) => boolean;
70
- onPromptHandedOff?: (item: Queue.PendingTelegramTurn, ctx: TContext) => boolean;
71
- onControlSettled: (item: Queue.PendingTelegramControlItem<TContext>, ctx: TContext) => void;
72
- } | undefined;
73
- hasPendingQueueMutationForItem: (item: Queue.TelegramQueueItem<TContext>) => boolean;
74
- };
75
- transportStamp: Pick<Queue.TelegramTransportStampRuntime, "isActive">;
76
- deferredDispatch: Pick<Queue.TelegramDeferredQueueDispatchRuntime<TContext>, "isBound" | "getGeneration" | "isGenerationActive">;
77
- promptDispatch: Runtime.TelegramPromptDispatchRuntime<TContext>;
78
- isIdle: (ctx: TContext) => boolean;
79
- hasPendingMessages: (ctx: TContext) => boolean;
80
- updateStatus: (ctx: TContext, error?: string) => void;
81
- sendTextReply: Queue.TelegramQueueDispatchRuntimeDeps<TContext>["sendTextReply"];
82
- sendUserMessage: Queue.TelegramQueueDispatchRuntimeDeps<TContext>["sendUserMessage"];
83
- reconcileNextDispatchAnnouncementReplyOwnership?: (item: Queue.PendingTelegramTurn) => void;
84
- recordRuntimeEvent?: TelegramRuntimeEventRecorder;
85
- }): TelegramQueueBindingRuntime<TContext>;
86
- export interface TelegramGenerativeAppLiveSurfaceBinding {
87
- get: () => GenerativeApps.GenerativeAppLiveSurfaceRuntime<GenerativeApps.TelegramBindLiveHandle> | undefined;
88
- set: (runtime: GenerativeApps.GenerativeAppLiveSurfaceRuntime<GenerativeApps.TelegramBindLiveHandle> | undefined) => void;
89
- shutdown: () => void;
90
- }
91
- export declare function createTelegramGenerativeAppLiveSurfaceBinding(): TelegramGenerativeAppLiveSurfaceBinding;
92
- export declare function createTelegramGenerativeAppBoundButtonActionInvoker<TQuery extends {
93
- message?: {
94
- chat?: {
95
- id?: number;
96
- };
97
- message_id?: number;
98
- message_thread_id?: number;
99
- };
100
- }>(deps: {
101
- agentDir: string;
102
- assertExecutionCurrent: (query: TQuery) => void;
103
- getExecutionFence: (query: TQuery) => GenerativeApps.GenerativeAppExecutionFence | undefined;
104
- getActiveProfileName?: () => string | undefined;
105
- getLiveSurfaceRuntime?: () => GenerativeApps.GenerativeAppLiveSurfaceRuntime<GenerativeApps.TelegramBindLiveHandle> | undefined;
106
- planOutput: ReturnType<typeof OutboundHandlers.createTelegramOutboundReplyPlanner>;
107
- sendMarkdownReply: (chatId: number, replyToMessageId: number, markdown: string, options?: {
108
- replyMarkup?: OutboundHandlers.TelegramOutboundButtonMarkup;
109
- }) => Promise<unknown>;
110
- editInteractiveMessage?: (chatId: number, messageId: number, markdown: string, mode: "markdown", replyMarkup: OutboundHandlers.TelegramOutboundButtonMarkup) => Promise<void>;
111
- recordRuntimeEvent: TelegramRuntimeEventRecorder;
112
- }): (action: OutboundHandlers.TelegramOutboundButtonAction, query: TQuery) => Promise<false | "new" | "edit">;
113
- export interface TelegramAgentMessageToolRoutingRuntime {
114
- resolveAgentTarget: TelegramAgentTargetResolver;
115
- routeAgentMessage: TelegramAgentMessageRouter;
116
- canSendDirect: () => boolean;
117
- }
118
- export declare function createTelegramAgentMessageToolRoutingRuntime(deps: {
119
- ownsLeader: () => boolean;
120
- ownsDirectDelivery: () => boolean;
121
- isFollowerRegistered: () => boolean;
122
- getSourceTarget: () => TelegramTarget | undefined;
123
- getSourceThreadName: () => string | undefined;
124
- local: {
125
- resolveTarget: (selector: Parameters<TelegramAgentTargetResolver>[0], sourceTarget?: TelegramTarget) => Awaited<ReturnType<TelegramAgentTargetResolver>> | undefined;
126
- route: (input: {
127
- sourceTarget?: TelegramTarget;
128
- sourceThreadName?: string;
129
- message: Parameters<TelegramAgentMessageRouter>[0];
130
- }) => Promise<void>;
131
- };
132
- follower: {
133
- resolveTarget: TelegramAgentTargetResolver;
134
- routeMessage: TelegramAgentMessageRouter;
135
- };
136
- }): TelegramAgentMessageToolRoutingRuntime;
137
- export interface TelegramAssistantOutputBindingRuntime<TTransportStamp> {
138
- runtime: Activity.TelegramAssistantOutputRuntime;
139
- observeEvent: (event: Activity.TelegramActivityEvent) => void;
140
- authority: Routing.TelegramAssistantOutputAuthorityRuntime<TTransportStamp>;
141
- }
142
- export declare function createTelegramAssistantOutputBindingRuntime<TTransportStamp>(deps: {
143
- authority: {
144
- getPreferredTarget: () => OutboundAttachments.TelegramQueuedOutboundAttachmentTurnView["target"] | undefined;
145
- getFallbackChatId: () => number | undefined;
146
- getTransportStamp: () => TTransportStamp;
147
- isTransportStampActive: (stamp: TTransportStamp) => boolean;
148
- ownsDirect: () => boolean;
149
- getDirectEpoch: () => number | string | undefined;
150
- isFollowerRegistered: () => boolean;
151
- getFollowerGeneration: () => string | undefined;
152
- };
153
- sender: Parameters<typeof OutboundHandlers.createTelegramAssistantOutputSender<TTransportStamp>>[0];
154
- waitForActivityIdle?: () => Promise<void>;
155
- prepareTelegramPreview?: () => Activity.TelegramAssistantOutputPreparation | undefined;
156
- enqueue?: Activity.TelegramActivityPublicationRuntime["enqueue"];
157
- recordRuntimeEvent: TelegramRuntimeEventRecorder;
158
- }): TelegramAssistantOutputBindingRuntime<TTransportStamp>;
159
- type TelegramAssistantOutputAuthority<TTransportStamp> = ReturnType<Routing.TelegramAssistantOutputAuthorityRuntime<TTransportStamp>["captureAuthority"]>;
160
- export interface TelegramBridgePublicationRuntime {
161
- enqueue: Activity.TelegramActivityPublicationRuntime["enqueue"];
162
- reserve: Activity.TelegramActivityPublicationRuntime["reserve"];
163
- hasPending: Activity.TelegramActivityPublicationRuntime["hasPending"];
164
- beginWork: Activity.TelegramActivityPublicationRuntime["beginWork"];
165
- hasUnconfirmed: Activity.TelegramActivityPublicationRuntime["hasUnconfirmed"];
166
- capture: () => {
167
- target?: Queue.TelegramQueueTarget;
168
- isCurrent: () => boolean;
169
- };
170
- }
171
- export interface TelegramActivityBindingRuntime {
172
- publicationRuntime: TelegramBridgePublicationRuntime;
173
- activityRuntime: Activity.TelegramActivityRuntime;
174
- activityVerbosityRuntime: ActivityVerbosity.TelegramActivityVerbosityRuntime;
175
- assistantOutputRuntime: Activity.TelegramAssistantOutputRuntime;
176
- }
177
- /** Compose public activity fanout, verbosity, and assistant output ordering. */
178
- export declare function createTelegramActivityBindingRuntime<TTransportStamp>(deps: {
179
- generation: string;
180
- assistantOutput: Omit<Parameters<typeof createTelegramAssistantOutputBindingRuntime<TTransportStamp>>[0], "waitForActivityIdle" | "enqueue">;
181
- activityVerbosity: Omit<Parameters<typeof ActivityVerbosity.createTelegramActivityVerbosityRuntime<TelegramAssistantOutputAuthority<TTransportStamp>>>[0], "captureAuthority" | "isAuthorityActive" | "recordFailure" | "enqueue">;
182
- }): TelegramActivityBindingRuntime;
183
- /** Fresh current work projection; a snapshot is not a cleanup grant or target-application ACK. */
184
- export declare function createTelegramLiveTargetWorkObserver<TContext>(deps: {
185
- queue: Pick<Queue.TelegramQueueStateStore<TContext>, "getQueuedItems">;
186
- activeTurn: Pick<Queue.TelegramActiveTurnStore, "get">;
187
- lifecycle: Pick<Runtime.TelegramBridgeRuntime["lifecycle"], "hasDispatchPending" | "isCompactionInProgress" | "getActiveToolExecutions">;
188
- isIdle(ctx: TContext): boolean;
189
- hasPendingMessages(ctx: TContext): boolean;
190
- hasPendingControl(): boolean;
191
- publication: Pick<TelegramBridgePublicationRuntime, "hasPending" | "hasUnconfirmed">;
192
- activity: Pick<Activity.TelegramActivityRuntime, "hasPending">;
193
- delivery: Pick<ReturnType<typeof Delivery.createTelegramDeliveryLifecycleHooks>, "hasPendingTarget">;
194
- api: Pick<TelegramApi.TelegramApiTargetActivityRuntime, "hasPendingTarget">;
195
- }): (target: TelegramTarget & {
196
- threadId: number;
197
- }, ctx: TContext) => TelegramBusLiveRebindWorkState;
198
- interface TelegramCommandsAndToolsBindingDeps {
199
- pi: Pi.ExtensionAPI;
200
- agentDir: string;
201
- configStore: Config.TelegramConfigStore;
202
- persistConfig: (config?: Config.TelegramConfig) => Promise<void>;
203
- setup: Setup.TelegramSetupGuard;
204
- activeTurnRuntime: Queue.TelegramActiveTurnStore<Queue.PendingTelegramTurn>;
205
- lockedPollingRuntime: Locks.TelegramLockedPollingRuntime<Pi.ExtensionContext>;
206
- stopPolling?: () => Promise<void | string>;
207
- getDisconnectThreadName?: () => string | undefined;
208
- onTransportChanged?: () => Promise<void> | void;
209
- getStatusLines: (options?: Status.TelegramBridgeStatusLineOptions) => string[];
210
- buttonActionStore: OutboundHandlers.TelegramButtonActionStore;
211
- sendMarkdownReply: (chatId: number, replyToMessageId: number | undefined, markdown: string, options?: {
212
- replyMarkup?: unknown;
213
- target?: {
214
- chatId: number;
215
- threadId?: number;
216
- };
217
- }) => Promise<number | undefined>;
218
- sendChannelMarkdownMessage: NonNullable<OutboundAttachments.TelegramOutboundMessageToolRegistrationDeps["sendChannelMarkdownMessage"]>;
219
- sendChannelMediaMessage: NonNullable<OutboundAttachments.TelegramOutboundMessageToolRegistrationDeps["sendChannelMediaMessage"]>;
220
- listChannelPosts: ChannelPosts.TelegramChannelPostJournalStore["list"];
221
- mutateChannelPost(input: {
222
- action: "edit" | "delete";
223
- operationId: string;
224
- mutationId: string;
225
- markdown?: string;
226
- }): Promise<ChannelPosts.TelegramChannelPostRecord>;
227
- callMultipart: OutboundHandlers.TelegramVoiceReplySenderDeps["sendMultipart"];
228
- getDefaultChatId: () => number | undefined;
229
- getDefaultTarget?: () => OutboundAttachments.TelegramQueuedOutboundAttachmentTurnView["target"];
230
- resolveAgentTarget?: OutboundAttachments.TelegramOutboundMessageToolRegistrationDeps["resolveAgentTarget"];
231
- routeAgentMessage?: OutboundAttachments.TelegramOutboundMessageToolRegistrationDeps["routeAgentMessage"];
232
- canSendDirect: () => boolean;
233
- setGenerativeAppLiveSurfaceRuntime?: (runtime: GenerativeApps.GenerativeAppLiveSurfaceRuntime<GenerativeApps.TelegramBindLiveHandle> | undefined) => void;
234
- updateStatus: TelegramBridgeStatusUpdater;
235
- isContextCurrent: (ctx: Pi.ExtensionContext) => boolean;
236
- getSessionGeneration: () => number;
237
- connectionIntent: NonNullable<Commands.TelegramBridgeCommandRegistrationDeps["connectionIntent"]>;
238
- recordRuntimeEvent: TelegramRuntimeEventRecorder;
239
- }
240
- export declare function registerTelegramCommandsAndTools({ pi, agentDir, configStore, persistConfig, setup, activeTurnRuntime, lockedPollingRuntime, stopPolling, getDisconnectThreadName, onTransportChanged, getStatusLines, buttonActionStore, sendMarkdownReply, sendChannelMarkdownMessage, sendChannelMediaMessage, listChannelPosts, mutateChannelPost, callMultipart, getDefaultChatId, getDefaultTarget, resolveAgentTarget, routeAgentMessage, canSendDirect, setGenerativeAppLiveSurfaceRuntime, recordRuntimeEvent, updateStatus, isContextCurrent, getSessionGeneration, connectionIntent, }: TelegramCommandsAndToolsBindingDeps): void;
241
- interface TelegramLifecycleBindingDeps {
242
- pi: Pi.ExtensionAPI;
243
- publicationRuntime: TelegramBridgePublicationRuntime;
244
- activityRuntime: Activity.TelegramActivityRuntime;
245
- activityVerbosityRuntime?: ActivityVerbosity.TelegramActivityVerbosityRuntime;
246
- diagnostics?: {
247
- onSessionStart(): void;
248
- onSessionShutdown(): Promise<void>;
249
- };
250
- assistantOutputRuntime: Pick<Activity.TelegramAssistantOutputRuntime, "start" | "beginTurn" | "hasAdmittedTelegramIntermediate" | "waitForIdle" | "stop">;
251
- sessionLifecycleRuntime: Pick<Lifecycle.TelegramLifecycleRegistrationDeps, "onSessionStart" | "onSessionShutdown" | "onModelSelect">;
252
- configStore: Pick<Config.TelegramConfigStore, "get" | "getOutboundHandlers" | "hasBotToken" | "load">;
253
- abort: Runtime.TelegramRuntimeAbortPort;
254
- typing: Runtime.TelegramRuntimeTypingPort;
255
- lifecycle: Runtime.TelegramRuntimeLifecyclePort;
256
- activeTurnRuntime: Queue.TelegramActiveTurnStore<Queue.PendingTelegramTurn>;
257
- telegramQueueStore: Queue.TelegramQueueStore<Pi.ExtensionContext>;
258
- modelSwitchController: Model.TelegramModelSwitchController<Pi.ExtensionContext, Model.ScopedTelegramModel<ActivePiModel>>;
259
- previewRuntime: Preview.TelegramAssistantPreviewRuntime<Pi.AgentEndEvent["messages"][number], Keyboard.TelegramInlineKeyboardMarkup>;
260
- promptDispatchRuntime: Runtime.TelegramPromptDispatchRuntime<Pi.ExtensionContext>;
261
- deferredQueueDispatchRuntime: Queue.TelegramDeferredQueueDispatchRuntime<Pi.ExtensionContext>;
262
- modelContextAvailabilityRuntime: Prompts.TelegramModelContextAvailabilityRuntime;
263
- disconnectOnQuit?: () => Promise<unknown>;
264
- onSessionStarted?: (event: Pi.SessionStartEvent, ctx: Pi.ExtensionContext) => void;
265
- shutdownGenerativeAppLiveSurfaces?: () => void;
266
- resolveAutomaticThreadCleanupEnabled?: () => boolean | Promise<boolean>;
267
- buttonActionStore: OutboundHandlers.TelegramButtonActionStore;
268
- callMultipart: OutboundHandlers.TelegramVoiceReplySenderDeps["sendMultipart"];
269
- sendChatAction: NonNullable<OutboundHandlers.TelegramVoiceReplySenderDeps["sendChatAction"]>;
270
- sendRecordVoiceAction: NonNullable<OutboundHandlers.TelegramVoiceReplySenderDeps["sendRecordVoiceAction"]>;
271
- sendMarkdownReply: Queue.TelegramAgentEndHookRuntimeDeps<Queue.PendingTelegramTurn, Pi.ExtensionContext, Pi.AgentEndEvent["messages"][number], Keyboard.TelegramInlineKeyboardMarkup>["sendMarkdownReply"];
272
- sendTextReply: Queue.TelegramAgentEndHookRuntimeDeps<Queue.PendingTelegramTurn, Pi.ExtensionContext, Pi.AgentEndEvent["messages"][number], Keyboard.TelegramInlineKeyboardMarkup>["sendTextReply"] & NonNullable<OutboundHandlers.TelegramVoiceReplySenderDeps["sendTextReply"]>;
273
- dispatchNextQueuedTelegramTurn: (ctx: Pi.ExtensionContext) => void;
274
- onPromptHandedOff?: (turn: Queue.PendingTelegramTurn, ctx: Pi.ExtensionContext) => void;
275
- answerGuestQuery: TelegramApi.TelegramBridgeApiRuntime["answerGuestQuery"];
276
- deleteMessage: TelegramApi.TelegramBridgeApiRuntime["deleteMessage"];
277
- sendGuestReply: NonNullable<Queue.TelegramAgentEndHookRuntimeDeps<Queue.PendingTelegramTurn, Pi.ExtensionContext, Pi.AgentEndEvent["messages"][number], Keyboard.TelegramInlineKeyboardMarkup>["sendGuestReply"]>;
278
- editGuestReply?: Queue.TelegramAgentEndHookRuntimeDeps<Queue.PendingTelegramTurn, Pi.ExtensionContext, Pi.AgentEndEvent["messages"][number], Keyboard.TelegramInlineKeyboardMarkup>["editGuestReply"];
279
- stopGuestPlaceholder?: Queue.TelegramAgentEndHookRuntimeDeps<Queue.PendingTelegramTurn, Pi.ExtensionContext, Pi.AgentEndEvent["messages"][number], Keyboard.TelegramInlineKeyboardMarkup>["stopGuestPlaceholder"];
280
- preparePreviewDelivery?: Queue.TelegramAgentEndRuntimeDeps<Queue.PendingTelegramTurn>["preparePreviewDelivery"];
281
- finalizeMarkdownPreview: Queue.TelegramAgentEndHookRuntimeDeps<Queue.PendingTelegramTurn, Pi.ExtensionContext, Pi.AgentEndEvent["messages"][number], Keyboard.TelegramInlineKeyboardMarkup>["finalizeMarkdownPreview"];
282
- proactivePushTargetGetter: () => Queue.TelegramQueueTarget | undefined;
283
- getAssistantRenderingMode: () => "rich" | "html";
284
- recordMessageOwnership?: (input: {
285
- chatId: number;
286
- messageId: number;
287
- target?: Queue.TelegramQueueTarget;
288
- }) => void;
289
- canSendAgentActivity: (ctx: Pi.ExtensionContext) => boolean;
290
- isSessionContextActive: (ctx: Pi.ExtensionContext) => boolean;
291
- isTurnTransportActive?: (turn: Queue.PendingTelegramTurn) => boolean;
292
- updateStatus: TelegramBridgeStatusUpdater;
293
- recordRuntimeEvent: TelegramRuntimeEventRecorder;
294
- }
295
- export declare function registerTelegramLifecycleRuntimeHooks({ pi, publicationRuntime, activityRuntime, activityVerbosityRuntime, diagnostics, assistantOutputRuntime, sessionLifecycleRuntime, configStore, abort, typing, lifecycle, activeTurnRuntime, telegramQueueStore, modelSwitchController, previewRuntime, promptDispatchRuntime, deferredQueueDispatchRuntime, modelContextAvailabilityRuntime, disconnectOnQuit, onSessionStarted, shutdownGenerativeAppLiveSurfaces, resolveAutomaticThreadCleanupEnabled, buttonActionStore, callMultipart, sendChatAction, sendRecordVoiceAction, sendMarkdownReply, sendTextReply, dispatchNextQueuedTelegramTurn, onPromptHandedOff, answerGuestQuery, deleteMessage, sendGuestReply, editGuestReply, stopGuestPlaceholder, preparePreviewDelivery, finalizeMarkdownPreview, proactivePushTargetGetter, getAssistantRenderingMode, recordMessageOwnership, canSendAgentActivity, isSessionContextActive, isTurnTransportActive, updateStatus, recordRuntimeEvent, }: TelegramLifecycleBindingDeps): void;
296
- export {};