induscode 0.1.0__py3-none-any.whl

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 (167) hide show
  1. induscode/__init__.py +56 -0
  2. induscode/addons/__init__.py +176 -0
  3. induscode/addons/contract.py +923 -0
  4. induscode/addons/dispatch/__init__.py +43 -0
  5. induscode/addons/dispatch/event_dispatcher.py +348 -0
  6. induscode/addons/dispatch/tool_interceptor.py +349 -0
  7. induscode/addons/host.py +469 -0
  8. induscode/addons/loader.py +314 -0
  9. induscode/addons/manifest.py +232 -0
  10. induscode/addons/surface.py +199 -0
  11. induscode/boot/__init__.py +108 -0
  12. induscode/boot/auth_vault.py +323 -0
  13. induscode/boot/boot.py +210 -0
  14. induscode/boot/contract.py +223 -0
  15. induscode/boot/invocation.py +117 -0
  16. induscode/boot/runners/__init__.py +42 -0
  17. induscode/boot/runners/link_runner.py +82 -0
  18. induscode/boot/runners/oneshot_runner.py +85 -0
  19. induscode/boot/runners/registry.py +46 -0
  20. induscode/boot/runners/repl_runner.py +340 -0
  21. induscode/boot/runners/session.py +549 -0
  22. induscode/boot/stages.py +198 -0
  23. induscode/boot/upgrade/__init__.py +36 -0
  24. induscode/boot/upgrade/apply.py +125 -0
  25. induscode/boot/upgrade/upgrades.py +136 -0
  26. induscode/briefing/__init__.py +115 -0
  27. induscode/briefing/compose.py +414 -0
  28. induscode/briefing/contract.py +528 -0
  29. induscode/briefing/macros.py +721 -0
  30. induscode/briefing/skills.py +417 -0
  31. induscode/capability_deck/__init__.py +233 -0
  32. induscode/capability_deck/bridge_ledger/__init__.py +66 -0
  33. induscode/capability_deck/bridge_ledger/key.py +181 -0
  34. induscode/capability_deck/bridge_ledger/ledger.py +276 -0
  35. induscode/capability_deck/bridge_ledger/network.py +336 -0
  36. induscode/capability_deck/builtin_bridge.py +358 -0
  37. induscode/capability_deck/cards/__init__.py +116 -0
  38. induscode/capability_deck/cards/bg_process.py +482 -0
  39. induscode/capability_deck/cards/memory.py +226 -0
  40. induscode/capability_deck/cards/saas.py +280 -0
  41. induscode/capability_deck/cards/task.py +256 -0
  42. induscode/capability_deck/cards/todo.py +312 -0
  43. induscode/capability_deck/contract.py +450 -0
  44. induscode/capability_deck/manifest.py +126 -0
  45. induscode/capability_deck/provision.py +217 -0
  46. induscode/channels/__init__.py +146 -0
  47. induscode/channels/contract.py +585 -0
  48. induscode/channels/framer.py +132 -0
  49. induscode/channels/link/__init__.py +50 -0
  50. induscode/channels/link/dialog.py +246 -0
  51. induscode/channels/link/driver.py +308 -0
  52. induscode/channels/link/server.py +217 -0
  53. induscode/channels/oneshot.py +178 -0
  54. induscode/channels/ops.py +140 -0
  55. induscode/channels/session_ops.py +172 -0
  56. induscode/conductor/__init__.py +240 -0
  57. induscode/conductor/catalog.py +309 -0
  58. induscode/conductor/conductor.py +1084 -0
  59. induscode/conductor/contract.py +1035 -0
  60. induscode/conductor/matcher.py +291 -0
  61. induscode/conductor/serialize.py +575 -0
  62. induscode/conductor/signal_hub.py +382 -0
  63. induscode/conductor/skill_parse.py +294 -0
  64. induscode/conductor/transcript_store.py +449 -0
  65. induscode/console/__init__.py +236 -0
  66. induscode/console/app.py +1677 -0
  67. induscode/console/components/__init__.py +62 -0
  68. induscode/console/components/banner.py +499 -0
  69. induscode/console/components/banner_sweep.py +188 -0
  70. induscode/console/components/emblem.py +181 -0
  71. induscode/console/components/status_bar.py +102 -0
  72. induscode/console/contract.py +836 -0
  73. induscode/console/input/__init__.py +107 -0
  74. induscode/console/input/chord.py +197 -0
  75. induscode/console/input/dir_reader.py +113 -0
  76. induscode/console/input/intents.py +258 -0
  77. induscode/console/input/providers.py +469 -0
  78. induscode/console/mount.py +137 -0
  79. induscode/console/overlays/__init__.py +94 -0
  80. induscode/console/overlays/auth.py +503 -0
  81. induscode/console/overlays/pickers.py +526 -0
  82. induscode/console/overlays/router.py +129 -0
  83. induscode/console/overlays/sessions.py +232 -0
  84. induscode/console/reducer.py +145 -0
  85. induscode/console/resume_picker.py +156 -0
  86. induscode/console/slash_commands/__init__.py +78 -0
  87. induscode/console/slash_commands/builtins.py +254 -0
  88. induscode/console/slash_commands/dynamic.py +217 -0
  89. induscode/console/slash_commands/integrations.py +949 -0
  90. induscode/console/slash_commands/transcript.py +404 -0
  91. induscode/console/slash_commands/workbench.py +430 -0
  92. induscode/console/startup.py +434 -0
  93. induscode/console/theme/__init__.py +44 -0
  94. induscode/console/theme/adapter.py +168 -0
  95. induscode/console/theme/palette.py +128 -0
  96. induscode/console/theme/resolve.py +123 -0
  97. induscode/console/theme/tokens.py +185 -0
  98. induscode/console_slash/__init__.py +111 -0
  99. induscode/console_slash/contract.py +185 -0
  100. induscode/console_slash/registry.py +140 -0
  101. induscode/console_slash/resolve.py +194 -0
  102. induscode/console_slash/shared.py +172 -0
  103. induscode/entry.py +108 -0
  104. induscode/insight/__init__.py +153 -0
  105. induscode/insight/collector.py +73 -0
  106. induscode/insight/replay.py +305 -0
  107. induscode/insight/wrapper.py +1115 -0
  108. induscode/kit/__init__.py +82 -0
  109. induscode/kit/clipboard_image.py +215 -0
  110. induscode/kit/external_editor.py +120 -0
  111. induscode/kit/image.py +188 -0
  112. induscode/kit/shell.py +89 -0
  113. induscode/kit/tool_fetch.py +288 -0
  114. induscode/launch/__init__.py +224 -0
  115. induscode/launch/catalog.py +310 -0
  116. induscode/launch/contract.py +569 -0
  117. induscode/launch/credentials.py +852 -0
  118. induscode/launch/invocation/__init__.py +39 -0
  119. induscode/launch/invocation/attachments.py +281 -0
  120. induscode/launch/invocation/flags.py +210 -0
  121. induscode/launch/invocation/read.py +369 -0
  122. induscode/launch/invocation/usage.py +110 -0
  123. induscode/launch/oauth.py +808 -0
  124. induscode/launch/packages.py +299 -0
  125. induscode/launch/pickers.py +291 -0
  126. induscode/py.typed +0 -0
  127. induscode/runtime_bridge/__init__.py +166 -0
  128. induscode/runtime_bridge/bridges/__init__.py +66 -0
  129. induscode/runtime_bridge/bridges/_drive.py +268 -0
  130. induscode/runtime_bridge/bridges/builtins.py +177 -0
  131. induscode/runtime_bridge/bridges/claude_cli.py +198 -0
  132. induscode/runtime_bridge/bridges/codex_cli.py +203 -0
  133. induscode/runtime_bridge/bridges/indusagi_cli.py +217 -0
  134. induscode/runtime_bridge/broker.py +397 -0
  135. induscode/runtime_bridge/contract.py +734 -0
  136. induscode/runtime_bridge/sink.py +351 -0
  137. induscode/sessions/__init__.py +25 -0
  138. induscode/sessions/contract.py +119 -0
  139. induscode/sessions/library.py +350 -0
  140. induscode/settings/__init__.py +47 -0
  141. induscode/settings/contract.py +313 -0
  142. induscode/settings/manager.py +268 -0
  143. induscode/transcript_export/__init__.py +109 -0
  144. induscode/transcript_export/contract.py +522 -0
  145. induscode/transcript_export/publish.py +455 -0
  146. induscode/transcript_export/sgr.py +566 -0
  147. induscode/transcript_export/template.py +319 -0
  148. induscode/transcript_export/theme_bridge.py +325 -0
  149. induscode/window_budget/__init__.py +76 -0
  150. induscode/window_budget/budget/__init__.py +26 -0
  151. induscode/window_budget/budget/estimate.py +273 -0
  152. induscode/window_budget/budget/gate.py +60 -0
  153. induscode/window_budget/budget/slice.py +145 -0
  154. induscode/window_budget/condenser.py +170 -0
  155. induscode/window_budget/contract.py +329 -0
  156. induscode/window_budget/summarize/__init__.py +33 -0
  157. induscode/window_budget/summarize/condense.py +212 -0
  158. induscode/window_budget/summarize/prompt.py +241 -0
  159. induscode/workspace/__init__.py +30 -0
  160. induscode/workspace/brand.py +96 -0
  161. induscode/workspace/locator.py +269 -0
  162. induscode-0.1.0.dist-info/METADATA +97 -0
  163. induscode-0.1.0.dist-info/RECORD +167 -0
  164. induscode-0.1.0.dist-info/WHEEL +4 -0
  165. induscode-0.1.0.dist-info/entry_points.txt +3 -0
  166. induscode-0.1.0.dist-info/licenses/CREDITS.md +22 -0
  167. induscode-0.1.0.dist-info/licenses/NOTICE +7 -0
