@pome-sh/cli 0.26.0 → 0.26.2

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.
package/README.md CHANGED
@@ -131,7 +131,7 @@ there, rewriting that heading and the manifest in one commit, and
131
131
  `.github/workflows/release.yml` compares the local version against npm and
132
132
  publishes when they differ. `pome --version` reports the allocated value from a
133
133
  build-time constant, so a user can always tell whether their install carries a
134
- given fix. See [`RELEASING.md`](../RELEASING.md).
134
+ given fix.
135
135
 
136
136
  ## License
137
137
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "pome-sh",
3
- "version": "0.26.0",
4
- "git_sha": "7114944d7733b92bba51e8f1cef0e0f262d7af09",
5
- "build_time": "2026-08-21T09:42:44.027Z"
3
+ "version": "0.26.2",
4
+ "git_sha": "bb4a96bd8c5d6f644624e5379c7843b0ec02d7a0",
5
+ "build_time": "2026-08-21T22:24:23.233Z"
6
6
  }
@@ -183,7 +183,7 @@ async function checkTwinReachable(_configDir) {
183
183
  });
184
184
  let harness;
185
185
  try {
186
- const { bootTwin } = await import('./twinHarness-H6SY773Z.js');
186
+ const { bootTwin } = await import('./twinHarness-DYAP5HKG.js');
187
187
  harness = await bootTwin({
188
188
  twin: "github",
189
189
  seedState: void 0,
@@ -1,7 +1,7 @@
1
1
  import { getAvailablePort } from './chunk-XDU6TD4O.js';
2
2
  import { buildEgressAllowlist, readBlockedEgress } from './chunk-CBFKZZBR.js';
3
- import { parseTaskFile, seedStateForTwin, runAgentCommand, writeRunArtifactsCore } from './chunk-YUQWG57T.js';
4
- import { createRecorder, bootTwin } from './chunk-TJPGONWC.js';
3
+ import { parseTaskFile, seedStateForTwin, runAgentCommand, writeRunArtifactsCore } from './chunk-T5CSXPYC.js';
4
+ import { createRecorder, bootTwin } from './chunk-UXVJK7PY.js';
5
5
  import { eventSchema } from './chunk-VBATFCWR.js';
6
6
  import { redactSecrets, redactEvent } from './chunk-SG6ZTIMT.js';
7
7
  import { serve } from '@hono/node-server';
@@ -39,7 +39,7 @@ var TWIN_REGISTRY = {
39
39
  defaultSeedState,
40
40
  GitHubDomain,
41
41
  openGitHubCloneDatabase
42
- } = await import('./src-5OWSOCET.js');
42
+ } = await import('./src-MXILWGJE.js');
43
43
  const db = openGitHubCloneDatabase();
44
44
  const domain = new GitHubDomain(db);
45
45
  domain.seed(seedState === void 0 ? defaultSeedState() : seedState);
@@ -59,9 +59,9 @@ var TWIN_REGISTRY = {
59
59
  envName: "SLACK",
60
60
  defaultPort: 3333,
61
61
  version: package_default2.version,
62
- defaultSeed: async () => (await import('./src-FZPIGBIO.js')).defaultSeedState(),
62
+ defaultSeed: async () => (await import('./src-57JSCWLJ.js')).defaultSeedState(),
63
63
  async boot({ seedState, runId, recorder }) {
64
- const { createSlackTwinApp, openSlackTwinDatabase, SlackDomain } = await import('./src-FZPIGBIO.js');
64
+ const { createSlackTwinApp, openSlackTwinDatabase, SlackDomain } = await import('./src-57JSCWLJ.js');
65
65
  const db = openSlackTwinDatabase(":memory:");
66
66
  const domain = new SlackDomain(db);
67
67
  domain.applySeed(seedState);
@@ -84,10 +84,10 @@ var TWIN_REGISTRY = {
84
84
  envName: "STRIPE",
85
85
  defaultPort: 3333,
86
86
  version: package_default3.version,
87
- defaultSeed: async () => (await import('./src-J3LKERPK.js')).defaultSeed(),
87
+ defaultSeed: async () => (await import('./src-RPI7XNUX.js')).defaultSeed(),
88
88
  async boot({ seedState, runId, recorder, twinBaseUrl }) {
89
- const stripeTwin = await import('./src-J3LKERPK.js');
90
- const { createApp } = await import('./server-AJUCP5KS.js');
89
+ const stripeTwin = await import('./src-RPI7XNUX.js');
90
+ const { createApp } = await import('./server-MDLVVVEM.js');
91
91
  const {
92
92
  applySeed: applyStripeSeed,
93
93
  createTwinStripeApp,
@@ -128,9 +128,9 @@ var TWIN_REGISTRY = {
128
128
  portEnvName: "GMAIL_TWIN_PORT",
129
129
  tokenEnvName: "POME_GMAIL_TOKEN",
130
130
  version: package_default4.version,
131
- defaultSeed: async () => (await import('./src-NKGQXT7H.js')).defaultSeedState(),
131
+ defaultSeed: async () => (await import('./src-7D2PU4R4.js')).defaultSeedState(),
132
132
  async boot({ seedState, runId, recorder }) {
133
- const { createGmailTwinApp, GmailDomain, openGmailTwinDatabase, parseSeed } = await import('./src-NKGQXT7H.js');
133
+ const { createGmailTwinApp, GmailDomain, openGmailTwinDatabase, parseSeed } = await import('./src-7D2PU4R4.js');
134
134
  const db = openGmailTwinDatabase(":memory:");
135
135
  const seed = parseSeed(seedState);
136
136
  const domain = new GmailDomain(db);
@@ -149,7 +149,7 @@ var TWIN_REGISTRY = {
149
149
  portEnvName: "LINEAR_TWIN_PORT",
150
150
  tokenEnvName: "POME_LINEAR_TOKEN",
151
151
  version: package_default5.version,
152
- defaultSeed: async () => (await import('./src-LE3GXOQL.js')).defaultSeedState(),
152
+ defaultSeed: async () => (await import('./src-EIBJVLC4.js')).defaultSeedState(),
153
153
  async boot({ seedState, runId, recorder }) {
154
154
  const {
155
155
  createLinearTwinApp,
@@ -157,7 +157,7 @@ var TWIN_REGISTRY = {
157
157
  LinearDomain,
158
158
  openLinearTwinDatabase,
159
159
  parseSeed
160
- } = await import('./src-LE3GXOQL.js');
160
+ } = await import('./src-EIBJVLC4.js');
161
161
  const db = openLinearTwinDatabase(":memory:");
162
162
  const seed = parseSeed(seedState);
163
163
  const domain = new LinearDomain(db);
@@ -173,7 +173,7 @@ var TWIN_REGISTRY = {
173
173
  }
174
174
  };
175
175
  async function createGitHubSmokeApp() {
176
- const { createGitHubCloneApp } = await import('./src-5OWSOCET.js');
176
+ const { createGitHubCloneApp } = await import('./src-MXILWGJE.js');
177
177
  return createGitHubCloneApp();
178
178
  }
179
179
  function defaultPortFor(twin, env = process.env) {
@@ -2,8 +2,8 @@ import { criterionSchema, finalizeResponseSchema, HostedDiscardRefusedError, Hos
2
2
  import { seedSchema, parseSeed, defaultSeedState as defaultSeedState$2 } from './chunk-B22TYIEM.js';
3
3
  import { gmailSeedSchema, defaultSeedState } from './chunk-NJ246QPJ.js';
4
4
  import { linearSeedSchema, defaultSeedState as defaultSeedState$1 } from './chunk-IZIZC7ZW.js';
5
- import { isTwinName, TWIN_REGISTRY } from './chunk-XXSZLN7I.js';
6
- import { toTwinHttpEventRow } from './chunk-5EGHN6H4.js';
5
+ import { isTwinName, TWIN_REGISTRY } from './chunk-K3GCCNF2.js';
6
+ import { toTwinHttpEventRow } from './chunk-WEKJIGUD.js';
7
7
  import { redactEvent, redactSecrets } from './chunk-SG6ZTIMT.js';
8
8
  import { mkdir, appendFile, writeFile, readFile } from 'node:fs/promises';
9
9
  import { existsSync } from 'node:fs';
@@ -1,5 +1,5 @@
1
- import { TWIN_NAMES, isTwinName, TWIN_REGISTRY } from './chunk-XXSZLN7I.js';
2
- import { createFileBackedRecorderStore, createRecorderStore } from './chunk-5EGHN6H4.js';
1
+ import { TWIN_NAMES, isTwinName, TWIN_REGISTRY } from './chunk-K3GCCNF2.js';
2
+ import { createFileBackedRecorderStore, createRecorderStore } from './chunk-WEKJIGUD.js';
3
3
 
4
4
  // src/recorder/recorder.ts
5
5
  function createRecorder(options = {}) {
@@ -325,6 +325,33 @@ function deriveMcpToolTable(fixture, implementations, options = {}) {
325
325
  function issues(error) {
326
326
  return error.issues.map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`).join("; ");
327
327
  }
328
+ function describeSchemaType(spec) {
329
+ if (!spec || typeof spec !== "object")
330
+ return void 0;
331
+ const schema = spec;
332
+ const name = (raw) => typeof raw !== "string" ? void 0 : raw === "integer" ? "number" : raw;
333
+ const type = name(schema.type);
334
+ if (!type)
335
+ return void 0;
336
+ if (type !== "array")
337
+ return type;
338
+ const items = schema.items && typeof schema.items === "object" ? schema.items : void 0;
339
+ const element = name(items?.type);
340
+ return element ? `array<${element}>` : "array";
341
+ }
342
+ function typeDisagreements(toolName, vendor, upstreamProperties, projectedProperties) {
343
+ const problems = [];
344
+ for (const key of Object.keys(projectedProperties)) {
345
+ if (!(key in upstreamProperties))
346
+ continue;
347
+ const theirs = describeSchemaType(upstreamProperties[key]);
348
+ const ours = describeSchemaType(projectedProperties[key]);
349
+ if (theirs && ours && theirs !== ours) {
350
+ problems.push(`'${toolName}' validates '${key}' as ${ours}, and ${vendor} declares it as ${theirs}`);
351
+ }
352
+ }
353
+ return problems;
354
+ }
328
355
 
329
356
  // ../packages/sdk/dist/index.js
330
357
  var fidelityTierSchema = z.enum(["semantic", "shape", "unsupported"]);
@@ -1744,4 +1771,4 @@ function unregisterServeShutdown(close) {
1744
1771
  serveShutdownHooks.delete(close);
1745
1772
  }
1746
1773
 
1747
- export { FAILURE_INJECTION_OVERRIDE_KEY, POME_RECORDER_EVENTS_PATH, PROVIDER_SHAPED_TEAM_ID, TwinBootError, TwinError, UnknownToolError, bearerAuth, createAdminGate, createApp, createFailureInjectionStore, createFileBackedRecorderStore, createRecorderHandle, createRecorderStore, created, defineTwin, deriveMcpToolTable, ensureTwinAuthSecret, failureInjectionMiddleware, failureInjectionRuleSchema, formTokenResolver, isLoopbackHost, loadMcpToolFixture, mintProviderToken, ok, openTwinDatabase, queryTokenResolver, recordedRequestHeaders, requireAdminAuth, resolveAuthSecret, resolveRecorderStore, serve, setClientIp, setRecordedTool, toTwinHttpEventRow, twinBuildInfo, verifyProviderToken };
1774
+ export { FAILURE_INJECTION_OVERRIDE_KEY, POME_RECORDER_EVENTS_PATH, PROVIDER_SHAPED_TEAM_ID, TwinBootError, TwinError, UnknownToolError, bearerAuth, createAdminGate, createApp, createFailureInjectionStore, createFileBackedRecorderStore, createRecorderHandle, createRecorderStore, created, defineTwin, deriveMcpToolTable, ensureTwinAuthSecret, failureInjectionMiddleware, failureInjectionRuleSchema, formTokenResolver, isLoopbackHost, loadMcpToolFixture, mintProviderToken, ok, openTwinDatabase, queryTokenResolver, recordedRequestHeaders, requireAdminAuth, resolveAuthSecret, resolveRecorderStore, serve, setClientIp, setRecordedTool, toTwinHttpEventRow, twinBuildInfo, typeDisagreements, verifyProviderToken };
@@ -1,5 +1,5 @@
1
1
  import { readManifest, normalizeManifestTwins } from './chunk-LA6BHJ5H.js';
2
- import { createHostedClient, perTwinReturnedByCloud, parseTaskFile, runAgentCommand, writeRunArtifactsCore, toTwinHttpEvent, redactJsonl, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, evaluationCounts } from './chunk-YUQWG57T.js';
2
+ import { createHostedClient, perTwinReturnedByCloud, parseTaskFile, runAgentCommand, writeRunArtifactsCore, toTwinHttpEvent, redactJsonl, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, evaluationCounts } from './chunk-T5CSXPYC.js';
3
3
  import { MOUNTED_TWINS, HostedAuthError, HostedDiscardRefusedError, HostedQuotaError, HostedOrchError, HostedTrialError, agentResponseSchema } from './chunk-QYCUNR2V.js';
4
4
  import { redactSecrets, redactEvent } from './chunk-SG6ZTIMT.js';
5
5
  import { randomUUID, createHash } from 'node:crypto';
@@ -1,17 +1,17 @@
1
1
  import { newGroupId, reassuranceBox, twinReadyLine, trialsHeaderLine, trialLine, summaryLines, evaluatingLine, criterionPhrase } from './chunk-RGZBC7NF.js';
2
2
  import { DemoCapacityError, capacityLabel, parseCapacityMarker, capacityKindFrom } from './chunk-ZX4WNSZ5.js';
3
- import { runTask, demoTaskPath, DEMO_TASK_NAME, DEMO_REPO } from './chunk-UWMDE7LX.js';
3
+ import { runTask, demoTaskPath, DEMO_TASK_NAME, DEMO_REPO } from './chunk-JGYNRD5T.js';
4
4
  import { getAvailablePort } from './chunk-XDU6TD4O.js';
5
5
  import './chunk-CBFKZZBR.js';
6
- import { createHostedClient, parseTaskFile, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, outcomeOf } from './chunk-YUQWG57T.js';
6
+ import { createHostedClient, parseTaskFile, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, outcomeOf } from './chunk-T5CSXPYC.js';
7
7
  import './chunk-NW7HGA2K.js';
8
8
  import { HostedQuotaError, HostedOrchError } from './chunk-QYCUNR2V.js';
9
9
  import './chunk-B22TYIEM.js';
10
10
  import './chunk-NJ246QPJ.js';
11
11
  import './chunk-IZIZC7ZW.js';
12
- import { bootTwin } from './chunk-TJPGONWC.js';
13
- import './chunk-XXSZLN7I.js';
14
- import './chunk-5EGHN6H4.js';
12
+ import { bootTwin } from './chunk-UXVJK7PY.js';
13
+ import './chunk-K3GCCNF2.js';
14
+ import './chunk-WEKJIGUD.js';
15
15
  import './chunk-VBATFCWR.js';
16
16
  import './chunk-SG6ZTIMT.js';
17
17
  import { readFile } from 'node:fs/promises';
@@ -1,14 +1,14 @@
1
1
  import { newGroupId, criterionPhrase } from './chunk-RGZBC7NF.js';
2
- import { runTaskHosted, resolveRunAgentIdentity } from './chunk-IZ2GFNAJ.js';
2
+ import { runTaskHosted, resolveRunAgentIdentity } from './chunk-XKHPVCY2.js';
3
3
  import './chunk-LA6BHJ5H.js';
4
- import { createHostedClient, parseTaskFile, outcomeOf } from './chunk-YUQWG57T.js';
4
+ import { createHostedClient, parseTaskFile, outcomeOf } from './chunk-T5CSXPYC.js';
5
5
  import './chunk-NW7HGA2K.js';
6
6
  import { HostedQuotaError, HostedTrialError } from './chunk-QYCUNR2V.js';
7
7
  import './chunk-B22TYIEM.js';
8
8
  import './chunk-NJ246QPJ.js';
9
9
  import './chunk-IZIZC7ZW.js';
10
- import './chunk-XXSZLN7I.js';
11
- import './chunk-5EGHN6H4.js';
10
+ import './chunk-K3GCCNF2.js';
11
+ import './chunk-WEKJIGUD.js';
12
12
  import './chunk-VBATFCWR.js';
13
13
  import './chunk-SG6ZTIMT.js';
14
14
  import { randomUUID } from 'node:crypto';
@@ -1,3 +1,3 @@
1
- export { FAILURE_INJECTION_OVERRIDE_KEY, POME_RECORDER_EVENTS_PATH, PROVIDER_SHAPED_TEAM_ID, TwinBootError, TwinError, UnknownToolError, bearerAuth, createAdminGate, createApp, createFailureInjectionStore, createFileBackedRecorderStore, createRecorderHandle, createRecorderStore, created, ensureTwinAuthSecret, failureInjectionMiddleware, failureInjectionRuleSchema, formTokenResolver, isLoopbackHost, mintProviderToken, ok, queryTokenResolver, recordedRequestHeaders, requireAdminAuth, resolveAuthSecret, resolveRecorderStore, serve, setClientIp, setRecordedTool, toTwinHttpEventRow, twinBuildInfo, verifyProviderToken } from './chunk-5EGHN6H4.js';
1
+ export { FAILURE_INJECTION_OVERRIDE_KEY, POME_RECORDER_EVENTS_PATH, PROVIDER_SHAPED_TEAM_ID, TwinBootError, TwinError, UnknownToolError, bearerAuth, createAdminGate, createApp, createFailureInjectionStore, createFileBackedRecorderStore, createRecorderHandle, createRecorderStore, created, ensureTwinAuthSecret, failureInjectionMiddleware, failureInjectionRuleSchema, formTokenResolver, isLoopbackHost, mintProviderToken, ok, queryTokenResolver, recordedRequestHeaders, requireAdminAuth, resolveAuthSecret, resolveRecorderStore, serve, setClientIp, setRecordedTool, toTwinHttpEventRow, twinBuildInfo, verifyProviderToken } from './chunk-WEKJIGUD.js';
2
2
  import './chunk-VBATFCWR.js';
3
3
  export { redactEvent, redactSecrets } from './chunk-SG6ZTIMT.js';
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { DEFAULT_CONTROL_PLANE_URL, DEFAULT_DASHBOARD_URL, clearLocalCredentials, friendlyHostedError, runSessionCreate, runSessionList, runSessionStop, resolveCredentials, runTaskHosted, discoverRunSet, VERDICT_ARTIFACT_VERSION, persistCredentialsAfterLogin, DEFAULT_DOCS_SITE_ORIGIN, resolveSeams, resolveCachedAgentId, readLinkCache, postAgentResolver, writeLinkCache, ensurePomeGitignored } from '../../chunk-IZ2GFNAJ.js';
2
+ import { DEFAULT_CONTROL_PLANE_URL, DEFAULT_DASHBOARD_URL, clearLocalCredentials, friendlyHostedError, runSessionCreate, runSessionList, runSessionStop, resolveCredentials, runTaskHosted, discoverRunSet, VERDICT_ARTIFACT_VERSION, persistCredentialsAfterLogin, DEFAULT_DOCS_SITE_ORIGIN, resolveSeams, resolveCachedAgentId, readLinkCache, postAgentResolver, writeLinkCache, ensurePomeGitignored } from '../../chunk-XKHPVCY2.js';
3
3
  import { readManifest, writeManifest, MANIFEST_JSON, readRequiredManifest, normalizeManifestTwins } from '../../chunk-LA6BHJ5H.js';
4
- import { assetPath, runTask, resolvePackageRoot, DEMO_TASK_NAME, demoTaskPath } from '../../chunk-UWMDE7LX.js';
4
+ import { assetPath, runTask, resolvePackageRoot, DEMO_TASK_NAME, demoTaskPath } from '../../chunk-JGYNRD5T.js';
5
5
  import '../../chunk-XDU6TD4O.js';
6
6
  import '../../chunk-CBFKZZBR.js';
7
- import { parseTaskFile, scoreStatus, runScoreLine, readLatestRun, readMetaSummary, outcomeOf, readConfigTwins, scoreCountsSummary, markerFor, criterionMarkerLabel, twinSkipSuffix, readCodeCriteria, createHostedClient, toTwinHttpEvent, redactJsonl, scoreFromFinalizeResponse, parseGitHubSeedState, uploadRunBlobs, isPreSatisfied } from '../../chunk-YUQWG57T.js';
7
+ import { parseTaskFile, scoreStatus, runScoreLine, readLatestRun, readMetaSummary, outcomeOf, readConfigTwins, scoreCountsSummary, markerFor, criterionMarkerLabel, twinSkipSuffix, readCodeCriteria, createHostedClient, toTwinHttpEvent, redactJsonl, scoreFromFinalizeResponse, parseGitHubSeedState, uploadRunBlobs, isPreSatisfied } from '../../chunk-T5CSXPYC.js';
8
8
  import '../../chunk-NW7HGA2K.js';
9
9
  import { MOUNTED_TWINS, deriveAgentSlug, exitCodeFor, HostedUsageError, HostedOrchError, HostedAuthError, HostedQuotaError } from '../../chunk-QYCUNR2V.js';
10
10
  import { TAPE_ASSERTABLE_TOOLS } from '../../chunk-C4BVTUA3.js';
@@ -15,9 +15,9 @@ import '../../chunk-NJ246QPJ.js';
15
15
  import { LINEAR_CHECKS } from '../../chunk-XBT6ZLBG.js';
16
16
  import '../../chunk-IZIZC7ZW.js';
17
17
  import { oneOf, defineCheck, repoRef, VACUITY_SENTINEL_NUMBER, childStatePath, VACUITY_SENTINEL, statePath, templateSlots, renderCheck, checksDigest, checkPattern, checkNearMissPattern } from '../../chunk-JWJYNAWI.js';
18
- import '../../chunk-TJPGONWC.js';
19
- import { TWIN_NAME_LIST, isTwinName, createGitHubSmokeApp } from '../../chunk-XXSZLN7I.js';
20
- import '../../chunk-5EGHN6H4.js';
18
+ import '../../chunk-UXVJK7PY.js';
19
+ import { TWIN_NAME_LIST, isTwinName, createGitHubSmokeApp } from '../../chunk-K3GCCNF2.js';
20
+ import '../../chunk-WEKJIGUD.js';
21
21
  import { isLegacyEventRow, eventSchema } from '../../chunk-VBATFCWR.js';
22
22
  import { redactEvent, redactSecrets } from '../../chunk-SG6ZTIMT.js';
23
23
  import { Command } from 'commander';
@@ -850,7 +850,7 @@ async function throwForStatus(res) {
850
850
 
851
851
  // src/task/seed-verifier.ts
852
852
  async function verifySeedWithTwin(seed) {
853
- const { GitHubDomain, openGitHubCloneDatabase } = await import('../../src-5OWSOCET.js');
853
+ const { GitHubDomain, openGitHubCloneDatabase } = await import('../../src-MXILWGJE.js');
854
854
  const db = openGitHubCloneDatabase(":memory:");
855
855
  try {
856
856
  new GitHubDomain(db).seed(seed);
@@ -4651,7 +4651,7 @@ var DEFAULT_AGENT_COMMAND = `node ${DEFAULT_AGENT_FILE}`;
4651
4651
  var MANIFEST_SCHEMA_URL = "https://pome.sh/schemas/v1/pome.json";
4652
4652
  var MAX_UNREADABLE_PATHS_SHOWN = 5;
4653
4653
  function readPackageVersion() {
4654
- if ("0.26.0".length > 0) return "0.26.0";
4654
+ if ("0.26.2".length > 0) return "0.26.2";
4655
4655
  try {
4656
4656
  const here = dirname(fileURLToPath(import.meta.url));
4657
4657
  const candidates = [
@@ -5096,7 +5096,7 @@ function createProgram() {
5096
5096
  return;
5097
5097
  }
5098
5098
  {
5099
- const { runDoctorChecks } = await import('../../checks-NCNSHMND.js');
5099
+ const { runDoctorChecks } = await import('../../checks-Z5MTHXAR.js');
5100
5100
  const { renderDoctorReport } = await import('../../render-ZQQ4UMNO.js');
5101
5101
  const doctorReport = await runDoctorChecks({ mode: useLocal ? "full" : "hosted" });
5102
5102
  if (!doctorReport.ok) {
@@ -5134,7 +5134,7 @@ function createProgram() {
5134
5134
  taskForRuns.config.runs
5135
5135
  );
5136
5136
  if (k > 1) {
5137
- const { runTrialGroup } = await import('../../runTrialGroup-FOO6F3A7.js');
5137
+ const { runTrialGroup } = await import('../../runTrialGroup-M3UUDGPI.js');
5138
5138
  const fileForRerun = relative(process.cwd(), file);
5139
5139
  const rerunCommand = defaultTask ? options.trials !== void 0 ? `pome run -n ${k}` : "pome run" : `pome run ${fileForRerun && !fileForRerun.startsWith("..") ? fileForRerun : file} -n ${k}`;
5140
5140
  const groupResult = await runTrialGroup({
@@ -5228,7 +5228,7 @@ function createProgram() {
5228
5228
  process.exitCode = 5;
5229
5229
  return;
5230
5230
  }
5231
- const { runDemo } = await import('../../runDemo-UST3X3OB.js');
5231
+ const { runDemo } = await import('../../runDemo-VGD564FP.js');
5232
5232
  const result = await runDemo({
5233
5233
  apiBase: opts.apiUrl.replace(/\/$/, ""),
5234
5234
  dashboardBase: process.env.POME_DASHBOARD_URL ?? DEFAULT_DASHBOARD_URL,
@@ -5246,7 +5246,7 @@ function createProgram() {
5246
5246
  program.command("doctor").description(
5247
5247
  "Check the agent\u2194twin wiring: pome.json (or pome.yaml) present + valid, the local twin boots + serves, requests routed to the twin (not a hardcoded production host), egress floor active. On failure prints one named cause (file:line where knowable) + one concrete fix and exits non-zero."
5248
5248
  ).action(async () => {
5249
- const { runDoctorChecks } = await import('../../checks-NCNSHMND.js');
5249
+ const { runDoctorChecks } = await import('../../checks-Z5MTHXAR.js');
5250
5250
  const { renderDoctorReport } = await import('../../render-ZQQ4UMNO.js');
5251
5251
  const report = await runDoctorChecks();
5252
5252
  for (const line of renderDoctorReport(report, { passNote: true })) console.error(line);
@@ -5422,7 +5422,7 @@ function createProgram() {
5422
5422
  ).description(
5423
5423
  "Start a standalone twin as a long-lived foreground server (Ctrl-C to stop)"
5424
5424
  ).action(async (name, options) => {
5425
- const { runTwinStartCommand } = await import('../../twinStart-IGPEXS7E.js');
5425
+ const { runTwinStartCommand } = await import('../../twinStart-BYWIDQLI.js');
5426
5426
  await runTwinStartCommand(name, options);
5427
5427
  });
5428
5428
  twin.command("reset").argument("[name]", "Twin name (default: github)", "github").description("Reset standalone twin state").action(async (name) => {
@@ -1,7 +1,7 @@
1
1
  export { SLACK_CHECKS } from './chunk-IDNSKKEC.js';
2
2
  import './chunk-JWJYNAWI.js';
3
3
  import { routeInputDeclarer, booleanInput, integerInput, mountDeclaredRoute, UndeclaredInputError } from './chunk-2Q3P45LK.js';
4
- import { loadMcpToolFixture, defineTwin, queryTokenResolver, formTokenResolver, deriveMcpToolTable, UnknownToolError, openTwinDatabase, createApp } from './chunk-5EGHN6H4.js';
4
+ import { loadMcpToolFixture, defineTwin, queryTokenResolver, formTokenResolver, deriveMcpToolTable, UnknownToolError, openTwinDatabase, createApp, typeDisagreements } from './chunk-WEKJIGUD.js';
5
5
  import './chunk-VBATFCWR.js';
6
6
  import './chunk-SG6ZTIMT.js';
7
7
  import { z, ZodError } from 'zod';
@@ -3324,6 +3324,7 @@ function toolSchemaConformance() {
3324
3324
  problems.push(`'${tool.name}' does not model Slack's parameter '${key}'`);
3325
3325
  }
3326
3326
  }
3327
+ problems.push(...typeDisagreements(tool.name, "Slack", upstream.properties ?? {}, projected.properties ?? {}));
3327
3328
  const upstreamRequired = [...upstream.required ?? []].sort().join(",");
3328
3329
  const ourRequired = [...projected.required ?? []].sort().join(",");
3329
3330
  if (upstreamRequired !== ourRequired) {
@@ -3,7 +3,7 @@ import { gmailErrorEnvelope, gmailSeedSchema, parseSeed, defaultSeedState, notFo
3
3
  export { DEFAULT_GMAIL_AGENT_EMAIL, GmailError, SEARCH_MAILBOX_MESSAGE_BUDGET, agentPathInboxMailbox, defaultSeedState, gmailErrorEnvelope, gmailSeedSchema, loadSeedFromEnv, parseSearchQuery, parseSeed, validateSearchQuery } from './chunk-NJ246QPJ.js';
4
4
  import './chunk-JWJYNAWI.js';
5
5
  import { routeInputDeclarer, integerInput, booleanInput, repeatedInput, mountDeclaredRoute, UndeclaredInputError, MalformedBodyError } from './chunk-2Q3P45LK.js';
6
- import { loadMcpToolFixture, deriveMcpToolTable, defineTwin, openTwinDatabase, createApp } from './chunk-5EGHN6H4.js';
6
+ import { loadMcpToolFixture, deriveMcpToolTable, defineTwin, openTwinDatabase, createApp } from './chunk-WEKJIGUD.js';
7
7
  import './chunk-VBATFCWR.js';
8
8
  import './chunk-SG6ZTIMT.js';
9
9
  import { createHash, createHmac, timingSafeEqual, randomBytes } from 'node:crypto';
@@ -3,7 +3,7 @@ import { MCP_PAGE_MAX, defaultSeedState, linearSeedSchema, notFound, badUserInpu
3
3
  export { DEFAULT_LINEAR_CLOCK, DEFAULT_LINEAR_EMAIL, DEFAULT_LINEAR_PORT, DEFAULT_LINEAR_SID, DEFAULT_LINEAR_TOKEN, LINEAR_PROVIDER_TOKEN_PREFIX, LinearTwinError, STATE_EXPORT_CAP, assertWebhookUrl, defaultSeedState, linearErrorEnvelope, linearSeedSchema, loadSeedFromEnv, parseSeed, unauthorizedEnvelope, unsupportedEnvelope, webhookUrlError } from './chunk-IZIZC7ZW.js';
4
4
  import './chunk-JWJYNAWI.js';
5
5
  import { routeInputDeclarer, mountDeclaredRoute, UndeclaredInputError } from './chunk-2Q3P45LK.js';
6
- import { loadMcpToolFixture, deriveMcpToolTable, openTwinDatabase, defineTwin, createApp } from './chunk-5EGHN6H4.js';
6
+ import { loadMcpToolFixture, deriveMcpToolTable, openTwinDatabase, defineTwin, createApp } from './chunk-WEKJIGUD.js';
7
7
  import './chunk-VBATFCWR.js';
8
8
  import './chunk-SG6ZTIMT.js';
9
9
  import { createHmac, timingSafeEqual, createHash, randomBytes } from 'node:crypto';
@@ -2,7 +2,7 @@ import './chunk-C4BVTUA3.js';
2
2
  import { defaultSeedState, parseSeed } from './chunk-B22TYIEM.js';
3
3
  export { defaultSeedState, parseSeed, seedSchema } from './chunk-B22TYIEM.js';
4
4
  import { routeInputDeclarer, integerInput, mountDeclaredRoute, UndeclaredInputError, MalformedBodyError } from './chunk-2Q3P45LK.js';
5
- import { loadMcpToolFixture, defineTwin, twinBuildInfo, deriveMcpToolTable, UnknownToolError, openTwinDatabase, createApp } from './chunk-5EGHN6H4.js';
5
+ import { loadMcpToolFixture, defineTwin, twinBuildInfo, deriveMcpToolTable, UnknownToolError, openTwinDatabase, createApp, typeDisagreements } from './chunk-WEKJIGUD.js';
6
6
  import './chunk-VBATFCWR.js';
7
7
  import './chunk-SG6ZTIMT.js';
8
8
  import { z, ZodError } from 'zod';
@@ -1453,6 +1453,10 @@ function normalizeIssueState(input) {
1453
1453
  function normalizeCommentId(input) {
1454
1454
  return { ...input, comment_id: input.comment_id ?? input.commentId };
1455
1455
  }
1456
+ function normalizeIssueLabels(input) {
1457
+ const names = input.labels;
1458
+ return { ...input, labels: names === void 0 ? void 0 : { names, match: "any" } };
1459
+ }
1456
1460
  var toolArgumentSchemas = [
1457
1461
  {
1458
1462
  name: "search_repositories",
@@ -1539,7 +1543,14 @@ var toolArgumentSchemas = [
1539
1543
  },
1540
1544
  {
1541
1545
  name: "list_issues",
1542
- schema: z.object({ ...ownerRepo, state: z.enum(["OPEN", "CLOSED"]).optional(), labels: z.string().optional(), assignee: z.string().optional(), ...pageShape })
1546
+ // `labels` is an ARRAY here and a CSV string on the REST door, and that is
1547
+ // the vendor's own split rather than an inconsistency — see `LabelFilter` in
1548
+ // `domain/issues.ts`. The string spelling is REFUSED on purpose: GitHub's MCP
1549
+ // server answers `parameter labels could not be coerced to []string, is
1550
+ // string` (`pkg/github/params.go`'s `OptionalStringArrayParam`, confirmed
1551
+ // against the deployed server), so accepting it here would score a call the
1552
+ // vendor rejects.
1553
+ schema: z.object({ ...ownerRepo, state: z.enum(["OPEN", "CLOSED"]).optional(), labels: z.array(z.string()).optional(), assignee: z.string().optional(), ...pageShape })
1543
1554
  },
1544
1555
  {
1545
1556
  name: "add_issue_comment",
@@ -1761,7 +1772,7 @@ function dispatchTool(domain, name, parsed, onDelta, options = {}) {
1761
1772
  case "search_issues":
1762
1773
  return domain.searchIssues(parsed);
1763
1774
  case "list_issues":
1764
- return domain.listIssues(normalizeIssueState(parsed));
1775
+ return domain.listIssues(normalizeIssueLabels(normalizeIssueState(parsed)));
1765
1776
  case "add_issue_comment":
1766
1777
  return domain.addIssueComment(normalizeIssueNumber(parsed), onDelta);
1767
1778
  case "create_issue":
@@ -3519,17 +3530,24 @@ function createIssue(domain, input, onDelta) {
3519
3530
  onDelta?.({ before: null, after: issueState(issue, repo, labels, assignees) });
3520
3531
  return issueJson(issue, repo, domain.listIssueLabels(repo.id, issue.number), domain.listIssueAssignees(repo.id, issue.number), domain.issueCommentCount(repo.id, issue.number));
3521
3532
  }
3533
+ function labelFilter(labels) {
3534
+ if (labels === void 0)
3535
+ return void 0;
3536
+ const raw = typeof labels === "string" ? { names: labels.split(","), match: "all" } : labels;
3537
+ const names = raw.names.map((name) => name.trim().toLowerCase()).filter(Boolean);
3538
+ return names.length ? { names, match: raw.match } : void 0;
3539
+ }
3522
3540
  function listIssues(domain, input) {
3523
3541
  const repo = domain.requireRepo(input.owner, input.repo);
3524
3542
  let rows = domain.listIssuesRows(repo.id);
3525
3543
  const state = input.state ?? "open";
3526
3544
  if (state !== "all")
3527
3545
  rows = rows.filter((issue) => issue.state === state);
3528
- if (input.labels) {
3529
- const wanted = input.labels.split(",").map((label) => label.trim()).filter(Boolean);
3546
+ const wanted = labelFilter(input.labels);
3547
+ if (wanted) {
3530
3548
  rows = rows.filter((issue) => {
3531
- const names = domain.listIssueLabels(repo.id, issue.number).map((label) => label.name);
3532
- return wanted.every((label) => names.includes(label));
3549
+ const names = domain.listIssueLabels(repo.id, issue.number).map((label) => label.name.toLowerCase());
3550
+ return wanted.match === "all" ? wanted.names.every((label) => names.includes(label)) : wanted.names.some((label) => names.includes(label));
3533
3551
  });
3534
3552
  }
3535
3553
  if (input.assignee)
@@ -4212,11 +4230,22 @@ function addCollaboratorAction(domain, input, onDelta) {
4212
4230
  }
4213
4231
 
4214
4232
  // ../packages/twin-github/dist/src/domain/search.js
4215
- var QUALIFIER = /(^|\s)(repo|user|org|state):(\S+)/gi;
4233
+ var QUALIFIER = /(^|\s)(repo|user|org|state|is):(\S+)/gi;
4234
+ function tokenise(text) {
4235
+ return text.toLowerCase().split(/[^a-z0-9_]+/).filter(Boolean);
4236
+ }
4237
+ function matchesTerms(terms, ...document) {
4238
+ if (terms.length === 0)
4239
+ return true;
4240
+ const tokens = new Set(tokenise(document.join(" ")));
4241
+ return terms.every((term) => tokens.has(term));
4242
+ }
4216
4243
  function parseSearchQuery(raw, options = {}) {
4217
4244
  const owners = [];
4218
4245
  const fullNames = [];
4219
4246
  let state;
4247
+ let type;
4248
+ let unhonourable = false;
4220
4249
  const text = raw.replace(QUALIFIER, (whole, lead, key, rawValue) => {
4221
4250
  const value = rawValue.toLowerCase();
4222
4251
  switch (key.toLowerCase()) {
@@ -4234,11 +4263,28 @@ function parseSearchQuery(raw, options = {}) {
4234
4263
  return whole;
4235
4264
  state = value;
4236
4265
  return lead;
4266
+ case "is":
4267
+ if (!options.is)
4268
+ return whole;
4269
+ switch (value) {
4270
+ case "open":
4271
+ case "closed":
4272
+ state = value;
4273
+ return lead;
4274
+ case "issue":
4275
+ case "pr":
4276
+ type = value;
4277
+ return lead;
4278
+ default:
4279
+ unhonourable = true;
4280
+ return lead;
4281
+ }
4237
4282
  default:
4238
4283
  return whole;
4239
4284
  }
4240
4285
  });
4241
- return { text: text.replace(/\s+/g, " ").trim().toLowerCase(), owners, fullNames, state };
4286
+ const normalized = text.replace(/\s+/g, " ").trim().toLowerCase();
4287
+ return { text: normalized, terms: tokenise(normalized), owners, fullNames, state, type, unhonourable };
4242
4288
  }
4243
4289
  function inScope(parsed, owner, fullName) {
4244
4290
  if (parsed.owners.length === 0 && parsed.fullNames.length === 0)
@@ -4305,9 +4351,9 @@ function searchCommits(domain, input) {
4305
4351
  };
4306
4352
  }
4307
4353
  function searchIssues(domain, input) {
4308
- const parsed = parseSearchQuery(input.query ?? input.q ?? "", { state: true });
4354
+ const parsed = parseSearchQuery(input.query ?? input.q ?? "", { state: true, is: true });
4309
4355
  const rows = domain.db.prepare("SELECT issues.*, repositories.owner, repositories.name, repositories.full_name, repositories.description, repositories.private, repositories.default_branch, repositories.fork, repositories.parent_full_name, repositories.entity_counter, repositories.created_at AS repo_created_at, repositories.updated_at AS repo_updated_at FROM issues INNER JOIN repositories ON issues.repo_id = repositories.id ORDER BY issues.updated_at DESC").all();
4310
- let filtered = rows.filter((issue) => !parsed.text || issue.title.toLowerCase().includes(parsed.text) || issue.body.toLowerCase().includes(parsed.text) || issue.full_name.toLowerCase().includes(parsed.text));
4356
+ let filtered = rows.filter((issue) => matchesTerms(parsed.terms, issue.title, issue.body));
4311
4357
  filtered = filtered.filter((issue) => inScope(parsed, issue.owner, issue.full_name));
4312
4358
  if (input.owner)
4313
4359
  filtered = filtered.filter((issue) => issue.owner === input.owner);
@@ -4316,6 +4362,8 @@ function searchIssues(domain, input) {
4316
4362
  const state = parsed.state ?? (input.state === "all" ? void 0 : input.state);
4317
4363
  if (state)
4318
4364
  filtered = filtered.filter((issue) => issue.state === state);
4365
+ if (parsed.type === "pr" || parsed.unhonourable)
4366
+ filtered = [];
4319
4367
  return {
4320
4368
  total_count: filtered.length,
4321
4369
  incomplete_results: false,
@@ -5785,6 +5833,7 @@ function toolSchemaConformance() {
5785
5833
  problems.push(`'${tool.name}' does not model GitHub's parameter '${key}'`);
5786
5834
  }
5787
5835
  }
5836
+ problems.push(...typeDisagreements(tool.name, "GitHub", upstream.properties ?? {}, projected.properties ?? {}));
5788
5837
  const complete = knownKeyProbe(upstream);
5789
5838
  for (const key of upstream.required ?? []) {
5790
5839
  const { [key]: _omitted, ...missingOne } = complete;
@@ -1,5 +1,5 @@
1
1
  import { routeInputDeclarer, bracketedQuery, integerInput, booleanInput, mountDeclaredRoute, UndeclaredInputError } from './chunk-2Q3P45LK.js';
2
- import { failureInjectionRuleSchema, loadMcpToolFixture, openTwinDatabase, createFailureInjectionStore, defineTwin, twinBuildInfo, deriveMcpToolTable, failureInjectionMiddleware, createApp, FAILURE_INJECTION_OVERRIDE_KEY, recordedRequestHeaders, UnknownToolError } from './chunk-5EGHN6H4.js';
2
+ import { failureInjectionRuleSchema, loadMcpToolFixture, openTwinDatabase, createFailureInjectionStore, defineTwin, twinBuildInfo, deriveMcpToolTable, failureInjectionMiddleware, createApp, FAILURE_INJECTION_OVERRIDE_KEY, recordedRequestHeaders, UnknownToolError } from './chunk-WEKJIGUD.js';
3
3
  import './chunk-VBATFCWR.js';
4
4
  import './chunk-SG6ZTIMT.js';
5
5
  import { z, ZodError } from 'zod';
@@ -0,0 +1,5 @@
1
+ export { UnsupportedTwinError, bootTwin } from './chunk-UXVJK7PY.js';
2
+ export { STRIPE_LOCAL_ACCOUNT_ID } from './chunk-K3GCCNF2.js';
3
+ import './chunk-WEKJIGUD.js';
4
+ import './chunk-VBATFCWR.js';
5
+ import './chunk-SG6ZTIMT.js';
@@ -1,6 +1,6 @@
1
- import { bootTwin } from './chunk-TJPGONWC.js';
2
- import { isTwinName, TWIN_NAMES, defaultPortFor, TWIN_REGISTRY } from './chunk-XXSZLN7I.js';
3
- import './chunk-5EGHN6H4.js';
1
+ import { bootTwin } from './chunk-UXVJK7PY.js';
2
+ import { isTwinName, TWIN_NAMES, defaultPortFor, TWIN_REGISTRY } from './chunk-K3GCCNF2.js';
3
+ import './chunk-WEKJIGUD.js';
4
4
  import './chunk-VBATFCWR.js';
5
5
  import './chunk-SG6ZTIMT.js';
6
6
  import { randomBytes } from 'node:crypto';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pome-sh/cli",
3
- "version": "0.26.0",
3
+ "version": "0.26.2",
4
4
  "description": "Digital-twin testing for AI agents \u2014 run tasks against resettable local or hosted twins and record tool-call traces for evaluation on pome.sh.",
5
5
  "keywords": [
6
6
  "ai",
@@ -1,5 +0,0 @@
1
- export { UnsupportedTwinError, bootTwin } from './chunk-TJPGONWC.js';
2
- export { STRIPE_LOCAL_ACCOUNT_ID } from './chunk-XXSZLN7I.js';
3
- import './chunk-5EGHN6H4.js';
4
- import './chunk-VBATFCWR.js';
5
- import './chunk-SG6ZTIMT.js';