@dev-mainsequence/codex-plugin 0.7.10 → 0.7.11

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.
@@ -1,10 +1,10 @@
1
- # MainSequence Codex plugin — panel and Claude parity
1
+ # MainSequence for Codex: capabilities and host differences
2
2
 
3
- Version **0.7.1**, with shared devtools **0.3.5**, implements the MainSequence panel's
4
- workflows in stock Codex. Claude is a read-only behavior/layout reference; its source
5
- and dependency stay unchanged. This is the real plugin, not a host probe.
3
+ The plugin implements the MainSequence panel's workflows in stock Codex. The Claude
4
+ Desktop plugin is a read-only behaviour and layout reference; its source and dependency
5
+ stay unchanged. No probe or custom Codex build is shipped.
6
6
 
7
- ## Current capability matrix
7
+ ## Capability matrix
8
8
 
9
9
  | Surface | Implemented behavior |
10
10
  | --- | --- |
@@ -19,25 +19,60 @@ and dependency stay unchanged. This is the real plugin, not a host probe.
19
19
  | Settings | Existing shared account, browser login, connection check, renewal, explicit shared sign-out; repositories folder/backend/Command Center settings; diagnostics and local scan |
20
20
  | Activity | Agent receipts/tasks plus accepted workspace operations, progress, explicit cancellation and results; accepted workspace work survives panel close/native Stop while the server remains alive |
21
21
 