@@ -0,0 +1,217 @@
1
+ """Deck provisioning — the single data-driven assembler.
2
+
3
+ One function, :func:`provision_deck`, turns a :data:`DeckProfile` plus a
4
+ :class:`DeckContext` into an assembled :class:`ToolDeck`. It replaces what
5
+ would otherwise be a trio of near-identical ``build_authoring_tools`` /
6
+ ``build_survey_tools`` / ``build_all_tools`` functions with a single walk over
7
+ a :data:`PROFILE_TABLE`-shaped policy mapping: the table says which catalog
8
+ rows each profile draws from, the assembler builds exactly those rows against
9
+ the context, and the result exposes the two reads the conductor needs —
10
+ :meth:`ToolDeck.tools` (the flat capability list) and :meth:`ToolDeck.box`
11
+ (the consumable ``AgentTool`` list it wires in as ``options.tools``).
12
+
13
+ Why a table rather than three functions:
14
+
15
+ - The catalog is already the single source of truth (``CAPABILITY_CARDS``
16
+ plus the app-novel cards). A profile is just a *selection policy* over that
17
+ catalog, so it is data — a small row per profile — not control flow.
18
+ - Adding a profile, or moving a card between profiles, is a one-line table
19
+ edit with no new branch to keep in sync.
20
+
21
+ Breadth runs ``authoring`` (narrowest, read-only) → ``survey`` (all
22
+ built-ins) → ``all`` (built-ins + app cards), spelled out per profile below.
23
+
24
+ The three profiles, in increasing breadth:
25
+
26
+ - ``authoring`` — the read-only built-in subset: the observe-only tools the
27
+ framework exposes (read/ls/grep/find/web search & fetch/checklist-read). No
28
+ filesystem mutation, no shell, no app-novel cards. The safe selection for a
29
+ session that must inspect a workspace without changing it.
30
+ - ``survey`` — the wider built-in subset: every framework built-in,
31
+ including the mutating ones (write/edit/bash/process/checklist-write).
32
+ Still no app-novel cards — just the full native tool set.
33
+ - ``all`` — everything: every framework built-in plus every app-novel
34
+ card (the checklist, the background-process proxy, the delegate/sub-agent
35
+ action, the SaaS connector, working memory).
36
+
37
+ The built-in catalog tags each native tool with the profiles it belongs to
38
+ (``read`` etc. are observe-only; ``bash``/``write`` are mutating); this table
39
+ maps the deck profiles onto those membership selections, so the
40
+ read-only/wider split is a table lookup rather than a hand-maintained second
41
+ tool list.
42
+
43
+ .. warning:: **Profile-name inversion — ported verbatim** (plan §5 rule 5,
44
+ analysis 03 risk-1). The deck profile ``authoring`` maps to built-in
45
+ membership tag ``survey`` (the read-only subset) and the deck profile
46
+ ``survey`` maps to membership ``all``: a deck profile is a *selection
47
+ policy*, distinct from the per-tool membership tags the built-in catalog
48
+ carries, and the names deliberately do not line up. The
49
+ ``capability-deck`` test suite pins this exact semantics — do not
50
+ "intuitively" fix the table.
51
+
52
+ Bridge (MCP) capabilities are *not* selected here — they are grafted at
53
+ runtime through the bridge ledger and concatenated by the host onto a deck's
54
+ :meth:`ToolDeck.tools`; provisioning only assembles the static catalog.
55
+ """
56
+
57
+ from __future__ import annotations
58
+
59
+ from collections.abc import Mapping, Sequence
60
+ from dataclasses import dataclass
61
+ from types import MappingProxyType
62
+
63
+ from .cards import APP_NOVEL_CARDS
64
+ from .contract import (
65
+ AnyCapability,
66
+ CapabilityCard,
67
+ DeckBox,
68
+ DeckContext,
69
+ DeckProfile,
70
+ deck_fault,
71
+ )
72
+ from .manifest import cards_for_profile
73
+
74
+ __all__ = [
75
+ "cards_for_deck_profile",
76
+ "provision_deck",
77
+ ]
78
+
79
+
80
+ # ---------------------------------------------------------------------------
81
+ # Profile table
82
+ # ---------------------------------------------------------------------------
83
+
84
+
85
+ @dataclass(frozen=True, slots=True, kw_only=True)
86
+ class _ProfilePolicy:
87
+ """What card sources a profile draws from. The table is the policy; the
88
+ assembler is a thin walk over it. Each row is pure data — no build logic —
89
+ so a profile's breadth is declared in one place."""
90
+
91
+ # The built-in catalog *membership* this deck profile selects from
92
+ # (`cards_for_profile` reads it):
93
+ # - "survey" — the observe-only built-ins (the read-only subset).
94
+ # - "all" — every built-in, mutating tools included (the wider set).
95
+ # The deck `authoring` profile maps to the read-only built-in membership
96
+ # and the deck `survey` profile to the full built-in set; the names differ
97
+ # because a deck profile is a *selection policy*, distinct from the
98
+ # per-tool membership tags the built-in catalog carries.
99
+ builtins: DeckProfile
100
+ # Whether the app-novel cards (checklist, background process, delegate,
101
+ # SaaS, memory) are included. Only the broadest profile grants the full set.
102
+ app_cards: bool
103
+
104
+
105
+ #: The selection policy for every :data:`DeckProfile`, in one table.
106
+ #:
107
+ #: Read top-to-bottom as increasing breadth: ``authoring`` takes only the
108
+ #: read-only built-in subset; ``survey`` takes every built-in (mutating tools
109
+ #: included) but no app cards; ``all`` takes every built-in and every app
110
+ #: card. Reshaping a profile is a single-row edit here — no new branch in the
111
+ #: assembler.
112
+ #:
113
+ #: PORTED VERBATIM from TS ``provision.ts`` — including the
114
+ #: authoring→``survey`` / survey→``all`` name inversion (see the module
115
+ #: docstring's warning).
116
+ _PROFILE_TABLE: Mapping[str, _ProfilePolicy] = MappingProxyType(
117
+ {
118
+ "authoring": _ProfilePolicy(builtins="survey", app_cards=False),
119
+ "survey": _ProfilePolicy(builtins="all", app_cards=False),
120
+ "all": _ProfilePolicy(builtins="all", app_cards=True),
121
+ }
122
+ )
123
+
124
+
125
+ # ---------------------------------------------------------------------------
126
+ # Selection
127
+ # ---------------------------------------------------------------------------
128
+
129
+
130
+ def cards_for_deck_profile(profile: DeckProfile) -> list[CapabilityCard]:
131
+ """The catalog rows a profile selects, in catalog order: the built-in
132
+ subset the policy names, followed by the app-novel cards when the policy
133
+ grants them.
134
+
135
+ Derived purely from the profile table + the catalog — no per-profile
136
+ branching beyond the table lookup.
137
+
138
+ :param profile: the requested deck profile
139
+ :raises DeckFault: ``unknown_capability`` when the profile is not in the
140
+ table
141
+ """
142
+ policy = _PROFILE_TABLE.get(profile)
143
+ if policy is None:
144
+ raise deck_fault(
145
+ "unknown_capability",
146
+ f'No deck profile is registered under "{profile}".',
147
+ )
148
+ builtins = cards_for_profile(policy.builtins)
149
+ return [*builtins, *APP_NOVEL_CARDS] if policy.app_cards else builtins
150
+
151
+
152
+ # ---------------------------------------------------------------------------
153
+ # Assembly
154
+ # ---------------------------------------------------------------------------
155
+
156
+
157
+ def _build_selected(
158
+ cards: Sequence[CapabilityCard], ctx: DeckContext
159
+ ) -> list[AnyCapability]:
160
+ """Build every selected card against a context, surfacing a typed
161
+ :class:`DeckFault` (``build_failed``) if any card's ``build`` throws — so
162
+ a single bad factory names itself instead of sinking the whole assembly
163
+ opaquely."""
164
+ built: list[AnyCapability] = []
165
+ for card in cards:
166
+ try:
167
+ built.append(card.build(ctx))
168
+ except Exception as cause:
169
+ raise deck_fault(
170
+ "build_failed",
171
+ f'Capability "{card.id}" failed to build.',
172
+ cause,
173
+ ) from cause
174
+ return built
175
+
176
+
177
+ class _ProvisionedDeck:
178
+ """The assembled deck: capabilities built once at provision time, handed
179
+ out as fresh copies so a caller cannot mutate the backing list."""
180
+
181
+ __slots__ = ("_capabilities",)
182
+
183
+ def __init__(self, capabilities: list[AnyCapability]) -> None:
184
+ self._capabilities = capabilities
185
+
186
+ def tools(self) -> list[AnyCapability]:
187
+ return list(self._capabilities)
188
+
189
+ def box(self) -> DeckBox:
190
+ return list(self._capabilities)
191
+
192
+
193
+ def provision_deck(profile: DeckProfile, ctx: DeckContext) -> _ProvisionedDeck:
194
+ """Provision a :class:`ToolDeck` for a profile and working context.
195
+
196
+ Looks the profile up in the profile table, selects its catalog rows,
197
+ builds each against ``ctx``, and returns a deck that hands the resulting
198
+ capabilities out two ways:
199
+
200
+ - :meth:`ToolDeck.tools` — the flat ``list[AnyCapability]`` for
201
+ inspection, naming, and ``--tools`` style selection.
202
+ - :meth:`ToolDeck.box` — the same list (= the framework ``AgentTool``
203
+ list) the conductor consumes verbatim as
204
+ ``SessionConductorOptions.tools``.
205
+
206
+ The capabilities are built once, at provision time, and the same list
207
+ backs both reads (returned as fresh copies so a caller cannot mutate the
208
+ deck's backing list). Bridge/MCP tools are concatenated onto ``tools()``
209
+ by the host after provisioning; they are not part of the static selection.
210
+
211
+ :param profile: the requested capability set
212
+ (``authoring`` | ``survey`` | ``all``)
213
+ :param ctx: the working context (cwd + injectable backends) to bind cards
214
+ to
215
+ """
216
+ selected = cards_for_deck_profile(profile)
217
+ return _ProvisionedDeck(_build_selected(selected, ctx))
@@ -0,0 +1,146 @@
1
+ """Channels subsystem — public barrel (port of TS ``src/channels/index.ts``).
2
+
3
+ Re-exports the FROZEN channels contract: the JSON-RPC 2.0 envelope constants
4
+ (:data:`PROTOCOL_VERSION`, :data:`OP_ERROR`, :func:`is_reply_ok`), the
5
+ declarative operation registry (:class:`Op`, :data:`OpRegistry`,
6
+ :func:`define_ops`), the NDJSON framer surface (:class:`NdjsonFramer` /
7
+ :func:`encode_line` / :func:`decode_lines`), the dialog primitives
8
+ (:class:`Ask` / :class:`Tell` / :class:`DialogBridge`), the
9
+ :class:`ChannelContext`, the wire session projection (:data:`LinkSnapshot` /
10
+ :func:`project_snapshot`), and the oneshot channel shapes
11
+ (:class:`OneshotRequest` / :class:`OneshotStrategy` / :func:`run_oneshot`) —
12
+ plus the link server, generated driver, and dialog bridge from
13
+ :mod:`induscode.channels.link`. Consumers import the channel surface from
14
+ ``induscode.channels`` rather than reaching into individual modules.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ from induscode.channels.contract import (
20
+ DEFAULT_CHANNEL_TIMINGS,
21
+ LINK_SNAPSHOT_FIELDS,
22
+ OP_ERROR,
23
+ PROTOCOL_VERSION,
24
+ REQUEST_ID_PREFIX,
25
+ Ask,
26
+ AskAnswer,
27
+ ChannelContext,
28
+ ChannelTimings,
29
+ ConductorState,
30
+ DialogBridge,
31
+ LinkSnapshot,
32
+ NdjsonFramer,
33
+ OneshotRequest,
34
+ OneshotShape,
35
+ OneshotStrategy,
36
+ Op,
37
+ OpError,
38
+ OpRegistry,
39
+ ReadableChunks,
40
+ RequestId,
41
+ SessionConductor,
42
+ Signal,
43
+ Tell,
44
+ ThinkingLevel,
45
+ Usage,
46
+ WritableLine,
47
+ define_ops,
48
+ is_reply_ok,
49
+ mint_wire_id,
50
+ resolve_timings,
51
+ signal_to_wire,
52
+ )
53
+ from induscode.channels.framer import decode_lines, encode_line, ndjson_framer
54
+ from induscode.channels.link import (
55
+ DIALOG_TABLE,
56
+ DialogBridgeDeps,
57
+ DialogSpec,
58
+ LinkClient,
59
+ LinkDriverHandle,
60
+ LinkDriverIo,
61
+ LinkRequestError,
62
+ LinkServer,
63
+ LinkServerIo,
64
+ LinkedDialogBridge,
65
+ create_dialog_bridge,
66
+ create_link_driver,
67
+ create_link_server,
68
+ make_dialog_methods,
69
+ )
70
+ from induscode.channels.oneshot import inert_dialog, run_oneshot
71
+ from induscode.channels.ops import (
72
+ OpRegistryHandle,
73
+ UnknownOpError,
74
+ build_ops,
75
+ dispatch,
76
+ has_op,
77
+ methods_of,
78
+ )
79
+ from induscode.channels.session_ops import (
80
+ DEFAULT_THINKING,
81
+ SESSION_OPS,
82
+ project_snapshot,
83
+ )
84
+
85
+ __all__ = [
86
+ "Ask",
87
+ "AskAnswer",
88
+ "ChannelContext",
89
+ "ChannelTimings",
90
+ "ConductorState",
91
+ "DEFAULT_CHANNEL_TIMINGS",
92
+ "DEFAULT_THINKING",
93
+ "DIALOG_TABLE",
94
+ "DialogBridge",
95
+ "DialogBridgeDeps",
96
+ "DialogSpec",
97
+ "LINK_SNAPSHOT_FIELDS",
98
+ "LinkClient",
99
+ "LinkDriverHandle",
100
+ "LinkDriverIo",
101
+ "LinkRequestError",
102
+ "LinkServer",
103
+ "LinkServerIo",
104
+ "LinkSnapshot",
105
+ "LinkedDialogBridge",
106
+ "NdjsonFramer",
107
+ "OP_ERROR",
108
+ "OneshotRequest",
109
+ "OneshotShape",
110
+ "OneshotStrategy",
111
+ "Op",
112
+ "OpError",
113
+ "OpRegistry",
114
+ "OpRegistryHandle",
115
+ "PROTOCOL_VERSION",
116
+ "REQUEST_ID_PREFIX",
117
+ "ReadableChunks",
118
+ "RequestId",
119
+ "SESSION_OPS",
120
+ "SessionConductor",
121
+ "Signal",
122
+ "Tell",
123
+ "ThinkingLevel",
124
+ "UnknownOpError",
125
+ "Usage",
126
+ "WritableLine",
127
+ "build_ops",
128
+ "create_dialog_bridge",
129
+ "create_link_driver",
130
+ "create_link_server",
131
+ "decode_lines",
132
+ "define_ops",
133
+ "dispatch",
134
+ "encode_line",
135
+ "has_op",
136
+ "inert_dialog",
137
+ "is_reply_ok",
138
+ "make_dialog_methods",
139
+ "methods_of",
140
+ "mint_wire_id",
141
+ "ndjson_framer",
142
+ "project_snapshot",
143
+ "resolve_timings",
144
+ "run_oneshot",
145
+ "signal_to_wire",
146
+ ]