@pome-sh/cli 0.26.9 → 0.26.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.
- package/dist/build-info.json +3 -3
- package/dist/{checks-NSHCXA6N.js → checks-3LVRPHOK.js} +4 -4
- package/dist/{chunk-IDNSKKEC.js → chunk-2ZGVDTJC.js} +1 -1
- package/dist/{chunk-RG32W733.js → chunk-6IVXTU67.js} +3 -3
- package/dist/{chunk-JUESW6G4.js → chunk-6KJC4BTO.js} +5 -5
- package/dist/{chunk-X7V5DMA7.js → chunk-ANKO3RCB.js} +4 -4
- package/dist/{chunk-64NZFX4Z.js → chunk-BZO3YCJS.js} +1 -1
- package/dist/{chunk-WEKJIGUD.js → chunk-CFXEETE3.js} +4 -4
- package/dist/{chunk-O5MCNQY4.js → chunk-CXGMLUZ4.js} +1 -1
- package/dist/{chunk-CKN743FJ.js → chunk-EIUCTFQV.js} +11 -11
- package/dist/{chunk-5EV4SG3F.js → chunk-FQGR7KDT.js} +3 -3
- package/dist/{chunk-2Q3P45LK.js → chunk-IZFM7W2V.js} +1 -1
- package/dist/{chunk-5EE7YWA3.js → chunk-KIXYRPVY.js} +2 -2
- package/dist/{chunk-B22TYIEM.js → chunk-QXQAVKTE.js} +6 -6
- package/dist/{runDemo-SA55CMWG.js → runDemo-XO5R5QTM.js} +8 -8
- package/dist/{runTrialGroup-IXIVA2R3.js → runTrialGroup-CLJJOO4J.js} +8 -8
- package/dist/{server-TPAFPKLC.js → server-TK5YBK6E.js} +2 -2
- package/dist/src/cli/main.js +20 -20
- package/dist/{src-AAF7TZMO.js → src-FXRQSKBK.js} +31 -32
- package/dist/{src-2M54EY2P.js → src-GWA7QVQS.js} +9 -9
- package/dist/{src-UEO2KIBJ.js → src-JJNS46T6.js} +55 -55
- package/dist/{src-4E5WAGNJ.js → src-L6F5YXSP.js} +14 -14
- package/dist/{src-Q4MBHYC5.js → src-Q4JNJE5S.js} +14 -14
- package/dist/twinHarness-6NVAKIOB.js +5 -0
- package/dist/{twinStart-2VP545N6.js → twinStart-WIT4UVAC.js} +4 -4
- package/package.json +1 -1
- package/dist/twinHarness-OC6VQRXO.js +0 -5
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import './chunk-C4BVTUA3.js';
|
|
2
|
-
import { defaultSeedState, parseSeed } from './chunk-
|
|
3
|
-
export { defaultSeedState, parseSeed, seedSchema } from './chunk-
|
|
4
|
-
import { routeInputDeclarer, integerInput, mountDeclaredRoute, UndeclaredInputError, MalformedBodyError } from './chunk-
|
|
5
|
-
import { loadMcpToolFixture, defineTwin, twinBuildInfo, deriveMcpToolTable, UnknownToolError, openTwinDatabase, createApp, typeDisagreements } from './chunk-
|
|
6
|
-
import './chunk-
|
|
2
|
+
import { defaultSeedState, parseSeed } from './chunk-QXQAVKTE.js';
|
|
3
|
+
export { defaultSeedState, parseSeed, seedSchema } from './chunk-QXQAVKTE.js';
|
|
4
|
+
import { routeInputDeclarer, integerInput, mountDeclaredRoute, UndeclaredInputError, MalformedBodyError } from './chunk-IZFM7W2V.js';
|
|
5
|
+
import { loadMcpToolFixture, defineTwin, twinBuildInfo, deriveMcpToolTable, UnknownToolError, openTwinDatabase, createApp, typeDisagreements } from './chunk-CFXEETE3.js';
|
|
6
|
+
import './chunk-6KJC4BTO.js';
|
|
7
7
|
import './chunk-SG6ZTIMT.js';
|
|
8
8
|
import { z, ZodError } from 'zod';
|
|
9
9
|
import { createHash, randomUUID } from 'node:crypto';
|
|
@@ -26,7 +26,7 @@ var commentBody = { body: z.string().min(1) };
|
|
|
26
26
|
var GITHUB_ROUTES = {
|
|
27
27
|
// ----- search -----
|
|
28
28
|
//
|
|
29
|
-
// GH-DECL-IN-001 / GH-DECL-IN-002
|
|
29
|
+
// GH-DECL-IN-001 / GH-DECL-IN-002 — all five take `q` and nothing but
|
|
30
30
|
// `q`. GitHub's search API has ONE scoping input and encodes every filter as a
|
|
31
31
|
// qualifier inside it (`repo:octocat/hello-world`, `state:open`); its OpenAPI
|
|
32
32
|
// declares `q, sort, order, per_page, page`. `/search/code`,
|
|
@@ -76,7 +76,7 @@ var GITHUB_ROUTES = {
|
|
|
76
76
|
method: "POST",
|
|
77
77
|
path: "/user/repos",
|
|
78
78
|
bodyEncoding: "json",
|
|
79
|
-
//
|
|
79
|
+
// GH-DECL-IN — no `owner`. This surface creates a repository
|
|
80
80
|
// for the AUTHENTICATED USER, which is its whole meaning;
|
|
81
81
|
// `repos/create-for-authenticated-user` declares 23 body properties and
|
|
82
82
|
// `owner` is not one. `routes.ts` passed the body straight to
|
|
@@ -129,12 +129,12 @@ var GITHUB_ROUTES = {
|
|
|
129
129
|
content: z.string(),
|
|
130
130
|
branch: z.string().optional(),
|
|
131
131
|
sha: z.string().optional()
|
|
132
|
-
//
|
|
132
|
+
// GH-DECL-IN — no `encoding`. GitHub declares `content` as
|
|
133
133
|
// "the new file content, using Base64 encoding" and takes no `encoding`
|
|
134
134
|
// parameter: base64 is the only encoding this surface has. Undeclared
|
|
135
135
|
// now, so github's measured disposition (`ignore`) discards it.
|
|
136
136
|
//
|
|
137
|
-
//
|
|
137
|
+
// The behavioural half is closed too: `routes.ts` base64-decodes this
|
|
138
138
|
// field via `rest-content.ts`, and invalid base64 gets GitHub's own 422.
|
|
139
139
|
// ⚠️ ON THIS DOOR ONLY — the MCP write tools take plain text, because
|
|
140
140
|
// GitHub's MCP server does. Divergence 24 is retired; see FIDELITY.md
|
|
@@ -1488,10 +1488,10 @@ var toolArgumentSchemas = [
|
|
|
1488
1488
|
},
|
|
1489
1489
|
{
|
|
1490
1490
|
name: "create_or_update_file",
|
|
1491
|
-
//
|
|
1491
|
+
// No `encoding`. GitHub's MCP server declares none and needs none:
|
|
1492
1492
|
// it takes `content` as PLAIN TEXT and base64-encodes it itself before
|
|
1493
1493
|
// calling the REST API, which its own tool description says outright. The
|
|
1494
|
-
// switch survived
|
|
1494
|
+
// switch survived the declaration cut because that only removed it from the REST
|
|
1495
1495
|
// DECLARATION, and the served table (a capture) and these validators are two
|
|
1496
1496
|
// different objects. Undeclared now, so `ignore` discards it if sent.
|
|
1497
1497
|
schema: z.object({ ...ownerRepo, path: z.string().min(1), message: z.string().min(1), content: z.string(), branch: z.string().min(1), sha: z.string().optional() })
|
|
@@ -1506,7 +1506,7 @@ var toolArgumentSchemas = [
|
|
|
1506
1506
|
// file's `content` straight to a Git tree entry, which takes plain UTF-8.
|
|
1507
1507
|
schema: z.object({ ...ownerRepo, branch: z.string().optional(), message: z.string().min(1), files: z.array(z.object({ path: z.string().min(1), content: z.string() })).min(1) })
|
|
1508
1508
|
},
|
|
1509
|
-
// GitHub's consolidated issue pair
|
|
1509
|
+
// GitHub's consolidated issue pair. `issue_read` and `issue_write`
|
|
1510
1510
|
// replace the seven single-purpose tools this twin used to serve — `get_issue`,
|
|
1511
1511
|
// `update_issue`, `list_issue_comments`, `list_issue_labels`,
|
|
1512
1512
|
// `add_issue_labels`, `remove_issue_label`, `add_assignees` — none of which
|
|
@@ -1556,7 +1556,7 @@ var toolArgumentSchemas = [
|
|
|
1556
1556
|
name: "add_issue_comment",
|
|
1557
1557
|
schema: z.object({ ...ownerRepo, issue_number: z.coerce.number().int().positive().optional(), issueNumber: z.coerce.number().int().positive().optional(), body: z.string().min(1) }).refine((value) => value.issue_number ?? value.issueNumber, "issue_number is required")
|
|
1558
1558
|
},
|
|
1559
|
-
// Kept, and registered as a divergence rather than removed
|
|
1559
|
+
// Kept, and registered as a divergence rather than removed: GitHub
|
|
1560
1560
|
// serves this exact name from the `issues` toolset when the client sets
|
|
1561
1561
|
// `X-MCP-Features: issues_granular`, so an examinee can legitimately call it.
|
|
1562
1562
|
// The divergence is that this twin serves it unconditionally.
|
|
@@ -1573,7 +1573,7 @@ var toolArgumentSchemas = [
|
|
|
1573
1573
|
perPage: z.coerce.number().int().positive().optional()
|
|
1574
1574
|
})
|
|
1575
1575
|
},
|
|
1576
|
-
// GitHub's consolidated pull-request reader
|
|
1576
|
+
// GitHub's consolidated pull-request reader, replacing the seven
|
|
1577
1577
|
// `get_pull_request*` tools GitHub no longer declares.
|
|
1578
1578
|
{
|
|
1579
1579
|
name: "pull_request_read",
|
|
@@ -1628,7 +1628,7 @@ var toolArgumentSchemas = [
|
|
|
1628
1628
|
name: "create_pull_request",
|
|
1629
1629
|
schema: z.object({ ...ownerRepo, title: z.string().min(1), body: z.string().optional(), head: z.string().min(1), base: z.string().optional() })
|
|
1630
1630
|
},
|
|
1631
|
-
// ===== v2 hot paths
|
|
1631
|
+
// ===== v2 hot paths ==========================================
|
|
1632
1632
|
// Cluster A — branches & files
|
|
1633
1633
|
{
|
|
1634
1634
|
name: "list_branches",
|
|
@@ -1656,7 +1656,7 @@ var toolArgumentSchemas = [
|
|
|
1656
1656
|
// fourteen tools GitHub's MCP server does not register under any toolset or
|
|
1657
1657
|
// feature flag. They were GitHub REST operations that were never MCP tools,
|
|
1658
1658
|
// so an examinee could only ever have reached them the way it still can —
|
|
1659
|
-
// over this twin's REST door, which is unchanged (
|
|
1659
|
+
// over this twin's REST door, which is unchanged (group D).
|
|
1660
1660
|
// Cluster G — tags & releases
|
|
1661
1661
|
{
|
|
1662
1662
|
name: "list_tags",
|
|
@@ -1675,7 +1675,7 @@ var toolArgumentSchemas = [
|
|
|
1675
1675
|
name: "get_me",
|
|
1676
1676
|
schema: z.object({})
|
|
1677
1677
|
},
|
|
1678
|
-
// M5 hot gaps
|
|
1678
|
+
// M5 hot gaps
|
|
1679
1679
|
{
|
|
1680
1680
|
name: "search_commits",
|
|
1681
1681
|
schema: z.object({ query: z.string().optional(), q: z.string().optional(), owner: z.string().optional(), repo: z.string().optional(), ...pageShape }).refine((value) => value.query !== void 0 || value.q !== void 0, "query is required")
|
|
@@ -1706,7 +1706,7 @@ var MUTATING_TOOL_NAMES = /* @__PURE__ */ new Set([
|
|
|
1706
1706
|
"merge_pull_request",
|
|
1707
1707
|
"update_pull_request_branch",
|
|
1708
1708
|
"create_pull_request",
|
|
1709
|
-
// v2 hot paths
|
|
1709
|
+
// v2 hot paths
|
|
1710
1710
|
"delete_file",
|
|
1711
1711
|
"update_pull_request",
|
|
1712
1712
|
"add_reply_to_pull_request_comment"
|
|
@@ -1797,12 +1797,12 @@ function dispatchTool(domain, name, parsed, onDelta, options = {}) {
|
|
|
1797
1797
|
// GitHub distinguishes the issue-level `get_comments` from the
|
|
1798
1798
|
// diff-level `get_review_comments`, and so does this twin: a PR's
|
|
1799
1799
|
// CONVERSATION lives in `issue_comments`, keyed on the PR's own number
|
|
1800
|
-
// because GitHub models a pull request as an issue
|
|
1800
|
+
// because GitHub models a pull request as an issue, while the
|
|
1801
1801
|
// comments anchored to a file and line live in
|
|
1802
1802
|
// `pull_request_review_comments`. Both halves of the justification that
|
|
1803
1803
|
// stood here — one thread per PR, a split the twin does not model —
|
|
1804
|
-
// stopped being true
|
|
1805
|
-
// vocabularies as separate fields
|
|
1804
|
+
// stopped being true, and the seed then gained both
|
|
1805
|
+
// vocabularies as separate fields.
|
|
1806
1806
|
case "get_comments":
|
|
1807
1807
|
return domain.getPullRequestConversation(pull);
|
|
1808
1808
|
case "get_review_comments":
|
|
@@ -1836,7 +1836,7 @@ function dispatchTool(domain, name, parsed, onDelta, options = {}) {
|
|
|
1836
1836
|
return domain.updatePullRequestBranch(normalizePullNumber(parsed), onDelta);
|
|
1837
1837
|
case "create_pull_request":
|
|
1838
1838
|
return domain.createPullRequest({ ...parsed, actor: parsed.actor ?? options.actor }, onDelta);
|
|
1839
|
-
// ===== v2 hot paths
|
|
1839
|
+
// ===== v2 hot paths ========================================
|
|
1840
1840
|
case "list_branches":
|
|
1841
1841
|
return domain.listBranchesForRepo(parsed);
|
|
1842
1842
|
case "delete_file":
|
|
@@ -1855,7 +1855,7 @@ function dispatchTool(domain, name, parsed, onDelta, options = {}) {
|
|
|
1855
1855
|
return domain.getLatestRelease(parsed);
|
|
1856
1856
|
case "get_me":
|
|
1857
1857
|
return domain.getMe({ actor: options.actor });
|
|
1858
|
-
// M5 hot gaps
|
|
1858
|
+
// M5 hot gaps
|
|
1859
1859
|
case "search_commits":
|
|
1860
1860
|
return domain.searchCommits(parsed);
|
|
1861
1861
|
case "get_release_by_tag":
|
|
@@ -1911,7 +1911,7 @@ var githubAccessControlEndpointSchema = z.object({
|
|
|
1911
1911
|
category: githubAccessControlCategorySchema,
|
|
1912
1912
|
/** Default allow/deny when a session has no explicit override. */
|
|
1913
1913
|
default_allowed: z.boolean(),
|
|
1914
|
-
/**
|
|
1914
|
+
/** v2 hot-path; false for the original 25-endpoint surface. */
|
|
1915
1915
|
v2: z.boolean().default(false)
|
|
1916
1916
|
});
|
|
1917
1917
|
var githubAccessControlCategoryGroupSchema = z.object({
|
|
@@ -2222,7 +2222,7 @@ CREATE TABLE IF NOT EXISTS issue_labels (
|
|
|
2222
2222
|
);
|
|
2223
2223
|
|
|
2224
2224
|
-- issue_number names an issue OR a pull request, so no FK to issues \u2014 see
|
|
2225
|
-
-- ensureCommentsAllowPullRequests below
|
|
2225
|
+
-- ensureCommentsAllowPullRequests below.
|
|
2226
2226
|
CREATE TABLE IF NOT EXISTS issue_comments (
|
|
2227
2227
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
2228
2228
|
repo_id INTEGER NOT NULL,
|
|
@@ -2271,7 +2271,7 @@ CREATE TABLE IF NOT EXISTS pull_request_files (
|
|
|
2271
2271
|
raw_url TEXT NOT NULL DEFAULT '',
|
|
2272
2272
|
contents_url TEXT NOT NULL DEFAULT '',
|
|
2273
2273
|
patch TEXT NOT NULL DEFAULT '',
|
|
2274
|
-
--
|
|
2274
|
+
-- The pre-rename path, NULL on every status but 'renamed'. Nullable
|
|
2275
2275
|
-- rather than DEFAULT '': the serializer reads presence off the status, and
|
|
2276
2276
|
-- an empty string here would be indistinguishable from a rename whose source
|
|
2277
2277
|
-- path the diff failed to resolve. (No backticks in this literal: it is a
|
|
@@ -2458,7 +2458,7 @@ SET
|
|
|
2458
2458
|
head_sha = COALESCE(head_sha, (SELECT head_sha FROM branches WHERE branches.repo_id = pull_requests.head_repo_id AND branches.name = pull_requests.head_ref)),
|
|
2459
2459
|
base_sha = COALESCE(base_sha, (SELECT head_sha FROM branches WHERE branches.repo_id = pull_requests.base_repo_id AND branches.name = pull_requests.base_ref));
|
|
2460
2460
|
|
|
2461
|
-
--
|
|
2461
|
+
-- \`updated_at\` arrived after \`releases\` existed, so a database written
|
|
2462
2462
|
-- by an earlier build has it at the column default (''). A release this twin
|
|
2463
2463
|
-- serves has never been edited \u2014 there is no release-update route \u2014 so its
|
|
2464
2464
|
-- update instant IS its creation instant, and backfilling is exact rather than
|
|
@@ -2718,7 +2718,7 @@ function branchJson(branch, repo) {
|
|
|
2718
2718
|
// Upstream `commit.url` is a required non-null string; the twin surfaces
|
|
2719
2719
|
// null in the pre-resolution state (no commit seeded yet). Intentional
|
|
2720
2720
|
// twin behavior — narrow the null away for the type anchor only
|
|
2721
|
-
// (
|
|
2721
|
+
// (a faithful twin may surface a pre-resolution null), runtime
|
|
2722
2722
|
// value unchanged.
|
|
2723
2723
|
url: branch.head_sha ? `https://api.github.com/repos/${repo.full_name}/commits/${branch.head_sha}` : null
|
|
2724
2724
|
},
|
|
@@ -2789,13 +2789,13 @@ function contentDirectoryEntryJson(path, repo, branch, file) {
|
|
|
2789
2789
|
// entry the twin has no git blob to point at; rather than emit `git_url: null`
|
|
2790
2790
|
// (a string→null type-changed against real GitHub's blob URL on files), omit the
|
|
2791
2791
|
// key entirely on directories so the field-removed direction is covered by the
|
|
2792
|
-
// categorical hypermedia exemption
|
|
2793
|
-
// SUBSET of GitHub's link relations, not drift
|
|
2792
|
+
// categorical hypermedia exemption — a faithful twin returning a
|
|
2793
|
+
// SUBSET of GitHub's link relations, not drift.
|
|
2794
2794
|
...isFile ? { git_url: `https://api.github.com/repos/${repo.full_name}/git/blobs/${file.sha}` } : {},
|
|
2795
2795
|
html_url: `https://github.com/${repo.full_name}/${isFile ? "blob" : "tree"}/${branch}/${path}`,
|
|
2796
2796
|
download_url: isFile ? `https://raw.githubusercontent.com/${repo.full_name}/${branch}/${path}` : null
|
|
2797
2797
|
// `_links` is intentionally omitted — the categorical hypermedia subset
|
|
2798
|
-
// exemption
|
|
2798
|
+
// exemption; DeepPartial makes it optional so omission is legal.
|
|
2799
2799
|
// The upstream `content-directory` schema is an ARRAY of entries; this
|
|
2800
2800
|
// serializer emits one entry, so it anchors against the element type.
|
|
2801
2801
|
};
|
|
@@ -2869,7 +2869,7 @@ function pullRequestSimpleJson(pr, baseRepo, headRepo, headSha = null, baseSha =
|
|
|
2869
2869
|
ref: pr.head_ref,
|
|
2870
2870
|
// Upstream merge-base `sha` is a non-null string; the twin emits null when
|
|
2871
2871
|
// the head SHA is unresolved (no commits seeded yet). Intentional twin
|
|
2872
|
-
// behavior — narrow the null away for the type anchor only (
|
|
2872
|
+
// behavior — narrow the null away for the type anchor only (
|
|
2873
2873
|
// faithful twin may surface a pre-resolution null), runtime value unchanged.
|
|
2874
2874
|
sha: headSha,
|
|
2875
2875
|
repo: repoJson(headRepo),
|
|
@@ -2918,7 +2918,7 @@ function pullRequestFileJson(file) {
|
|
|
2918
2918
|
raw_url: file.raw_url,
|
|
2919
2919
|
contents_url: file.contents_url,
|
|
2920
2920
|
patch: file.patch,
|
|
2921
|
-
//
|
|
2921
|
+
// GitHub sends `previous_filename` exactly when `status` is
|
|
2922
2922
|
// `"renamed"` and omits the KEY otherwise, so this is a conditional spread
|
|
2923
2923
|
// rather than a `null`: emitting `previous_filename: null` on an added file
|
|
2924
2924
|
// would trade a missing-field divergence for a type-changed one and have
|
|
@@ -3024,7 +3024,7 @@ function releaseJson(release, repo) {
|
|
|
3024
3024
|
prerelease: Boolean(release.prerelease),
|
|
3025
3025
|
author: userJson(release.author_login),
|
|
3026
3026
|
created_at: release.created_at,
|
|
3027
|
-
//
|
|
3027
|
+
// Real GitHub returns this on every release; the twin used to omit
|
|
3028
3028
|
// the key, which read as `field-removed` on all three release surfaces.
|
|
3029
3029
|
// Falls back to `created_at` for a row written before the column existed.
|
|
3030
3030
|
updated_at: release.updated_at || release.created_at,
|
|
@@ -3036,8 +3036,8 @@ function releaseJson(release, repo) {
|
|
|
3036
3036
|
tarball_url: `https://api.github.com/repos/${repo.full_name}/tarball/${release.tag_name}`,
|
|
3037
3037
|
zipball_url: `https://api.github.com/repos/${repo.full_name}/zipball/${release.tag_name}`,
|
|
3038
3038
|
assets: [],
|
|
3039
|
-
//
|
|
3040
|
-
// that this twin did not. Same shape of fix as `updated_at` above
|
|
3039
|
+
// The last leaf real GitHub sends on all three release surfaces
|
|
3040
|
+
// that this twin did not. Same shape of fix as `updated_at` above,
|
|
3041
3041
|
// and the same reason it went unnoticed: `satisfies DeepPartial<Release>`
|
|
3042
3042
|
// encodes "faithful SUBSET", so it cannot see an omission.
|
|
3043
3043
|
//
|
|
@@ -3045,7 +3045,7 @@ function releaseJson(release, repo) {
|
|
|
3045
3045
|
// immutable-release feature and has no route that could enable one — no
|
|
3046
3046
|
// `PUT /repos/:o/:r/immutable-releases`, nothing on the seed — so every
|
|
3047
3047
|
// release in every reachable twin state IS mutable. That is what separates
|
|
3048
|
-
// this from the nine sibling fields
|
|
3048
|
+
// this from the nine sibling fields registered rather than fixed:
|
|
3049
3049
|
// stating `false` invents no model.
|
|
3050
3050
|
//
|
|
3051
3051
|
// Not a column. A stored value would be a second source of truth for a
|
|
@@ -3084,7 +3084,7 @@ function checkRunJson(run, repo) {
|
|
|
3084
3084
|
// conclusion vocabulary including `"stale"`, but the pinned
|
|
3085
3085
|
// @octokit/openapi-types version's `check-run.conclusion` enum predates
|
|
3086
3086
|
// `"stale"`. The twin faithfully emits a real upstream value; narrow it to
|
|
3087
|
-
// the schema's declared union for the type anchor only (
|
|
3087
|
+
// the schema's declared union for the type anchor only (twin
|
|
3088
3088
|
// tracks live GitHub, not a lagging spec snapshot), runtime value unchanged.
|
|
3089
3089
|
conclusion: run.conclusion,
|
|
3090
3090
|
started_at: run.started_at,
|
|
@@ -3129,12 +3129,12 @@ function pullRequestReviewCommentJson(comment, repo) {
|
|
|
3129
3129
|
// nullable (`number | null`); all the sibling line/position fields below
|
|
3130
3130
|
// are non-null in the schema. The twin's row column is `number | null`, so
|
|
3131
3131
|
// for the non-null schema fields we narrow the row's pre-resolution null
|
|
3132
|
-
// away for the type anchor only (
|
|
3132
|
+
// away for the type anchor only (a faithful twin may surface a
|
|
3133
3133
|
// pre-resolution null on a not-yet-positioned comment), runtime unchanged.
|
|
3134
3134
|
position: comment.line,
|
|
3135
3135
|
original_position: comment.line,
|
|
3136
3136
|
// `commit_sha` row column is `string | null`; schema commit ids are
|
|
3137
|
-
// non-null strings (
|
|
3137
|
+
// non-null strings (pre-resolution null narrow).
|
|
3138
3138
|
commit_id: comment.commit_sha,
|
|
3139
3139
|
original_commit_id: comment.commit_sha,
|
|
3140
3140
|
in_reply_to_id: comment.in_reply_to_id,
|
|
@@ -4087,7 +4087,7 @@ function createRelease(domain, input, options = {}, onDelta) {
|
|
|
4087
4087
|
prerelease,
|
|
4088
4088
|
options.actor ?? "pome-agent",
|
|
4089
4089
|
now,
|
|
4090
|
-
//
|
|
4090
|
+
// `updated_at` on creation IS `created_at`. There is no release
|
|
4091
4091
|
// update route on this twin, so nothing can ever move it apart; when one
|
|
4092
4092
|
// is added it must set this column, which is why it is a real column and
|
|
4093
4093
|
// not `created_at` aliased in the serializer.
|
|
@@ -4559,7 +4559,7 @@ var GitHubDomain = class {
|
|
|
4559
4559
|
});
|
|
4560
4560
|
}
|
|
4561
4561
|
/**
|
|
4562
|
-
*
|
|
4562
|
+
* Expand a branch's seeded file entries into the commit that produces
|
|
4563
4563
|
* them, turning each `renamed_from` into what a move actually is: the source
|
|
4564
4564
|
* path deleted and its content written at the new path, in ONE commit.
|
|
4565
4565
|
*
|
|
@@ -4587,14 +4587,14 @@ var GitHubDomain = class {
|
|
|
4587
4587
|
return changes;
|
|
4588
4588
|
}
|
|
4589
4589
|
/**
|
|
4590
|
-
*
|
|
4590
|
+
* Plant one conversation comment on an issue or a pull request.
|
|
4591
4591
|
*
|
|
4592
4592
|
* A direct INSERT, for the same reason the seeded reviews above bypass
|
|
4593
4593
|
* `createPullRequestReview`: `addIssueComment` stamps `user_login =
|
|
4594
4594
|
* "pome-agent"` unconditionally, and a seeded world where the agent under
|
|
4595
4595
|
* test wrote every comment it is being asked to read has nothing to read.
|
|
4596
4596
|
* The one check the write path does that matters here is kept — the comment
|
|
4597
|
-
* must hang off an issue or a pull request that exists
|
|
4597
|
+
* must hang off an issue or a pull request that exists.
|
|
4598
4598
|
*/
|
|
4599
4599
|
seedComment(repo, number, comment) {
|
|
4600
4600
|
this.requireCommentTarget(repo.id, number);
|
|
@@ -4626,7 +4626,7 @@ var GitHubDomain = class {
|
|
|
4626
4626
|
files: this.listPullRequestFileRows(repo.id, pull.number),
|
|
4627
4627
|
reviews: this.listPullRequestReviewRows(repo.id, pull.number),
|
|
4628
4628
|
review_comments: this.listPullRequestReviewCommentRows(repo.id, pull.number),
|
|
4629
|
-
//
|
|
4629
|
+
// THREE distinct comment surfaces reach a pull request and this
|
|
4630
4630
|
// is the third, so the export keeps them apart rather than merging them
|
|
4631
4631
|
// into one count a predicate could not attribute:
|
|
4632
4632
|
// `reviews[].body` — the prose attached to a review verdict
|
|
@@ -4985,7 +4985,7 @@ var GitHubDomain = class {
|
|
|
4985
4985
|
raw_url: `https://raw.githubusercontent.com/${repo.full_name}/${commit.sha}/${version.path}`,
|
|
4986
4986
|
contents_url: `https://api.github.com/repos/${repo.full_name}/contents/${version.path}?ref=${commit.sha}`,
|
|
4987
4987
|
patch: `@@ ${version.path} @@`,
|
|
4988
|
-
//
|
|
4988
|
+
// The COMPARE surface moved onto the shared `diffFileRows`; this
|
|
4989
4989
|
// one is still outside it, and for a reason that is not scope. A single
|
|
4990
4990
|
// commit's change set is read straight out of `file_versions`, whose
|
|
4991
4991
|
// `status` column has no `renamed` member, so there is no pair of trees
|
|
@@ -5114,7 +5114,7 @@ var GitHubDomain = class {
|
|
|
5114
5114
|
this.db.prepare("INSERT INTO pull_request_files (repo_id, pull_number, filename, status, additions, deletions, changes, blob_url, raw_url, contents_url, patch, previous_filename) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)").run(repoId, pullNumber, file.filename, file.status, file.additions, file.deletions, file.changes, file.blob_url, file.raw_url, file.contents_url, file.patch, file.previous_filename);
|
|
5115
5115
|
}
|
|
5116
5116
|
}
|
|
5117
|
-
//
|
|
5117
|
+
// The `stack` member of GitHub's `pull-request` / `pull-request-simple`
|
|
5118
5118
|
// schemas. GitHub models a stack as its own entity with its own id and number;
|
|
5119
5119
|
// the twin has no stack table, so it reads a stack off the state that DOES
|
|
5120
5120
|
// encode one — pull requests linked `base_ref` -> `head_ref`, i.e. a PR whose
|
|
@@ -5272,7 +5272,7 @@ var GitHubDomain = class {
|
|
|
5272
5272
|
requireIssue(repoId, number) {
|
|
5273
5273
|
return this.db.prepare("SELECT * FROM issues WHERE repo_id = ? AND number = ?").get(repoId, number) ?? notFound("Issue not found");
|
|
5274
5274
|
}
|
|
5275
|
-
//
|
|
5275
|
+
// What the ISSUE COMMENT endpoints may address.
|
|
5276
5276
|
//
|
|
5277
5277
|
// Real GitHub models every pull request as an issue and documents
|
|
5278
5278
|
// `/repos/:o/:r/issues/:number/comments` as the way to comment on a PR's
|
|
@@ -5332,7 +5332,7 @@ var GitHubDomain = class {
|
|
|
5332
5332
|
listPullRequestReviewRows(repoId, pullNumber) {
|
|
5333
5333
|
return this.db.prepare("SELECT * FROM pull_request_reviews WHERE repo_id = ? AND pull_number = ? ORDER BY submitted_at ASC").all(repoId, pullNumber);
|
|
5334
5334
|
}
|
|
5335
|
-
//
|
|
5335
|
+
// `PullRequestReviewCommentRow`, not a six-key structural subset of
|
|
5336
5336
|
// it. The query is `SELECT *` and always was, so the narrow cast described
|
|
5337
5337
|
// less than the reader was handed and every caller inherited that description
|
|
5338
5338
|
// as its ceiling: `getPullRequestComments` served exactly the six keys named
|
|
@@ -5730,13 +5730,13 @@ var githubTwinDefinition = defineTwin({
|
|
|
5730
5730
|
domain.seed(seed, reportDelta);
|
|
5731
5731
|
return { ok: true, repositories: seed.repositories.length };
|
|
5732
5732
|
},
|
|
5733
|
-
//
|
|
5733
|
+
// The admin-gate 403 body is BUILT HERE now, not defaulted in
|
|
5734
5734
|
// `@pome-sh/sdk`. The gate is shared by all five twins, so its default
|
|
5735
5735
|
// cannot carry GitHub's `documentation_url`/`status` leaves — and while
|
|
5736
5736
|
// it defaulted, this twin's 403 said `documentation_url: ""`.
|
|
5737
5737
|
//
|
|
5738
5738
|
// The url is the GENERIC one on purpose. Real GitHub's measured 403s
|
|
5739
|
-
// name the operation (3 of 3
|
|
5739
|
+
// name the operation (3 of 3), but `/admin/*` is a twin-only
|
|
5740
5740
|
// route with no GitHub operation behind it, which is the same reason
|
|
5741
5741
|
// `/pulls/:n/diff` and `/pulls/:n/status` stay generic (divergence 32).
|
|
5742
5742
|
forbidden: () => ({ status: 403, body: githubError("Forbidden", 403) })
|
|
@@ -5759,7 +5759,7 @@ var githubTwinDefinition = defineTwin({
|
|
|
5759
5759
|
pomeRoutes: {
|
|
5760
5760
|
"access-control": () => githubAccessControlPayload()
|
|
5761
5761
|
},
|
|
5762
|
-
//
|
|
5762
|
+
// adapter-rich tape pin: x-pome-correlation-id persists as
|
|
5763
5763
|
// tool_call_id on every recorded event (github's frozen tape shape).
|
|
5764
5764
|
stampToolCallId: true,
|
|
5765
5765
|
// Frozen JSON-RPC unknown-tool result text (the legacy /mcp/call surface
|
|
@@ -5768,7 +5768,7 @@ var githubTwinDefinition = defineTwin({
|
|
|
5768
5768
|
unsupported: () => unsupportedEnvelope,
|
|
5769
5769
|
errorEnvelope: githubErrorEnvelope,
|
|
5770
5770
|
auth: {
|
|
5771
|
-
//
|
|
5771
|
+
// Frozen pins (wire-frozen): Bearer-header only (no extra token
|
|
5772
5772
|
// resolvers), raw bearer rejected (allowRawBearer=false), sid mismatch
|
|
5773
5773
|
// → 401 {message:"Forbidden"}, and an expired JWT rendering as
|
|
5774
5774
|
// "Bad credentials". The pre-port explicit "Token expired" branch was
|
|
@@ -5776,7 +5776,7 @@ var githubTwinDefinition = defineTwin({
|
|
|
5776
5776
|
// was ever reached, so the wire always said "Bad credentials"
|
|
5777
5777
|
// (pre-ruled: deleting it is zero wire diff).
|
|
5778
5778
|
//
|
|
5779
|
-
// ──
|
|
5779
|
+
// ── Two things changed about these bodies ──────────────────────────
|
|
5780
5780
|
//
|
|
5781
5781
|
// 1. They are built by `githubError` now instead of by hand, which is
|
|
5782
5782
|
// what gives them the `documentation_url` and `status` leaves real
|
|
@@ -5784,7 +5784,7 @@ var githubTwinDefinition = defineTwin({
|
|
|
5784
5784
|
// `{"message":…,"documentation_url":"https://docs.github.com/rest","status":"401"}`.
|
|
5785
5785
|
// The url is GitHub's GENERIC one and MUST STAY generic — GitHub
|
|
5786
5786
|
// names no operation on a 401 because authentication fails before
|
|
5787
|
-
// dispatch (8 of 8 measured
|
|
5787
|
+
// dispatch (8 of 8 measured), which is the half of
|
|
5788
5788
|
// divergence 32 that is a requirement rather than a gap. `githubError`
|
|
5789
5789
|
// defaults to exactly that url and this call passes no override.
|
|
5790
5790
|
//
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { SLACK_CHECKS } from './chunk-
|
|
1
|
+
export { SLACK_CHECKS } from './chunk-2ZGVDTJC.js';
|
|
2
2
|
import './chunk-JWJYNAWI.js';
|
|
3
|
-
import { routeInputDeclarer, booleanInput, integerInput, mountDeclaredRoute, UndeclaredInputError } from './chunk-
|
|
4
|
-
import { loadMcpToolFixture, defineTwin, queryTokenResolver, formTokenResolver, deriveMcpToolTable, UnknownToolError, openTwinDatabase, createApp, typeDisagreements } from './chunk-
|
|
5
|
-
import './chunk-
|
|
3
|
+
import { routeInputDeclarer, booleanInput, integerInput, mountDeclaredRoute, UndeclaredInputError } from './chunk-IZFM7W2V.js';
|
|
4
|
+
import { loadMcpToolFixture, defineTwin, queryTokenResolver, formTokenResolver, deriveMcpToolTable, UnknownToolError, openTwinDatabase, createApp, typeDisagreements } from './chunk-CFXEETE3.js';
|
|
5
|
+
import './chunk-6KJC4BTO.js';
|
|
6
6
|
import './chunk-SG6ZTIMT.js';
|
|
7
7
|
import { z, ZodError } from 'zod';
|
|
8
8
|
|
|
@@ -599,7 +599,7 @@ function serializeUser(row, opts = {}) {
|
|
|
599
599
|
// The embedded profile carries `team` (both users.list and users.info) but
|
|
600
600
|
// OMITS `email` on users.list — real Slack only returns the email on the
|
|
601
601
|
// single-user reads (users.info / lookupByEmail), not in the list envelope
|
|
602
|
-
// (
|
|
602
|
+
// (Kind B). `omitProfileEmail` is set by the users.list caller.
|
|
603
603
|
// serializeUserProfile returns Record<string, unknown> (its own `...profile`
|
|
604
604
|
// spread is an open record); cast to the upstream Profile shape so the parent
|
|
605
605
|
// `satisfies` stays exact without re-anchoring the nested record here.
|
|
@@ -923,7 +923,7 @@ var seedSchema = z.object({
|
|
|
923
923
|
reactions: z.array(z.object({ name: z.string(), user: z.string() })).default([])
|
|
924
924
|
})).default([])
|
|
925
925
|
})).default([]),
|
|
926
|
-
//
|
|
926
|
+
// Files present in the world before the agent runs. `user` and
|
|
927
927
|
// `channels` are seed HANDLES (a user/channel `name`) or ids — the same
|
|
928
928
|
// currency `channels[].members` and `channels[].messages[].user` already use.
|
|
929
929
|
files: z.array(z.object({
|
|
@@ -1454,7 +1454,7 @@ function conversationsHistory(domain, args, actor = {}) {
|
|
|
1454
1454
|
// Real Slack OMITS `response_metadata` on conversations.history when there is
|
|
1455
1455
|
// no next page (it only carries the pagination cursor when hasMore); it does
|
|
1456
1456
|
// NOT return an empty-cursor envelope here the way conversations.list does
|
|
1457
|
-
// (
|
|
1457
|
+
// (Kind B — conditional pagination matched per endpoint).
|
|
1458
1458
|
...hasMore ? { response_metadata: { next_cursor: cursorEncode({ offset: offset + slice.length }) } } : {}
|
|
1459
1459
|
};
|
|
1460
1460
|
}
|
|
@@ -1493,7 +1493,7 @@ function conversationsReplies(domain, args, actor = {}) {
|
|
|
1493
1493
|
}),
|
|
1494
1494
|
has_more: hasMore,
|
|
1495
1495
|
// Real Slack OMITS `response_metadata` on conversations.replies when there is
|
|
1496
|
-
// no next page (cursor present only when hasMore) —
|
|
1496
|
+
// no next page (cursor present only when hasMore) — Kind B.
|
|
1497
1497
|
...hasMore ? { response_metadata: { next_cursor: cursorEncode({ offset: offset + slice.length }) } } : {}
|
|
1498
1498
|
};
|
|
1499
1499
|
}
|
|
@@ -1605,7 +1605,7 @@ function filesList(domain, args) {
|
|
|
1605
1605
|
// files.list paginates via `paging` (page/pages), not a cursor. Real Slack
|
|
1606
1606
|
// does NOT return a `response_metadata.next_cursor` envelope on files.list,
|
|
1607
1607
|
// so the twin omits it rather than emitting an empty-cursor stub that diffs
|
|
1608
|
-
// as a twin-only field (
|
|
1608
|
+
// as a twin-only field (Kind B).
|
|
1609
1609
|
};
|
|
1610
1610
|
}
|
|
1611
1611
|
function filesDelete(domain, args, actor, onDelta = NOOP3) {
|
|
@@ -1801,7 +1801,7 @@ function usersList(domain, args) {
|
|
|
1801
1801
|
const slice = rows.slice(0, limit);
|
|
1802
1802
|
return {
|
|
1803
1803
|
// users.list embeds each user's profile WITHOUT `email` — real Slack only
|
|
1804
|
-
// returns the email on the single-user reads (
|
|
1804
|
+
// returns the email on the single-user reads (Kind B).
|
|
1805
1805
|
members: slice.map((row) => serializeUser(row, { include_locale: args.include_locale, omitProfileEmail: true })),
|
|
1806
1806
|
cache_ts: nowUnix(),
|
|
1807
1807
|
response_metadata: {
|
|
@@ -2409,7 +2409,7 @@ var SLACK_READS = {
|
|
|
2409
2409
|
}),
|
|
2410
2410
|
bookmarksList: slackRead("/bookmarks.list", { channel_id: emptyIfAbsent() }),
|
|
2411
2411
|
teamInfo: slackRead("/team.info", { team: absentIfEmpty() }),
|
|
2412
|
-
// `domain.emojiList` reads no argument at all, and the
|
|
2412
|
+
// `domain.emojiList` reads no argument at all, and the legacy handler
|
|
2413
2413
|
// forwarded the whole merged bag — the silent hole this ticket exists to
|
|
2414
2414
|
// close. `include_categories` is what Slack's `emoji.list` declares beyond
|
|
2415
2415
|
// `token`, so that is the surface, and an unnamed argument is now refused.
|
|
@@ -2504,7 +2504,7 @@ var SLACK_WRITES = {
|
|
|
2504
2504
|
timestamp: emptyIfAbsent()
|
|
2505
2505
|
}),
|
|
2506
2506
|
filesUpload: slackWrite("/files.upload", {
|
|
2507
|
-
//
|
|
2507
|
+
// SLACK-DECL-IN-003 — `channels` (plural, comma-separated) only.
|
|
2508
2508
|
// Slack has never documented a singular `channel` here, and the vendored
|
|
2509
2509
|
// `slack_web_openapi_v2` snapshot agrees: it declares `channels` and eight
|
|
2510
2510
|
// other real arguments, so it is not thin on this method. An upload
|
|
@@ -3230,7 +3230,7 @@ var slackTwinDefinition = defineTwin({
|
|
|
3230
3230
|
return domain;
|
|
3231
3231
|
},
|
|
3232
3232
|
routes: registerSlackRoutes,
|
|
3233
|
-
// Frozen slack body parsing (
|
|
3233
|
+
// Frozen slack body parsing (review pin): form-or-JSON on every
|
|
3234
3234
|
// engine-owned surface — official Slack SDKs default to
|
|
3235
3235
|
// application/x-www-form-urlencoded — and malformed JSON collapses to {}.
|
|
3236
3236
|
bodyReader: (c) => parseFormOrJson(c),
|
|
@@ -3274,7 +3274,7 @@ var slackTwinDefinition = defineTwin({
|
|
|
3274
3274
|
unsupported: () => unsupportedEnvelope,
|
|
3275
3275
|
errorEnvelope: slackErrorEnvelope,
|
|
3276
3276
|
auth: {
|
|
3277
|
-
//
|
|
3277
|
+
// Frozen pins: Bearer header + ?token= + form-body token; raw bearer
|
|
3278
3278
|
// rejected (allowRawBearer default false); sid mismatch → 401
|
|
3279
3279
|
// invalid_auth; expired vs invalid classified by the engine and
|
|
3280
3280
|
// rendered through the envelope hook.
|
|
@@ -2,9 +2,9 @@ export { LINEAR_CHECKS } from './chunk-XBT6ZLBG.js';
|
|
|
2
2
|
import { MCP_PAGE_MAX, defaultSeedState, linearSeedSchema, notFound, badUserInput, MCP_PAGE_DEFAULT, DEFAULT_LINEAR_EMAIL, RELAY_PAGE_MAX, RELAY_PAGE_DEFAULT, STATE_EXPORT_CAP, parseSeed, DEFAULT_LINEAR_CLOCK, LINEAR_PROVIDER_TOKEN_PREFIX, DEFAULT_LINEAR_SID, DEFAULT_SCOPES, linearErrorEnvelope, unauthorizedEnvelope, unsupportedEnvelope, forbiddenEnvelope, assertWebhookUrl, ACCESS_TOKEN_TTL_SECONDS, OAUTH_CODE_TTL_SECONDS, TITLE_MAX_BYTES, BODY_MAX_BYTES, LinearTwinError, GRAPHQL_QUERY_MAX_BYTES, GRAPHQL_SELECTION_DEPTH_MAX } from './chunk-IZIZC7ZW.js';
|
|
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
|
-
import { routeInputDeclarer, mountDeclaredRoute, UndeclaredInputError } from './chunk-
|
|
6
|
-
import { loadMcpToolFixture, deriveMcpToolTable, openTwinDatabase, defineTwin, createApp } from './chunk-
|
|
7
|
-
import './chunk-
|
|
5
|
+
import { routeInputDeclarer, mountDeclaredRoute, UndeclaredInputError } from './chunk-IZFM7W2V.js';
|
|
6
|
+
import { loadMcpToolFixture, deriveMcpToolTable, openTwinDatabase, defineTwin, createApp } from './chunk-CFXEETE3.js';
|
|
7
|
+
import './chunk-6KJC4BTO.js';
|
|
8
8
|
import './chunk-SG6ZTIMT.js';
|
|
9
9
|
import { createHmac, timingSafeEqual, createHash, randomBytes } from 'node:crypto';
|
|
10
10
|
import { z } from 'zod';
|
|
@@ -510,7 +510,7 @@ var AGENT_SESSION_STATUSES = [
|
|
|
510
510
|
];
|
|
511
511
|
function readSessionStatus(value) {
|
|
512
512
|
if (!AGENT_SESSION_STATUSES.includes(value)) {
|
|
513
|
-
throw new LinearTwinError(500, "INTERNAL_SERVER_ERROR", `Stored agent session status "${value}" is not one of Linear's AgentSessionStatus members (${AGENT_SESSION_STATUSES.join(", ")}). This database predates the
|
|
513
|
+
throw new LinearTwinError(500, "INTERNAL_SERVER_ERROR", `Stored agent session status "${value}" is not one of Linear's AgentSessionStatus members (${AGENT_SESSION_STATUSES.join(", ")}). This database predates the rename and was not migrated.`);
|
|
514
514
|
}
|
|
515
515
|
return value;
|
|
516
516
|
}
|
|
@@ -4731,7 +4731,7 @@ function createRootValue(ctx) {
|
|
|
4731
4731
|
return payload({ agentSession: formatAgentSession(session) });
|
|
4732
4732
|
},
|
|
4733
4733
|
// `id` is non-null on the schema, as it is upstream — there is no longer an
|
|
4734
|
-
// `input.id` to fall back to
|
|
4734
|
+
// No `input.id` to fall back to.
|
|
4735
4735
|
agentSessionUpdate: ({ id, input }) => {
|
|
4736
4736
|
const session = commands.updateAgentSession(id, parseAgentSessionUpdateInput(input), actor);
|
|
4737
4737
|
return payload({ agentSession: formatAgentSession(session) });
|
|
@@ -5040,7 +5040,7 @@ var linearGraphQLSchema = buildSchema(`
|
|
|
5040
5040
|
team: Team
|
|
5041
5041
|
}
|
|
5042
5042
|
|
|
5043
|
-
"""Linear's AgentSessionStatus, member-for-member
|
|
5043
|
+
"""Linear's AgentSessionStatus, member-for-member."""
|
|
5044
5044
|
enum AgentSessionStatus {
|
|
5045
5045
|
pending
|
|
5046
5046
|
active
|
|
@@ -5063,7 +5063,7 @@ var linearGraphQLSchema = buildSchema(`
|
|
|
5063
5063
|
activities(first: Int, after: String, last: Int, before: String): AgentActivityConnection!
|
|
5064
5064
|
}
|
|
5065
5065
|
|
|
5066
|
-
"""Linear's AgentActivitySignal, member-for-member
|
|
5066
|
+
"""Linear's AgentActivitySignal, member-for-member."""
|
|
5067
5067
|
enum AgentActivitySignal {
|
|
5068
5068
|
stop
|
|
5069
5069
|
continue
|
|
@@ -5077,7 +5077,7 @@ var linearGraphQLSchema = buildSchema(`
|
|
|
5077
5077
|
Linear's AgentActivityContent union, carried as an opaque payload: a
|
|
5078
5078
|
{type, body} object for five of the six members, {type, action, parameter}
|
|
5079
5079
|
for the action member. The union itself is a scalar-level divergence,
|
|
5080
|
-
written up in REFERENCE-DIVERGENCES.md
|
|
5080
|
+
written up in REFERENCE-DIVERGENCES.md.
|
|
5081
5081
|
"""
|
|
5082
5082
|
content: JSON!
|
|
5083
5083
|
signal: AgentActivitySignal
|
|
@@ -5239,13 +5239,13 @@ var linearGraphQLSchema = buildSchema(`
|
|
|
5239
5239
|
enabled: Boolean
|
|
5240
5240
|
}
|
|
5241
5241
|
|
|
5242
|
-
"""Linear's AgentSessionExternalUrlInput, field-for-field
|
|
5242
|
+
"""Linear's AgentSessionExternalUrlInput, field-for-field."""
|
|
5243
5243
|
input AgentSessionExternalUrlInput {
|
|
5244
5244
|
url: String!
|
|
5245
5245
|
label: String!
|
|
5246
5246
|
}
|
|
5247
5247
|
|
|
5248
|
-
"""Linear's AgentSessionCreateOnIssue, minus the fields the twin does not model
|
|
5248
|
+
"""Linear's AgentSessionCreateOnIssue, minus the fields the twin does not model."""
|
|
5249
5249
|
input AgentSessionCreateOnIssue {
|
|
5250
5250
|
issueId: String!
|
|
5251
5251
|
externalUrls: [AgentSessionExternalUrlInput!]
|
|
@@ -5257,7 +5257,7 @@ var linearGraphQLSchema = buildSchema(`
|
|
|
5257
5257
|
}
|
|
5258
5258
|
|
|
5259
5259
|
"""
|
|
5260
|
-
Linear declares no status and no id field here
|
|
5260
|
+
Linear declares no status and no id field here. Status follows the
|
|
5261
5261
|
agent's activities; id is the mutation's own non-null argument.
|
|
5262
5262
|
"""
|
|
5263
5263
|
input AgentSessionUpdateInput {
|
|
@@ -5462,7 +5462,7 @@ function createLinearTwinDefinition(db) {
|
|
|
5462
5462
|
reportDelta(linearStateDelta(before, domain.exportState()));
|
|
5463
5463
|
return { ok: true };
|
|
5464
5464
|
},
|
|
5465
|
-
//
|
|
5465
|
+
// Declared, so the shared gate in `@pome-sh/sdk` stops
|
|
5466
5466
|
// answering a GraphQL twin with GitHub's `{message, documentation_url}`.
|
|
5467
5467
|
forbidden: () => forbiddenEnvelope()
|
|
5468
5468
|
},
|
|
@@ -5480,8 +5480,8 @@ function createLinearTwinDefinition(db) {
|
|
|
5480
5480
|
allowRawBearer: true,
|
|
5481
5481
|
resolveCredential: (token2) => resolveLinearCredential(db, token2),
|
|
5482
5482
|
// Both take `unauthorizedEnvelope`'s default: Linear answers a bad
|
|
5483
|
-
// bearer and a missing one with the SAME body (measured 2026-08-13,
|
|
5484
|
-
//
|
|
5483
|
+
// bearer and a missing one with the SAME body (measured 2026-08-13),
|
|
5484
|
+
// and has no session-id concept to give the mismatch leg a
|
|
5485
5485
|
// third one. The messages that used to be here — "Bad credentials" and
|
|
5486
5486
|
// "Session id mismatch" — were the twin's own inventions, and the first
|
|
5487
5487
|
// was GitHub's.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { bootTwin } from './chunk-
|
|
2
|
-
import { isTwinName, TWIN_NAMES, defaultPortFor, TWIN_REGISTRY } from './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
1
|
+
import { bootTwin } from './chunk-KIXYRPVY.js';
|
|
2
|
+
import { isTwinName, TWIN_NAMES, defaultPortFor, TWIN_REGISTRY } from './chunk-EIUCTFQV.js';
|
|
3
|
+
import './chunk-CFXEETE3.js';
|
|
4
|
+
import './chunk-6KJC4BTO.js';
|
|
5
5
|
import './chunk-SG6ZTIMT.js';
|
|
6
6
|
import { randomBytes } from 'node:crypto';
|
|
7
7
|
import { readFileSync } from 'node:fs';
|