22
- ## Stock Codex differences
23
-
24
- ### What the plugin exposes automatically
22
+ ## What the plugin exposes automatically
23
+
24
+ Enabling MainSequence registers the plugin's bundled `mainsequence` MCP server and its 16
25
+ integration tools (15 model-visible and one app-only submission acknowledgement), plus one
26
+ `ms_<tool>_<hash>` tool for every tool of every saved project MCP connection, named and
27
+ bound exactly as the Claude Desktop plugin names and binds them. Those tools use the
28
+ shared devtools session. The plugin does not mirror the central platform `/mcp` catalog as
29
+ individual Codex functions, and saved connections do not become separate native MCP
30
+ configuration entries.
31
+
32
+ The registered project tools come from devtools' shared project-tool catalog
33
+ (`project-tool-catalog.json` beside `mcp-connections.json`, the same file, names, schemas
34
+ and result shape the Claude Desktop plugin uses; devtools ADR 0004). `tools/list` answers
35
+ from it at once; one chat's server refreshes it in the background when it is older than 15
36
+ minutes or after a connection or account change, and sends `tools/list_changed`. A listing
37
+ is scoped to the current account's backend once the server has learned it. A call to an
38
+ `ms_*` tool forwards to `mcp-call` with the saved connection's backend, environment and
39
+ release and returns the remote tool's own content and `structuredContent`, with `summary`,
40
+ `error` and `effects` appended as in Claude. The catalog holds schemas only, never
41
+ credentials or results; one process refreshes at a time under a lock file; a connection
42
+ whose catalog cannot be read keeps its earlier tools and is reported in
43
+ `mainsequence_open` → `registeredTools.unavailable`.
44
+ `MAINSEQUENCE_CODEX_TOOL_CATALOG=off` stops a server from reading or writing the catalog on
45
+ its own (the packaged test uses it); cached tools are still listed.
46
+
47
+ Project MCP requests are slow when the project has scaled to zero: a first call to the
48
+ Production CRM measured 53–71 s, a warm one 7–10 s. `.mcp.json` therefore sets
49
+ `tool_timeout_sec: 300` (Codex's default is 60 s) and the server's own per-request limit is
50
+ 290 s; devtools gives a project request 120 s and honours a tool's advertised
51
+ `_meta["mainsequence.ai/timeout-seconds/v1"]` up to 300 s. Error messages from devtools name
52
+ the endpoint, the request (`tools/call crm_contacts_list`) and the status, tell a timeout
53
+ from a connection failure, and keep a JSON-RPC error's own message; the server passes them
54
+ through unchanged. Every `INVALID_REQUEST` from the discovery layer names the argument and
55
+ what is accepted: a wrong `environmentUid` lists the account's environments; a release
56
+ known in another environment names that environment; an unknown release says which read
57
+ (`mainsequence_view connections` or `mainsequence_discover tools`) must come first; an
58
+ omitted `arguments` object on `mainsequence_call_tool` is an empty object; release ids match
59
+ regardless of case. `CONTEXT_CHANGED` carries its cause (`AUTH_REJECTED: The MCP endpoint
60
+ returned HTTP 401.`).
61
+
62
+ Agent icons come inline from the platform's agent directory (`include_icons: true`); the
63
+ panel does not request individual icon URLs, and a missing or invalid image renders the
64
+ placeholder. While the Agents list or an agent's details stay on screen, the panel re-reads
65
+ what it shows once a minute (the same directory page, or the agent view) so an icon changed
66
+ in Command Center is redrawn in place; the list, drafts and scroll position stay. The timer
67
+ ends with the screen and pauses after 240 re-reads until the screen is opened again.
68
+
69
+ The server captures its panel resources at startup and runs from a stable home directory,
70
+ so a plugin update that removes an older plugin cache does not break an existing chat.
71
+ Explicitly selected MCP backends resolve independently of the working directory; a missing
72
+ directory needed for an implicit project lookup returns `CURRENT_DIRECTORY_UNAVAILABLE`
73
+ with recovery guidance.
25
74
 
26
- Enabling MainSequence registers the plugin's bundled `mainsequence` MCP server and
27
- its 16 integration tools (15 model-visible and one app-only submission acknowledgement),
28
- plus one `ms_<tool>_<hash>` tool for every tool of every saved project MCP connection,
29
- named and bound exactly as the Claude Desktop plugin names and binds them. Those tools
30
- use the shared devtools session. The plugin does not mirror the central platform `/mcp`
31
- catalog as individual Codex functions. Saved connections do not become separate native
32
- MCP configuration entries. The registered project tools come from devtools' shared
33
- project-tool catalog (`project-tool-catalog.json` beside `mcp-connections.json`, the same
34
- file, names, schemas and result shape the Claude Desktop plugin uses; devtools ADR 0004)
35
- that `tools/list` answers from at once; one chat's server refreshes it in the background
36
- when it is older than 15 minutes or after a connection or account change, and sends
37
- `tools/list_changed`. The
38
- `tools/list_changed` observation below describes the host's measured registration
39
- behavior: a connection saved in the current chat is registered for the next chat, and is
40
- usable immediately through `mainsequence_tools` / `mainsequence_call_tool`.
75
+ ## Stock Codex differences
41
76
 
42
77
  These are host-integration differences, not reasons to omit domain functionality:
43
78
 
@@ -48,12 +83,11 @@ These are host-integration differences, not reasons to omit domain functionality
48
83
  - **External assistant bubbles without a model turn:** the panel cannot append arbitrary
49
84
  assistant transcript entries. Saved replies return as native MCP results and Codex
50
85
  presents them. They stay in context, with a Codex inference turn.
51
- - **Dynamic top-level project tool registration:** measured stock-host behavior refreshes
52
- server status after `tools/list_changed`, but does not rebuild model function schemas
53
- until a host plugin reload or a new chat. Project tools registered from the catalog
54
- cache are therefore those known when the chat's server started; fresh tools remain
55
- usable immediately through the stable `mainsequence_tools` / `mainsequence_call_tool`
56
- interface.
86
+ - **Dynamic top-level project tool registration:** stock Codex refreshes server status
87
+ after `tools/list_changed` but does not rebuild model function schemas until a host
88
+ plugin reload or a new chat. Project tools registered from the catalog cache are
89
+ therefore those known when the chat's server started; fresh tools remain usable
90
+ immediately through the stable `mainsequence_tools` / `mainsequence_call_tool` interface.
57
91
  - **Native workspace/terminal controls:** the MCP App bridge exposes no native folder
58
92
  picker, automatic multi-root session attachment, signed-terminal environment injection,
59
93
  or start-in-devcontainer API. Folder paths, repository preparation, opening the OS
@@ -62,10 +96,10 @@ These are host-integration differences, not reasons to omit domain functionality
62
96
  belong to Codex's launch configuration, not to the running panel.
63
97
 
64
98
  Workspace operations are retained for the server lifetime; they are not replayed after
65
- server restart. Agent requests/receipts remain durable across restart. Native Stop does
66
- not imply remote cancellation or rollback. A platform reconciliation receipt for ambiguous
67
- message sends is still unavailable; the client blocks resend rather than claiming
68
- end-to-end distributed exactly-once delivery.
99
+ server restart. Agent requests and receipts remain durable across restart. Native Stop does
100
+ not imply remote cancellation or rollback. The platform offers no reconciliation receipt
101
+ for an ambiguous message send, so the client blocks resend rather than claiming end-to-end
102
+ exactly-once delivery.
69
103
 
70
104
  ## Use
71
105
 
@@ -76,6 +110,19 @@ Use **Messages and recovery** on the same request after interruption. **Activity
76
110
  owned task controls and workspace progress. Mutating workspace and MCP controls show the
77
111
  selected target and explicit review; destructive operations require a fresh core preview.
78
112
 
113
+ Agent messaging in detail: the panel first saves an immutable request, then submits a
114
+ native message containing only the saved request ID and relay instructions. Codex calls
115
+ `mainsequence_agent_request` and quotes the returned `receipt.message`, labelled with the
116
+ agent name. The host obtains chat identity from Codex's thread metadata; tool arguments
117
+ cannot supply it, and a global panel without a chat can browse but cannot message. Records
118
+ are scoped by host, chat, backend and verified shared account and live in private local
119
+ application data under `MainSequenceCLI/agent-delivery-v1`, which holds messages and
120
+ receipts, never credentials. Pending messages can be cancelled and expire after 24 hours;
121
+ failed preparation with zero dispatches can be recovered under the same ID; errors after
122
+ dispatch are never retried; after a process dies during send, or a transport response is
123
+ ambiguous, the request is **uncertain** and resend is blocked. A new request must never be
124
+ used to bypass an uncertain one.
125
+
79
126
  ## Boundaries
80
127
 
81
128
  | MCP tool | Public devtools operations |
@@ -97,478 +144,32 @@ selected target and explicit review; destructive operations require a fresh core
97
144
  | `mainsequence_operations` | Host-owned accepted-operation status and cancellation |
98
145
  | `mainsequence_settings` | Public shared preferences and existing shared-session login/renewal/sign-out |
99
146
 
100
- The discovery tools are model- and app-accessible and return useful structured results without a UI. Their arguments are allowlisted; they do not accept arbitrary devtools actions. Context identifiers are short-lived server memory, not agent session IDs or a new persistent settings store. Restarting the MCP process requires refreshing the panel.
101
-
102
- The 0.4.1 panel avoided `mcp-list` because devtools 0.3.1 could backfill saved names during inspection. Devtools 0.3.2 adds explicit read-only listing, which the panel now uses without migrating or writing connections. Public typed results replace host-side backend response parsing. Devtools binds the actual request/retry credentials to the selected account; Codex retains local backend-change checks, context IDs and late-view rejection. No private package imports or independent MainSequence HTTP client are introduced.
103
-
104
- The UI uses the public MCP Apps JSON-RPC bridge. All colors, typography and radii prefer host CSS variables, with neutral light/dark fallbacks. Data is rendered as text, including external descriptions. The UI has no external fetches, scripts or fonts and declares empty connection/resource CSP lists. Its resource URI includes a build hash; the server captures immutable HTML at startup and the panel checks its identity before using results.
105
-
106
- The existing developer-command hook and conversational MCP skill retain their behavior. Those explicit workflows retain their existing mutations; directory and schema inspection stay read-only. Agent messaging uses the separate durable workflow below. Historical fixture tests are development evidence only; no probe plugin is required or shipped.
107
-
108
- ## Original 0.4.1 validation recorded on 2026-10-22
109
-
110
- - 26 tests passed: existing hook/CLI regression tests, production dependency/package boundaries, and ten panel tests.
111
- - The actual public devtools package parsed fixture account/environment/agent/MCP responses and acquired a fixture release credential for schema inspection. Saved connection bytes were unchanged; no credential persistence, agent sends or project tool invocations occurred. Credential values were absent from panel results.
112
- - Detached packaged MCP server started outside the checkout, exposed exactly three read-only tools, returned immutable UI after a file changed, and refused unknown tools, arguments and resources.
113
- - Simulated UI bridge verified explicit environment selection, literal text rendering, stale-result rejection, account invalidation and dark/light variable changes. It did not perform any native message or draft operation.
114
- - The stock Codex backend (`0.163.0-alpha.10.2`) installed the package in an isolated profile, discovered all three tools and the versioned app resource, and refused a stale context. No model turn or MainSequence request occurred. This confirms host registration, not desktop rendering.
115
- - The real local session check selected `http://127.0.0.1:8000` and returned **not signed in**, with no environment queries. No authenticated live agent/MCP directory is claimed.
116
- - Browser preview of a local file was blocked by Codex's URL policy. Desktop rendering and accessibility acceptance remain unverified; bridge tests are not screenshots or live-host evidence.
117
-
118
- Run `npm test`, `npm run release:check` and `node scripts/verify-panel-host.mjs` for code/package checks. The release check unpacks the npm archive, verifies the MCP/resource contract and runs the existing hook/CLI without `node_modules` or the source checkout. No publish occurs.
119
-
120
- ## 0.4.2 / devtools 0.3.2 upgrade
121
-
122
- The additional regression cases exercise shared environment pagination, account changes
123
- during identity verification and reads, safe same-account 401 retries, refusal to retry as
124
- another account, and refresh races that preserve another process's saved account. MCP
125
- tests cover byte-identical legacy-store reads, corrupt/missing stores, discovery-name
126
- enrichment and no connection mutation. Codex tests cover the new public request options,
127
- saved/unsaved badges and inspection controls, unchanged connection bytes and backend
128
- invalidation. Verified account identity takes precedence over stale saved display metadata.
129
- Existing native theme behavior remains covered by the bridge tests. Devtools passes 124
130
- tests and its standalone package checks; Codex's suite contains 30 tests. The upgrade also
131
- passes isolated stock Codex registration, without a model turn or MainSequence request.
132
-
133
- The release lock pins the exact devtools archive. The release sequence publishes devtools
134
- first and verifies registry integrity before building and publishing the Codex consumer.
135
- The local-archive helper described in the README supports development before publication.
136
- Desktop activation, rendering and authenticated live discovery remain separate acceptance steps.
137
-
138
- ## Live desktop acceptance — 2026-10-22
139
-
140
- Devtools 0.3.2 and the real Codex plugin 0.4.2 are published. The plugin is enabled in stock Codex and the public marketplace points to 0.4.2.
141
-
142
- With the user's approval, the existing shared MainSequence machine login was restored through Chrome for `http://127.0.0.1:8000`. The installed Codex plugin and Claude's devtools dependency read the same Keychain service, backend account and credential pair. No Claude code was changed and no separate Codex credential store was introduced. The earlier invalid saved record matched a synthetic SDK test token; its writer was not established.
143
-
144
- The active native MCP tools verified the account with the backend and completed these live reads:
145
-
146
- | Environment | Agents | MCP releases |
147
- | --- | ---: | ---: |
148
- | development | 2 | 2 |
149
- | Production | 7 | 5 |
150
-
151
- The already-saved Production CRM connection returned 70 tool schemas through `mainsequence_tools`. No agent messages or project tool calls were sent, and no connections were added. Directory runtime states were `unknown`; discovery does not establish runtime readiness.
152
-
153
- The expanded desktop panel displayed the verified shared account, accepted development environment selection and rendered both Agents and Tools directories. Unsaved MCPs correctly disabled schema inspection. Actual host CSS variables supplied Codex's neutral dark colors and system font. Screenshots and sanitized receipts are recorded in `artifacts/live-desktop-acceptance-0.4.2.json`, `artifacts/live-agents-codex-0.4.2.jpg` and `artifacts/live-tools-codex-0.4.2.jpg`. Historical validation above remains the record of what was known at each earlier stage.
154
-
155
- At the end of 0.4.2 acceptance, production messaging remained the next step. Live semantic search, pagination and agent runtime readiness were not claimed by that run. Claude remains independent and stock Codex remains the host.
156
-
157
- ## 0.5.0 / devtools 0.3.3: real agent messaging
158
-
159
- Choose **Message**, enter text, and select **Send in Codex** or **Draft in Codex**.
160
- The panel first saves an immutable request. It then submits a native message containing
161
- only the saved request ID and relay instructions. Codex calls `mainsequence_agent_request`
162
- and quotes the returned `receipt.message`, labelled with the agent name. The MCP result
163
- and native assistant reply become conversation context. This uses stock Codex's supported
164
- MCP App bridge; it does not insert an arbitrary external assistant identity.
165
-
166
- | Tool | Behavior |
167
- | --- | --- |
168
- | `mainsequence_stage_message` | Validate the current discovered agent/account/chat and persist the immutable request; no remote send |
169
- | `mainsequence_agent_request` | Deliver the saved request once, or cancel an unsent request |
170
- | `mainsequence_agent_status` | Read-only list/get/wait and exact saved receipts; no send approval needed |
171
- | `mainsequence_submission` | App-only acknowledgement bookkeeping; never evidence of remote delivery |
172
-
173
- The host obtains chat identity from Codex's `threadId`/`thread_id` tool metadata.
174
- Tool arguments cannot supply it. A global panel without a chat can browse but cannot
175
- message. Records are scoped by host, chat, backend and verified shared account. Stage
176
- requires the current discovery page; recovery does not need its expired context ID.
177
-
178
- **Stop and recovery:** Stop interrupts the native waiter. Accepted work continues in
179
- the MCP server and saves its receipt. Open **Messages and recovery** and recover the
180
- original request. Duplicate clicks, queued duplicate native arrivals and repeated
181
- recovery return the same work or receipt, without dispatching again. Reopening a panel
182
- only lists saved state; it never sends automatically. Pending messages can be cancelled
183
- and expire after 24 hours. Failed preparation with zero dispatches can be explicitly
184
- recovered under the same ID; errors after dispatch are never retried. Delivery does not cancel the remote agent when Codex stops.
185
-
186
- The shared devtools `AgentDelivery` service owns state, locks, readiness and dispatch.
187
- After a process dies during preparation, the stable session handle can resume. After a
188
- process dies during send, or a transport response is ambiguous, status is **uncertain**
189
- and resend is blocked. The platform has no authoritative direct-message reconciliation
190
- receipt, so this is at-most-once client dispatch, not a distributed exactly-once promise.
191
- A new request must never be used to bypass an uncertain one. The initial implementation
192
- supports direct-message agents; background task controls remain a later parity step.
193
-
194
- Storage is private local application data under `MainSequenceCLI/agent-delivery-v1`.
195
- It contains messages and receipts, never credentials. Receipt history is retained;
196
- 256 saved requests per conversation or the storage size bound refuses new writes rather
197
- than deleting deduplication history. UI colors, typography and controls still use Codex
198
- variables and neutral fallbacks. Claude and its pinned dependency are unchanged.
199
-
200
- Automated coverage includes Stop before/during dispatch, simultaneous recovery,
201
- process death, missing/corrupt storage, account/chat isolation, stale selections,
202
- double clicks, native submission order and safe receipt rendering. The opt-in
203
- `scripts/verify-agent-messaging-live.mjs ENVIRONMENT_UUID AGENT_UUID` uses a real agent
204
- and the existing shared login in an isolated stock Codex app-server. Its local scripted
205
- model transport inspects next-turn context; it is distinct from desktop click acceptance
206
- or a free-running model's recall. It sends one harmless echo, invokes native Stop,
207
- recovers the same ID twice and verifies the native transcript and subsequent model input.
208
- Development archives are not published automatically; publish devtools first, verify its
209
- registry integrity, then release the Codex consumer.
210
-
211
- ### Validation recorded on 2026-10-22
212
-
213
- - Devtools: **135 tests passed**. Codex plugin: **36 tests passed**, plus archive
214
- installation and detached execution checks. Claude code and dependency pins were not changed.
215
- - Stock Codex `0.163.0-alpha.10.2` registers seven production MCP tools, including a
216
- separate read-only status tool. Calls cannot override the host chat identity, and
217
- the read-only tool refuses delivery actions.
218
- - The production package, an isolated stock Codex profile and a local test backend
219
- passed native `turn/interrupt`, same-ID recovery twice, exactly one recorded A2A
220
- send, exact receipt reuse, native transcript persistence, and next-turn context
221
- inspection without another tool call. This is a deterministic transport test,
222
- not a claim of live-agent success or desktop button acceptance.
223
- - The real development **MetaTables Analyst** passed the same native Stop/recovery
224
- flow using the existing shared localhost account. It returned the requested echo;
225
- two subsequent recovery turns reused its exact saved receipt with `sendAttempts: 1`.
226
- The reply appeared in the native assistant transcript and the following turn's
227
- model input, with zero recall tool calls. MainSequence ran the real agent; the
228
- isolated stock Codex host used a deterministic local model transport to inspect
229
- context. This verifies real delivery and native context, not desktop button clicks
230
- or unrestricted model recall.
231
- - The real shared account successfully authenticated, discovered agents, created the
232
- Tutorial Helper session and survived native Stop. Its request reached the agent,
233
- whose canonical logs recorded `agent.model.failed` with HTTP 400 followed by an
234
- A2A HTTP 502. The request is `uncertain` and remains blocked from resend. No direct
235
- Message receipt lookup is advertised by the platform. The failure is not a login
236
- failure, and no fallback credentials or transport were introduced.
237
- - The local 0.5.0 build is installed and now active in the existing desktop chat.
238
- After the user's plugin toggle, the first call still reached 0.4.2 while reload
239
- completed. The subsequent call returned 0.5.0 / devtools 0.3.3 with messaging enabled,
240
- and the new native messaging tools appeared. Another restart was not needed.
241
-
242
- Sanitized reports live in `artifacts/agent-messaging-live-*.json`; each distinguishes
243
- `liveAgent: true` from the local test backend. The deterministic run ending in
244
- `e19e8676-cae5-48ca-bf5e-de2264fa49a2` passed all six checks. The Tutorial Helper run
245
- `b14f8a08-609c-43d1-b1ee-7c386b8f7999` records the live runtime failure separately.
246
- The real MetaTables Analyst run `0a506f95-727b-45e6-b5c6-0b33a59f2aa6` passed all
247
- five live delivery, recovery and context checks.
248
- Run `node scripts/verify-agent-messaging-live.mjs --fixture` for the reproducible
249
- host regression. Live mode requires explicit environment/agent IDs and sends a
250
- harmless no-tools echo; an uncertain request must never be retried or replaced.
251
-
252
- ### Active desktop messaging acceptance
253
-
254
- The real desktop panel verified the shared account, selected development, displayed
255
- two agents, opened the MetaTables composer and accepted one **Send in Codex** click.
256
- It saved request `f6eb8ea1-2a35-439f-8f7d-b5775eda42d0` before native submission; the
257
- host acknowledged the queue entry. Development MCP discovery also returned two releases.
258
- The active assistant delivered that same saved ID using the native MCP tool. The real
259
- agent replied, and repeated native recovery returned the identical saved receipt with
260
- `sendAttempts: 1`. Its exact reply was quoted in the native conversation.
261
-
262
- The panel received Codex's `rgb(24, 24, 24)` dark background, white text and system font;
263
- the inspected layout had no horizontal overflow. The inspector subsequently timed out,
264
- so the final receipt screenshot and recovery-button click are not claimed. Native Stop
265
- and next-turn context remain covered by the isolated stock-host test above; no desktop
266
- Stop click was made in this acceptance run. This desktop chat's following queued turn
267
- must reuse its saved receipt and must never dispatch another message.
268
-
269
- `artifacts/live-desktop-messaging-0.5.0.json` records the actual desktop results separately
270
- from the deterministic host harness. Publication remains a separate step.
271
-
272
- ## 0.6.0 layout and capability acceptance
273
-
274
- The compact layout follows Claude's header, navigation, name/action rows, list-to-detail
275
- navigation, connected-tools-first view and persistent agent selection. All UI chrome uses
276
- Codex theme variables with neutral fallbacks; the brand mark is a monochrome derivative
277
- of this repository's existing SVG. Real agent artwork is fetched through the new public
278
- `createAgentAssets` devtools API, never through credentials exposed to the panel. Assets
279
- are account/environment scoped, limited to canonical icon routes and bounded in size;
280
- reduced motion uses the static PNG frame.
281
-
282
- Regression coverage: devtools **139 tests**, Codex **41 tests**, plus both package checks.
283
- New cases cover image bounds/origin/account changes, details and examples, persistent
284
- drafts, connection reviews invalidated by navigation, and unknown-item execution refusal.
285
- Existing native messaging, Stop/recovery and no-duplicate-send tests remain in place.
286
- No additional live agent messages were sent for the visual redesign, and old uncertain
287
- requests were not touched.
288
-
289
- Read-only live acceptance uses the same shared localhost account: development exposes
290
- 2 agents, 2 MCP releases and 0 projects; Production exposes 7 agents, 5 releases and
291
- 14 projects. Both can read the account's 45 repositories. Agent icons, skills/examples,
292
- project branches, saved connections and preferences were read through the production
293
- package. `artifacts/design-live-acceptance-0.6.0.json` records individual results.
294
- Visual acceptance uses the exact panel source in a local browser harness with a captured
295
- read-only account snapshot and Codex theme variables. All mutations are disabled there;
296
- this is not presented as native desktop activation evidence.
297
-
298
- ### Gaps recorded at 0.6.0 (superseded by the current matrix)
299
-
300
- - Background task creation, progress, task cancellation and a new-agent-conversation control.
301
- - Workspace setup/attachment and repository mutation controls, deployment management,
302
- Docker/devcontainer operations and editable shared settings in the panel.
303
- - Native dock/composer replacement: stock Codex exposes an MCP App panel and native
304
- draft/send bridge, not Claude's host UI primitives. Agent replies still enter native
305
- conversation context through the verified durable MCP delivery path.
306
-
307
- The existing head implementation of organization-project setup still contains a
308
- Claude-specific attachment result/instruction path. That must become host-neutral before
309
- Codex exposes it. This release does not copy Claude's adapter into Codex or modify Claude.
310
- Development versions remain local until a separate release: publish devtools first,
311
- verify its registry integrity, rebuild the Codex archive, then publish the consumer.
312
-
313
- ## 0.7.0 validation
314
-
315
- The reference was inspected in the actual Claude Desktop MainSequence panel, including
316
- its compact Code list and project controls. The updated Codex source is checked in a
317
- read-only Chrome preview at side-panel widths; this is separate from native Codex
318
- activation and rendering acceptance.
319
-
320
- Shared devtools tests cover durable preparation, direct-message Stop/recovery, task
321
- receipts/cancellation, account isolation, safe workspace settings writes and deployment
322
- projection/redaction. Plugin tests cover native bridge order, stale selections, scoped
323
- workspace actions, previews and accepted-operation cancellation. Package verification
324
- runs the detached npm bundle without node_modules. The isolated stock Codex runtime
325
- loads all 16 MCP tools and the immutable panel resource without a model turn.
326
-
327
- Read-only live acceptance uses the existing shared login: development has 2 agents,
328
- 2 MCP releases and 0 projects; Production has 7 agents, 5 releases and 14 projects.
329
- Both environments return repository/local discovery and deployment history; run/stage
330
- and log reads succeed. The existing Production CRM MCP returns 70 schemas. No agent
331
- message, connection mutation, repository setup or production tool invocation is performed
332
- by this read-only check. See local `artifacts/design-live-acceptance-0.7.0.json` and
333
- `artifacts/parity-host-0.7.0.log` for evidence. Local development archives are not published.
334
-
335
- ### Final package and desktop activation acceptance
336
-
337
- The completed release checks passed **144 devtools tests and 44 plugin tests**, both
338
- type checks and detached package verification. The installed production bundle matched
339
- all 64 generated plugin files. The isolated stock host exposed all 16 tools and refused
340
- stale context, without contacting MainSequence or running a model turn.
341
-
342
- After the user's plugin toggle, this existing native desktop chat returned plugin
343
- **0.7.0 / devtools 0.3.5**, build
344
- `96b8527853e477a8c0604ab20bb05a67108f0c4f6ce38ca8bc5d44eecf28930d`.
345
- The native MCP App displayed the new compact header/navigation, authenticated shared
346
- account, environment selector and editable Settings view. Native settings and Production
347
- deployment-history reads succeeded against localhost. The inspector then timed out
348
- twice, so a complete native click-through and a final native screenshot are **not**
349
- claimed. This is an inspection limit, not an unresolved plugin activation.
350
-
351
- The existing delivered request `f6eb8ea1-2a35-439f-8f7d-b5775eda42d0` was read through
352
- the new native server, without delivery or staging. It remained `delivered`, with
353
- `sendAttempts: 1`, the same session and the exact receipt
354
- `The blue fox found seven stars.` The receipt was quoted again in this native chat.
355
- This verifies persisted-receipt recovery after activation; it is not a new live Stop
356
- test or a new task-mode dispatch. The earlier stock-host Stop/context acceptance and
357
- the current deterministic regression tests supply those separate checks.
358
-
359
- The read-only live suite completed 18 checks with zero failures. The final local
360
- discovery check found 41 folders, 30 matched to current remote repositories. Browser
361
- visual checks use the exact final HTML with a captured account snapshot and disabled
362
- mutations: dark/light, 320/460-pixel widths, Home, Code/list/setup/maintenance,
363
- Projects/list/detail, Agents, Tools with 70 CRM schemas, Settings and deployment
364
- history/stages. They do not substitute for native host rendering evidence. Screenshots:
365
- `artifacts/parity-0.7.0-agents-dark.png`,
366
- `artifacts/parity-0.7.0-tools-dark.png` and
367
- `artifacts/parity-0.7.0-settings-light-320.png`.
368
-
369
- New workspace mutations and agent task controls have fixture/contract coverage; they
370
- were not exercised against production resources during this visual acceptance. Workspace
371
- jobs still have server-lifetime storage, while agent receipts have durable storage.
372
- Claude's working tree and its devtools dependency remain unchanged. Neither development
373
- version was published. `artifacts/parity-acceptance-0.7.0.json` separates these results.
374
-
375
- ## 0.7.1 live-test fixes
376
-
377
- The next real desktop pass found that a dual-mode agent had no Task selector: Talk
378
- always chose Message when both modes were supported. The composer now exposes the
379
- advertised modes, preserves the draft when switching mode and keeps continued tasks
380
- locked to Task. Continuing a saved task selects its saved environment before staging.
381
- Read failures from workspace-entry buttons now appear in the panel, and opening a
382
- workspace from Home selects the Code tab correctly.
383
-
384
- All **47 plugin tests**, type checking, detached package validation and isolated stock
385
- Codex registration pass. Shared devtools remains 0.3.5. The real 0.7.0 Code view loaded
386
- local/remote repositories and checked a disposable local workspace; the CRM task-capable
387
- session was prepared without a message. One container-write job failed during backend
388
- verification; the target file was absent on inspection, and the operation was not
389
- repeated. The later read succeeded with the same shared login. This is recorded as a
390
- failed live check, not a successful write or a credential migration.
391
-
392
- At this checkpoint 0.7.1 is installed locally and activation has been requested. Native
393
- task submission/Stop/recovery and successful workspace mutations remain pending;
394
- `artifacts/live-desktop-operations-0.7.0.json` records the checkpoint. Claude is unchanged.
395
-
396
- ### Update lifecycle (0.7.5)
397
-
398
- The server captures its panel resources at startup and runs from a stable home
399
- directory, so an update removing an older plugin cache does not break its existing
400
- chat. Devtools 0.3.8 resolves explicitly selected MCP backends independently of cwd.
401
- A missing directory needed for implicit project lookup returns
402
- `CURRENT_DIRECTORY_UNAVAILABLE` with recovery guidance. The server's working
403
- directory is diagnostic information only; Code actions use selected repositories.
404
-
405
- The regression suite removes a running detached package and verifies its settings,
406
- tool list and captured panel remain available. `scripts/verify-update-lifecycle-live.mjs`
407
- checks account, environments, agents, saved CRM schemas and local discovery using
408
- the existing shared session after removing only a disposable package copy.
409
-
410
-
411
- ## Inline icon correction — 0.7.8
412
-
413
- The Agents directory, semantic search and detail request the platform's existing
414
- `include_icons: true` through devtools `includeIcons: true`. Images and their
415
- reduced-motion still frames are projected from `command_center_icon.idle` in that
416
- same response. The panel does not request a second Command Center directory or
417
- individual `/icon/` URLs. Missing or invalid inline images render the placeholder
418
- without any image-fetch fallback. The legacy `view: assets` request remains a
419
- network-free no-op for old panel HTML; reopen the current panel to render icons.
420
-
421
- The shared devtools transport still coalesces the combined response across chat
422
- processes. There is no periodic agent/icon refresh (until 0.7.10, below). Explicit Refresh
423
- requests a fresh directory. No change is made to the shared login or Claude.
424
-
425
- ## Direct project tools, timeouts and distinct refusals — 0.7.8
426
-
427
- Measured against the Production CRM release on 2026-10-23 with plain `fetch`: a cold
428
- `mcp-call` took 53–71 s (release detail and exchange-launch about 2 s each, the
429
- project's `initialize` 9 s to over 60 s, `tools/call crm_contacts_list` 39 s), a warm one
430
- 7–10 s. Codex's default `tool_timeout_sec` is 60 s, so the host failed the tool while the
431
- server was still waiting; Claude Desktop runs the same devtools call with a 30-minute
432
- budget and succeeds. Three changes follow from that comparison:
433
-
434
- - `.mcp.json` sets `tool_timeout_sec: 300`. The server's own per-request limit is 290 s.
435
- In 0.7.8 the server gave project MCP requests (`mainsequence_tools`,
436
- `mainsequence_call_tool`, `mainsequence_connection` and the registered `ms_*` tools) a
437
- 120 s HTTP budget per message instead of devtools' 60 s default; since 0.7.9 that budget
438
- is devtools' own default (`projectRequestTimeoutMs`), and a tool's advertised
439
- `_meta["mainsequence.ai/timeout-seconds/v1"]` is honoured up to 300 s.
440
- - Saved project MCP tools are registered directly as `ms_<tool>_<hash>`
441
- (`src/hosts/toolCatalog.ts` in 0.7.8; devtools' shared project-tool registry since
442
- 0.7.9, see below), with the same FNV-1a naming as the Claude plugin, so
443
- `ms_crm_contacts_list_183f8138` is the same tool in both hosts. A call forwards to
444
- `mcp-call` with the saved connection's backend, environment and release and returns the
445
- remote tool's own content and `structuredContent`, with `summary`, `error` and
446
- `effects` appended as in Claude. No `expectedAccount` snapshot is attached; devtools
447
- verifies the shared session for the connection's backend. The catalog cache holds
448
- schemas only, never credentials or results; one process refreshes at a time under a
449
- lock file; a connection whose catalog cannot be read keeps its earlier tools and is
450
- reported in `mainsequence_open` → `registeredTools.unavailable`. `mainsequence_tools`
451
- no longer discards the shared transport cache for every chat process.
452
- - Every `INVALID_REQUEST` from the discovery layer now names the argument and what is
453
- accepted: a wrong `environmentUid` lists the account's environments; a release known
454
- in another environment names that environment; an unknown release says which read
455
- (`mainsequence_view connections` or `mainsequence_discover tools`) must come first; an
456
- omitted `arguments` object on `mainsequence_call_tool` is an empty object, as its
457
- schema says; release ids match regardless of case. `CONTEXT_CHANGED` carries its cause
458
- (`AUTH_REJECTED: The MCP endpoint returned HTTP 401.`) instead of a bare "refresh".
459
-
460
- `MAINSEQUENCE_CODEX_TOOL_CATALOG=off` stops a server from reading or writing the
461
- catalog on its own (the packaged test uses it); cached tools are still listed.
462
-
463
- Live acceptance on 2026-10-23, Codex CLI 0.163.0, local marketplace install: a fresh
464
- server's first `tools/list` returned the 16 plugin tools; its background refresh wrote
465
- 70 CRM schemas to the catalog and sent `tools/list_changed`; the next `tools/list`
466
- returned 86 tools. In `codex exec` sessions the model found and called
467
- `mcp__mainsequence__ms_crm_contacts_list_68ee6e71` directly through its code-mode tool and
468
- answered with the contact's title and uid; attempts ran 20–35 s and were not cut off by
469
- the host. Three earlier sessions failed on upstream errors only (`HTTP 503` and a reset
470
- from the project gateway, `HTTP 500` from the development backend behind the
471
- `local-backend` haproxy); a plain-fetch call made in the same minute as the successful
472
- session also met one backend `HTTP 500`. Those errors now reach the model with their
473
- status code instead of a generic "refresh" message.
474
-
475
- ## Shared project-tool registry — 0.7.9
476
-
477
- The 0.7.8 comparison left two copies of the same five things in the Claude Desktop and
478
- Codex plugins: the tool name, the definition, the result shape, the catalog refresh and the
479
- state directory. devtools 0.3.12 owns them now (its ADR 0004, "Shared project-tool registry
480
- for host plugins"), and this release consumes that API:
481
-
482
- - `src/hosts/toolCatalog.ts` is gone. The server creates devtools'
483
- `createProjectToolCatalog({ dispatch, disabled, notify })`, lists `catalog.list()` after its
484
- own 16 tools, keeps `tools/list_changed`, `catalog.update()` after `mainsequence_tools`
485
- and `catalog.refresh(true)` after a connection or account change, and answers an `ms_*`
486
- call with `projectToolResult(mcp-call)`. Names, schemas, hints and results are the bytes
487
- devtools produces, so they are the Claude Desktop plugin's.
488
- - The catalog file is `project-tool-catalog.json` beside `mcp-connections.json`, shared
489
- with the Claude Desktop plugin; a refresh by either host is visible to the other at its
490
- next listing. The 0.7.8 file, `codex-tool-catalog.json`, is left in place and unused; the
491
- first refresh writes the new one. A listing is scoped to the current account's backend,
492
- so connections another backend saved into the same file stay out of this chat's tools.
493
- - devtools gives project MCP requests a 120 s budget of its own and honours a tool's
494
- advertised timeout up to 300 s; the server's 120 s override from 0.7.8 is removed.
495
- Error messages from devtools now name the endpoint, the request (`tools/call
496
- crm_contacts_list`) and the status, tell a timeout from a connection failure, and keep
497
- a JSON-RPC error's own message; the server passes them through unchanged.
498
- - `tests/panel-tool-catalog.test.cjs` moved to devtools (`tests/project-tools.test.cjs`,
499
- with the frozen name vector `ms_crm_contacts_list_183f8138`); `panel-server.test.cjs`
500
- still proves the packaged server registers a cached connection's tool with devtools'
501
- name and schema.
502
-
503
- Pins devtools 0.3.12, built from its registry archive (`npm ci --ignore-scripts`; the integrity in
504
- `package-lock.json` and `build-info.json` is the registry's `dist.integrity`). `npm run
505
- release:check`: 55 tests, release metadata, the standalone and npm archives, the npm archive
506
- exercised as Codex installs it.
507
-
508
- Live acceptance on 2026-10-23 with this build's packaged server over stdio
509
- (`codex/dist/panel-server.js`, the shared machine session, backend `http://local-backend:8000`,
510
- environment Production): `initialize` answered `mainsequence 0.7.9` with `tools.listChanged`. The
511
- first `tools/list` returned 160 tools, the 16 plugin tools plus 144 project tools: before the
512
- server has learned its backend from `auth-status`, the shared file's two scopes
513
- (`http://127.0.0.1:8000`, written by the Claude Desktop plugin, and `http://local-backend:8000`)
514
- are both listed. The background refresh learned the backend and sent `tools/list_changed` 0.5 s
515
- later; the next `tools/list` returned 88 tools, the 72 CRM tools named for this backend
516
- (`ms_crm_contacts_list_68ee6e71`, described `MainSequence crm [Production]: List CRM contacts
517
- with bounded paging and filters.`). `tools/call ms_crm_contacts_list_68ee6e71` with
518
- `page_size: 1` returned in 10.1 s with `isError` unset: two text blocks and `structuredContent`
519
- `code: ok` with one contact of 212. In the same hour the Claude Desktop plugin 0.4.19 registered
520
- the same release's tools from the same shared file under the `127.0.0.1:8000` names. The record
521
- is the local `artifacts/live-acceptance-0.7.9.json`. The pre-backend listing of every scope is a
522
- devtools follow-up: a fresh server's first list could be scoped to the configured backend.
523
-
524
- Published on 2026-10-23 (UTC) from tag `v0.7.9` on main `9cddf65`, the merge of the acceptance
525
- record above, by the release workflow (run 40032861384: `npm ci` from the registry devtools
526
- archive, `release:check`, `npm publish --provenance` through trusted publishing). The registry
527
- serves `@dev-mainsequence/codex-plugin@0.7.9` as `latest`, 70 files, integrity
528
- `sha512-5EmHyWdb3V+DB8EJmKsfK/P8bvMP+2DO04ntwuuO7EqDwbIVo5DNCOJctJJAiQlHqdVKNgbFSoEMUKjHKKL0iA==`,
529
- read from the registry after publishing (a local `npm pack` of the same files has another
530
- integrity). The devtools marketplace entry was advanced from 0.4.2 to 0.7.9
531
- (mainsequence-sdk/mainsequence-devtools#20, main `18cbfc8`). In an isolated `CODEX_HOME` with
532
- the Codex CLI 0.163.0, `codex plugin marketplace add
533
- https://github.com/mainsequence-sdk/mainsequence-devtools.git`, `codex plugin marketplace upgrade
534
- mainsequence` and `codex plugin add mainsequence@mainsequence` installed `mainsequence@mainsequence`
535
- 0.7.9 from the npm package into `plugins/cache/mainsequence/mainsequence/0.7.9`, with the
536
- manifest, `dist/panel-server.js`, `dist/runner.js`, hooks, skills and `.mcp.json` in place and
537
- `build-info.json` naming devtools 0.3.12 by its registry integrity; `codex plugin list` reported
538
- it installed and enabled. The owner's own Codex home (local `mainsequence-local` marketplace,
539
- 0.7.8 installed) was not touched; upgrading it is a user step: `codex plugin marketplace upgrade
540
- mainsequence`, `codex plugin add mainsequence@mainsequence`, then review the hook and start a new
541
- chat.
542
-
543
- ## Agent icons follow Command Center — 0.7.10
544
-
545
- An icon changed in Command Center reached an open panel only after Refresh or a new app card:
546
- the Agents list drew an agent's inline icon when it listed agents and nothing re-read the
547
- directory while the list stayed on screen. (The Claude Desktop plugin had the same gap and fixed
548
- it in its 0.4.20 with the per-agent icon route and entity tags; the Codex panel takes icons
549
- inline from the directory, so it re-reads that instead.)
550
-
551
- - While the Agents list or an agent's details stay on screen, the panel re-reads what it shows
552
- once a minute: the directory page (`mainsequence_discover`, same search and offset) for the
553
- list, the agent view for the details. The read carries no `refresh` flag: the shared
554
- transport keeps a directory read for 30 s, so a read a minute later is fresh without
555
- invalidating other panels' caches, unlike the Refresh button.
556
- - Only a changed icon is redrawn, in place: the list, drafts and scroll position stay. A
557
- removed icon shows the placeholder; a failed re-read keeps the drawn icons and tries again at
558
- the next minute.
559
- - The timer ends with the screen (another section, a detail or list change, environment
560
- change, teardown) and pauses after 240 re-reads until the screen is opened again. Nothing is
561
- stored; the inline icons live in the panel's memory as before.
562
-
563
- Verification on 2026-10-24: `npm run release:check` from the registry devtools 0.3.12 archive,
564
- 56 tests (new: the panel UI test drives the minute timer through the vm harness and checks an
565
- unchanged, changed, removed, restored and failed re-read, the detail view's re-read, the timer
566
- ending on another section and on teardown, and that the Refresh button alone sends `refresh`),
567
- release metadata, the standalone and npm archives, the npm archive exercised as Codex installs
568
- it. Live acceptance with the built server over stdio and the server-stamped panel page driven
569
- in a minimal DOM (Production, seven agents, the shared machine session): the list drew seven
570
- icons; two minute re-reads each read the directory page without `refresh` (14–17 s per read
571
- against the local backend, in the background), found no change and redrew nothing; the timer
572
- ended when Tools was shown, came back on Agents and ended on teardown. No icon was changed in
573
- Command Center during the run; the changed, removed and failed paths are the UI test's.
574
- Publication records for 0.7.10 follow below once released.
147
+ The discovery tools are model- and app-accessible and return useful structured results
148
+ without a UI. Their arguments are allowlisted; they do not accept arbitrary devtools
149
+ actions. Context identifiers are short-lived server memory, not agent session IDs or a new
150
+ persistent settings store. Restarting the MCP process requires refreshing the panel.
151
+
152
+ Saved connections are read with devtools' read-only listing, without migrating or writing
153
+ them. Public typed results replace host-side backend response parsing. Devtools binds the
154
+ actual request and retry credentials to the selected account; the plugin keeps local
155
+ backend-change checks, context IDs and late-view rejection. No private package imports or
156
+ independent MainSequence HTTP client exist in the plugin.
157
+
158
+ The UI uses the public MCP Apps JSON-RPC bridge. All colors, typography and radii prefer
159
+ host CSS variables, with neutral light/dark fallbacks. Data is rendered as text, including
160
+ external descriptions. The UI has no external fetches, scripts or fonts and declares empty
161
+ connection/resource CSP lists. Its resource URI includes a build hash; the server captures
162
+ immutable HTML at startup and the panel checks its identity before using results.
163
+
164
+ The developer-command hook and the conversational MCP skill keep their own behaviour.
165
+ Those explicit workflows retain their existing mutations; directory and schema inspection
166
+ stay read-only. Agent messaging uses the durable workflow above.
167
+
168
+ ## Verification
169
+
170
+ `npm run release:check` type-checks, builds, runs the Node tests, checks release metadata,
171
+ the marketplace and the documentation, packs the standalone artifact and the npm archive,
172
+ and verifies the npm archive as Codex installs it, without `node_modules` or the source
173
+ checkout. `npm run verify:codex` and `npm run verify:codex:reload` run real app-server turns
174
+ against a counted offline model fixture in an isolated Codex home. Live acceptance against
175
+ a real backend is recorded in each release's pull request and GitHub release, not here.