@schoolai/shipyard 3.5.0 → 3.5.1-rc.20260504.1

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/index.js CHANGED
@@ -112,7 +112,7 @@ async function handleSubcommand() {
112
112
  return true;
113
113
  }
114
114
  if (subcommand === "start") {
115
- const { startCommand } = await import("./start-I7ZONWK7.js");
115
+ const { startCommand } = await import("./start-GKOOIAPI.js");
116
116
  await startCommand();
117
117
  return true;
118
118
  }
@@ -129,7 +129,7 @@ async function main() {
129
129
  const args = parseCliArgs();
130
130
  if (args.serve) {
131
131
  await loadAuthFromConfig(env);
132
- const { serve } = await import("./serve-IVUGCBEE.js");
132
+ const { serve } = await import("./serve-NZHMK5B6.js");
133
133
  return serve({ isDev: env.SHIPYARD_DEV });
134
134
  }
135
135
  logger.error("Use `shipyard start` to run the daemon. Use --help for usage.");
@@ -32002,7 +32002,10 @@ async function detectModels(lastKnown) {
32002
32002
  }
32003
32003
 
32004
32004
  // src/shared/capabilities/git-pr-search.ts
32005
- var SEARCH_PR_JSON_FIELDS = "number,title,url,state,isDraft,author,baseRefName,headRefName,headRepository,updatedAt,createdAt,reviewDecision,labels,additions,deletions,changedFiles,comments,assignees,reviewRequests";
32005
+ var SEARCH_PR_JSON_FIELDS = "number,title,url,state,isDraft,author,labels,updatedAt,createdAt,assignees,repository,commentsCount";
32006
+ var PR_VIEW_JSON_FIELDS = "baseRefName,headRefName,headRepository,reviewDecision,additions,deletions,changedFiles,comments,reviewRequests";
32007
+ var ENRICHMENT_CONCURRENCY = 8;
32008
+ var GH_CALL_TIMEOUT_MS = 3e4;
32006
32009
  var GH_SEARCH_STATE_MAP = {
32007
32010
  OPEN: "open",
32008
32011
  CLOSED: "closed",
@@ -32019,7 +32022,7 @@ var PRSummarySchema = external_exports.object({
32019
32022
  author: external_exports.string(),
32020
32023
  baseRefName: external_exports.string(),
32021
32024
  headRefName: external_exports.string(),
32022
- /** Short repo name (headRepository.name extracted) */
32025
+ /** Short repo name (headRepository.name extracted from the gh pr view response) */
32023
32026
  headRepository: external_exports.string(),
32024
32027
  updatedAt: external_exports.union([external_exports.string(), external_exports.number()]),
32025
32028
  createdAt: external_exports.union([external_exports.string(), external_exports.number()]),
@@ -32040,18 +32043,22 @@ var RawSearchPRSchema = external_exports.object({
32040
32043
  state: external_exports.string().optional(),
32041
32044
  isDraft: external_exports.boolean().optional(),
32042
32045
  author: external_exports.object({ login: external_exports.string() }).passthrough().optional(),
32043
- baseRefName: external_exports.string().optional(),
32044
- headRefName: external_exports.string().optional(),
32045
- headRepository: external_exports.object({ name: external_exports.string().optional() }).passthrough().optional(),
32046
32046
  updatedAt: external_exports.string().optional(),
32047
32047
  createdAt: external_exports.string().optional(),
32048
- reviewDecision: external_exports.string().nullable().optional(),
32049
32048
  labels: external_exports.array(external_exports.object({ name: external_exports.string(), color: external_exports.string() }).passthrough()).optional(),
32049
+ assignees: external_exports.array(external_exports.object({ login: external_exports.string() }).passthrough()).optional(),
32050
+ repository: external_exports.object({ name: external_exports.string().optional(), nameWithOwner: external_exports.string().optional() }).passthrough().optional(),
32051
+ commentsCount: external_exports.number().optional()
32052
+ }).passthrough();
32053
+ var RawViewPRSchema = external_exports.object({
32054
+ baseRefName: external_exports.string().optional(),
32055
+ headRefName: external_exports.string().optional(),
32056
+ headRepository: external_exports.object({ name: external_exports.string().optional() }).passthrough().nullable().optional(),
32057
+ reviewDecision: external_exports.string().nullable().optional(),
32050
32058
  additions: external_exports.number().optional(),
32051
32059
  deletions: external_exports.number().optional(),
32052
32060
  changedFiles: external_exports.number().optional(),
32053
32061
  comments: external_exports.union([external_exports.number(), external_exports.array(external_exports.unknown())]).optional(),
32054
- assignees: external_exports.array(external_exports.object({ login: external_exports.string() }).passthrough()).optional(),
32055
32062
  reviewRequests: external_exports.array(external_exports.object({ login: external_exports.string() }).passthrough()).optional()
32056
32063
  }).passthrough();
32057
32064
  function resolveSearchState(raw) {
@@ -32066,54 +32073,98 @@ function mapSearchLabel(l) {
32066
32073
  color: typeof l.color === "string" && l.color !== "" ? `#${l.color}` : ""
32067
32074
  };
32068
32075
  }
32069
- function resolveCommentCount(raw) {
32070
- const c = raw.comments;
32076
+ function resolveCommentCount(merged) {
32077
+ const c = merged.view?.comments;
32071
32078
  if (typeof c === "number") return c;
32072
32079
  if (Array.isArray(c)) return c.length;
32073
- return 0;
32080
+ return merged.search.commentsCount ?? 0;
32074
32081
  }
32075
- function extractSearchScalars(raw) {
32082
+ function extractMergedScalars(merged) {
32083
+ const { search, view } = merged;
32076
32084
  return {
32077
- number: raw.number ?? 0,
32078
- title: raw.title ?? "",
32079
- url: raw.url ?? "",
32080
- author: raw.author?.login ?? "",
32081
- baseRefName: raw.baseRefName ?? "",
32082
- headRefName: raw.headRefName ?? "",
32083
- headRepository: raw.headRepository?.name ?? "",
32084
- updatedAt: raw.updatedAt ?? "",
32085
- createdAt: raw.createdAt ?? "",
32086
- reviewDecision: raw.reviewDecision ?? null,
32087
- additions: raw.additions ?? 0,
32088
- deletions: raw.deletions ?? 0,
32089
- changedFiles: raw.changedFiles ?? 0
32085
+ number: search.number ?? 0,
32086
+ title: search.title ?? "",
32087
+ url: search.url ?? "",
32088
+ author: search.author?.login ?? "",
32089
+ baseRefName: view?.baseRefName ?? "",
32090
+ headRefName: view?.headRefName ?? "",
32091
+ headRepository: view?.headRepository?.name ?? "",
32092
+ updatedAt: search.updatedAt ?? "",
32093
+ createdAt: search.createdAt ?? "",
32094
+ reviewDecision: view?.reviewDecision ?? null,
32095
+ additions: view?.additions ?? 0,
32096
+ deletions: view?.deletions ?? 0,
32097
+ changedFiles: view?.changedFiles ?? 0
32090
32098
  };
32091
32099
  }
32092
- function mapRawSearchPR(raw) {
32100
+ function mapMergedPR(merged) {
32101
+ const { search, view } = merged;
32093
32102
  return {
32094
- ...extractSearchScalars(raw),
32095
- state: resolveSearchState(raw),
32096
- isDraft: raw.isDraft === true,
32097
- labels: (raw.labels ?? []).map(mapSearchLabel),
32098
- comments: resolveCommentCount(raw),
32099
- assignees: (raw.assignees ?? []).map((a) => ({ login: a.login })),
32100
- reviewRequests: (raw.reviewRequests ?? []).map((r) => ({ login: r.login }))
32103
+ ...extractMergedScalars(merged),
32104
+ state: resolveSearchState(search),
32105
+ isDraft: search.isDraft === true,
32106
+ labels: (search.labels ?? []).map(mapSearchLabel),
32107
+ comments: resolveCommentCount(merged),
32108
+ assignees: (search.assignees ?? []).map((a) => ({ login: a.login })),
32109
+ reviewRequests: (view?.reviewRequests ?? []).map((r) => ({ login: r.login }))
32101
32110
  };
32102
32111
  }
32103
- async function searchPrs(args, cwd) {
32112
+ async function parallelMap(items, concurrency, fn) {
32113
+ const results = new Array(items.length);
32114
+ let nextIndex = 0;
32115
+ const workers = Array.from(
32116
+ { length: Math.min(concurrency, items.length) },
32117
+ async () => {
32118
+ while (true) {
32119
+ const i = nextIndex++;
32120
+ if (i >= items.length) return;
32121
+ const item2 = items[i];
32122
+ if (item2 === void 0) return;
32123
+ results[i] = await fn(item2, i);
32124
+ }
32125
+ }
32126
+ );
32127
+ await Promise.all(workers);
32128
+ return results;
32129
+ }
32130
+ async function enrichPr(url, cwd) {
32104
32131
  try {
32105
32132
  const stdout = await runWithTimeout(
32133
+ "gh",
32134
+ ["pr", "view", url, "--json", PR_VIEW_JSON_FIELDS],
32135
+ cwd,
32136
+ GH_CALL_TIMEOUT_MS
32137
+ );
32138
+ const parsed = RawViewPRSchema.safeParse(JSON.parse(stdout));
32139
+ if (!parsed.success) return null;
32140
+ return parsed.data;
32141
+ } catch {
32142
+ return null;
32143
+ }
32144
+ }
32145
+ async function searchPrs(args, cwd) {
32146
+ let stdout;
32147
+ try {
32148
+ stdout = await runWithTimeout(
32106
32149
  "gh",
32107
32150
  ["search", "prs", ...args, "--json", SEARCH_PR_JSON_FIELDS],
32108
32151
  cwd,
32109
- 3e4
32152
+ GH_CALL_TIMEOUT_MS
32110
32153
  );
32111
- const rawArray = external_exports.array(RawSearchPRSchema).safeParse(JSON.parse(stdout));
32112
- if (!rawArray.success) return [];
32113
- return rawArray.data.map(mapRawSearchPR);
32114
32154
  } catch {
32115
32155
  return [];
32116
32156
  }
32157
+ const rawArray = external_exports.array(RawSearchPRSchema).safeParse(JSON.parse(stdout));
32158
+ if (!rawArray.success) return [];
32159
+ const enrichInputs = rawArray.data.map((search) => ({ search, url: search.url ?? "" })).filter((entry) => entry.url !== "");
32160
+ const enrichedViews = await parallelMap(
32161
+ enrichInputs,
32162
+ ENRICHMENT_CONCURRENCY,
32163
+ (entry) => enrichPr(entry.url, cwd)
32164
+ );
32165
+ return enrichInputs.map(
32166
+ (entry, i) => mapMergedPR({ search: entry.search, view: enrichedViews[i] ?? null })
32167
+ );
32117
32168
  }
32118
32169
  function isValidTimestampStr(value) {
32119
32170
  if (!value) return false;
@@ -34878,7 +34929,7 @@ function nanoid(size2 = 21) {
34878
34929
  }
34879
34930
 
34880
34931
  // src/services/bootstrap/signaling.ts
34881
- var DAEMON_NPM_VERSION = true ? "3.5.0" : "unknown";
34932
+ var DAEMON_NPM_VERSION = true ? "3.5.1" : "unknown";
34882
34933
  function createDaemonSignaling(config2) {
34883
34934
  const agentId = config2.agentId ?? nanoid();
34884
34935
  function send(msg) {
@@ -124629,4 +124680,4 @@ export {
124629
124680
  decideWorkspaceScope,
124630
124681
  serve
124631
124682
  };
124632
- //# sourceMappingURL=serve-IVUGCBEE.js.map
124683
+ //# sourceMappingURL=serve-NZHMK5B6.js.map