@meistrari/agent-core 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,27 @@
1
+ # Repo-skills profiles and native plugin discovery
2
+
3
+ `CodexProvider.create({ pluginsEnabled: false, ... })` disables the native
4
+ `features.plugins` feature on every app-server connection, including model-change
5
+ reopening and session resume. This is independent of native shell tools and the
6
+ adapter's repository skill-root registration. Omit the option to preserve the
7
+ native default for other consumers; authentication does not implicitly disable it.
8
+
9
+ The pinned Codex source (`25af12f7e61572b0bc18ddb1008be543b91519b0`) enables plugins
10
+ by default. Its plugin manager starts curated repository synchronization for
11
+ non-Codex-backend authentication. The sync code includes GitHub and a
12
+ `https://chatgpt.com/backend-api/plugins/export/curated` archive fallback:
13
+
14
+ - [Native feature default](https://github.com/openai/codex/blob/25af12f7e61572b0bc18ddb1008be543b91519b0/codex-rs/features/src/lib.rs)
15
+ - [Startup-task guard](https://github.com/openai/codex/blob/25af12f7e61572b0bc18ddb1008be543b91519b0/codex-rs/core-plugins/src/manager.rs)
16
+ - [Curated synchronization transports](https://github.com/openai/codex/blob/25af12f7e61572b0bc18ddb1008be543b91519b0/codex-rs/core-plugins/src/startup_sync.rs)
17
+
18
+ This provides a plausible non-inference explanation for concurrent GitHub and
19
+ ChatGPT TLS handshakes observed during an agent-api Mantle turn. SNI alone does
20
+ not establish their HTTP routes or process ownership; do not claim attribution
21
+ or fallback exclusion solely from this source inspection.
22
+
23
+ The agent-api repo-skills profile should opt out explicitly after consuming an
24
+ exact release with this option. Rebuild its dedicated v5 image and re-onboard
25
+ immutable provenance, then repeat native skills, continuation, model changes and
26
+ bounded hostname observation. No existing image or bound session was changed by
27
+ this source edit. Other consumers, Claude and v4 retain their behavior.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@meistrari/agent-core",
3
3
  "type": "module",
4
- "version": "0.1.8",
4
+ "version": "0.1.10",
5
5
  "packageManager": "bun@1.3.12",
6
6
  "description": "Shared contracts and runtime modules for Tela coding-agent sandboxes: agent protocol, supervisor wire protocol, resident supervisor, worker runtime client, and Claude/Codex harness adapters.",
7
7
  "license": "UNLICENSED",
@@ -323,7 +323,10 @@ function toolCallCompletion(item: CodexCompletedItem): { status: AgentToolCallSt
323
323
  return { status: item.status === 'failed' ? 'failed' : 'completed', output: imageGenerationResult(item) }
324
324
  if (item.type === 'commandExecution') {
325
325
  const status = item.exitCode === undefined || item.exitCode === null || item.exitCode === 0 ? 'completed' : 'failed'
326
- return { status, output: commandExecutionResult(item, status), error: 'error' in item && typeof item.error === 'string' ? { message: item.error } : undefined }
326
+ const error = 'error' in item && typeof item.error === 'string'
327
+ ? { message: item.error }
328
+ : status === 'failed' ? { message: `Command exited with code ${item.exitCode}.` } : undefined
329
+ return { status, output: commandExecutionResult(item, status), error }
327
330
  }
328
331
  if (item.type === 'dynamicToolCall')
329
332
  return { status: item.success === false ? 'failed' : 'completed', output: dynamicToolResult(item) }
@@ -401,7 +404,10 @@ function hookPromptText(item: CodexHookPromptItem): string | undefined {
401
404
  function commandExecutionResult(item: Extract<CodexCompletedItem, { type: 'commandExecution' }>, status: 'completed' | 'failed'): AgentToolResult | undefined {
402
405
  // Stdout is content, not a label: whitespace and an explicitly empty
403
406
  // successful output must survive normalization into the complete step.
404
- const text = item.aggregatedOutput
407
+ // Native build_command_execution_end_item encodes empty captured output as
408
+ // null, alongside a concrete exit code. That authoritative terminal receipt
409
+ // differs from an incomplete item whose output and exit code are both absent.
410
+ const text = item.aggregatedOutput ?? (Number.isInteger(item.exitCode) ? '' : undefined)
405
411
  if (typeof text !== 'string')
406
412
  return undefined
407
413
 
@@ -44,6 +44,8 @@ export interface CodexProviderConfig {
44
44
  instructions?: InstructionComposer
45
45
  /** Service-owned public model to inference model mapping. */
46
46
  resolveInferenceModel?: (model: string) => string
47
+ /** Native plugin/marketplace discovery. Does not disable repository skill roots. */
48
+ pluginsEnabled?: boolean
47
49
  }
48
50
 
49
51
  interface CodexRunHolder {
@@ -88,6 +90,7 @@ export class CodexProvider implements AgentProvider<'codex'> {
88
90
  private readonly instructions: InstructionComposer
89
91
  private readonly resolveInferenceModel: (model: string) => string
90
92
  private readonly hasInferenceModelMapping: boolean
93
+ private readonly pluginsEnabled: boolean | undefined
91
94
 
92
95
  private constructor(config: CodexProviderConfig) {
93
96
  this.auth = normalizeCodexAuthentication(config.auth)
@@ -98,6 +101,7 @@ export class CodexProvider implements AgentProvider<'codex'> {
98
101
  this.instructions = config.instructions ?? emptyInstructionComposer
99
102
  this.resolveInferenceModel = config.resolveInferenceModel ?? (model => model)
100
103
  this.hasInferenceModelMapping = config.resolveInferenceModel !== undefined
104
+ this.pluginsEnabled = config.pluginsEnabled
101
105
  }
102
106
 
103
107
  static create(config: CodexProviderConfig): CodexProvider {
@@ -386,9 +390,12 @@ export class CodexProvider implements AgentProvider<'codex'> {
386
390
  client = new CodexJsonRpcClient(this.executable, {
387
391
  cwd,
388
392
  environment: this.environment,
389
- configOverrides: this.auth.kind === 'amazon-bedrock'
390
- ? ['cli_auth_credentials_store="ephemeral"', 'model_provider="amazon-bedrock"', `model_providers.amazon-bedrock.aws.region=${JSON.stringify(this.auth.region)}`, 'model_providers.amazon-bedrock.aws.wire_api="responses"']
391
- : undefined,
393
+ configOverrides: [
394
+ ...(this.auth.kind === 'amazon-bedrock'
395
+ ? ['cli_auth_credentials_store="ephemeral"', 'model_provider="amazon-bedrock"', `model_providers.amazon-bedrock.aws.region=${JSON.stringify(this.auth.region)}`, 'model_providers.amazon-bedrock.aws.wire_api="responses"']
396
+ : []),
397
+ ...(this.pluginsEnabled === undefined ? [] : [`features.plugins=${this.pluginsEnabled}`]),
398
+ ],
392
399
  onMessage: (message) => {
393
400
  messageQueue = this.enqueueMessageHandling(messageQueue, { message, holder, state, client, signal: abortController.signal })
394
401
  },
@@ -1,6 +1,6 @@
1
1
  // Generated by scripts/write-provenance.ts. Do not edit by hand.
2
2
  export const generatedProvenance = {
3
- version: "0.1.8",
4
- sha: "ff5b7ece6b3b115d420a21046bd47b465813132b",
5
- buildTime: "2026-09-10T20:15:33.140Z",
3
+ version: "0.1.10",
4
+ sha: "af84feab98a91cd1cd31661c9fa3c0a72521ccf6",
5
+ buildTime: "2026-09-14T15:18:33.258Z",
6
6
  } as const