@ainyc/canonry 4.180.7 → 4.182.3
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 +80 -45
- package/assets/agent-workspace/skills/canonry/SKILL.md +13 -10
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +7 -6
- package/assets/assets/{AuditHistoryPanel-B1lmI7wm.js → AuditHistoryPanel-1_FHpzj-.js} +1 -1
- package/assets/assets/{BacklinksPage-Bw61uQu8.js → BacklinksPage-045za10_.js} +1 -1
- package/assets/assets/{ChartPrimitives-DG35TyhH.js → ChartPrimitives-DLEICrrL.js} +1 -1
- package/assets/assets/{HistoryPage-D8z9-NkT.js → HistoryPage-36K_6asu.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-CXX9GFj8.js → MeasurementPropertyPage-B4DJGoY6.js} +1 -1
- package/assets/assets/ProjectPage-CshC68Ne.js +9 -0
- package/assets/assets/{RunRow-DXHy16T3.js → RunRow-U2CN755e.js} +1 -1
- package/assets/assets/{RunsPage-D2aE620i.js → RunsPage-D0CtU4d-.js} +1 -1
- package/assets/assets/SettingsPage-zMWieTPK.js +1 -0
- package/assets/assets/SiteHealthSection-TpQPu_Uj.js +4 -0
- package/assets/assets/{TrafficPage-DFHWgvkU.js → TrafficPage-DfLUt-64.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-DxjyRL8Y.js → TrafficSourceDetailPage-DbjNNWSt.js} +1 -1
- package/assets/assets/extract-error-message-CWqz1QPC.js +1 -0
- package/assets/assets/index-Brb7M_6G.js +86 -0
- package/assets/assets/index-DwdK2e4e.css +1 -0
- package/assets/assets/{react-sigma_core.esm.min-DAcOZae7.js → react-sigma_core.esm.min-Drqprr9L.js} +1 -1
- package/assets/assets/{vendor-lucide-nYKv-BB7.js → vendor-lucide-XjCNFK0x.js} +1 -1
- package/assets/assets/{vendor-markdown-Bn7fRwrx.js → vendor-markdown-9tTeP8v7.js} +1 -1
- package/assets/assets/{vendor-radix-4UOaVWza.js → vendor-radix-BpmvLvpp.js} +1 -1
- package/assets/assets/{vendor-recharts-D8rt5lKn.js → vendor-recharts-FA0uySU7.js} +1 -1
- package/assets/assets/{vendor-tanstack-Dock0eH1.js → vendor-tanstack-CYBjbqVr.js} +1 -1
- package/assets/index.html +7 -7
- package/dist/{chunk-VZO6CLHY.js → chunk-BDJT7XZL.js} +169 -64
- package/dist/{chunk-RXXZ5BU5.js → chunk-DY5ZDKQW.js} +183 -1
- package/dist/{chunk-CWXPBQR5.js → chunk-FVC7PGYQ.js} +47 -5
- package/dist/{chunk-XYTSKRO3.js → chunk-I3KSOMJA.js} +2 -2
- package/dist/{chunk-WJFBNCVD.js → chunk-K45YKXE4.js} +4310 -3323
- package/dist/cli.js +323 -99
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-MEPYXRBS.js → intelligence-service-HGA553GT.js} +2 -2
- package/dist/mcp.js +3 -3
- package/package.json +7 -7
- package/assets/assets/ProjectPage-BaN_rvoV.js +0 -9
- package/assets/assets/SettingsPage-BiiFqarS.js +0 -1
- package/assets/assets/SiteHealthSection-DCH2Ejtc.js +0 -4
- package/assets/assets/extract-error-message-BdXUZQW9.js +0 -1
- package/assets/assets/index-BuEq5Rhg.css +0 -1
- package/assets/assets/index-CSictO9U.js +0 -83
package/assets/index.html
CHANGED
|
@@ -12,14 +12,14 @@
|
|
|
12
12
|
<link rel="icon" type="image/png" sizes="32x32" href="./favicon-32.png" />
|
|
13
13
|
<link rel="apple-touch-icon" href="./apple-touch-icon.png" />
|
|
14
14
|
<title>Canonry</title>
|
|
15
|
-
<script type="module" crossorigin src="./assets/index-
|
|
16
|
-
<link rel="modulepreload" crossorigin href="./assets/vendor-tanstack-
|
|
17
|
-
<link rel="modulepreload" crossorigin href="./assets/vendor-radix-
|
|
18
|
-
<link rel="modulepreload" crossorigin href="./assets/vendor-recharts-
|
|
19
|
-
<link rel="modulepreload" crossorigin href="./assets/vendor-lucide-
|
|
20
|
-
<link rel="modulepreload" crossorigin href="./assets/vendor-markdown-
|
|
15
|
+
<script type="module" crossorigin src="./assets/index-Brb7M_6G.js"></script>
|
|
16
|
+
<link rel="modulepreload" crossorigin href="./assets/vendor-tanstack-CYBjbqVr.js">
|
|
17
|
+
<link rel="modulepreload" crossorigin href="./assets/vendor-radix-BpmvLvpp.js">
|
|
18
|
+
<link rel="modulepreload" crossorigin href="./assets/vendor-recharts-FA0uySU7.js">
|
|
19
|
+
<link rel="modulepreload" crossorigin href="./assets/vendor-lucide-XjCNFK0x.js">
|
|
20
|
+
<link rel="modulepreload" crossorigin href="./assets/vendor-markdown-9tTeP8v7.js">
|
|
21
21
|
<link rel="modulepreload" crossorigin href="./assets/vendor-yaml-GWJz5H2G.js">
|
|
22
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
22
|
+
<link rel="stylesheet" crossorigin href="./assets/index-DwdK2e4e.css">
|
|
23
23
|
</head>
|
|
24
24
|
<body>
|
|
25
25
|
<div id="root"></div>
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
loadConfig,
|
|
12
12
|
loadConfigRaw,
|
|
13
13
|
saveConfigPatch
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-FVC7PGYQ.js";
|
|
15
15
|
import {
|
|
16
16
|
CC_CACHE_DIR,
|
|
17
17
|
DUCKDB_SPEC,
|
|
@@ -157,7 +157,7 @@ import {
|
|
|
157
157
|
siteCrawlSnapshots,
|
|
158
158
|
toAlertView,
|
|
159
159
|
usageCounters
|
|
160
|
-
} from "./chunk-
|
|
160
|
+
} from "./chunk-K45YKXE4.js";
|
|
161
161
|
import {
|
|
162
162
|
AGENT_MEMORY_VALUE_MAX_BYTES,
|
|
163
163
|
AGENT_PROVIDER_IDS,
|
|
@@ -266,6 +266,7 @@ import {
|
|
|
266
266
|
isSelfLink,
|
|
267
267
|
isVertexGroundingRedirect,
|
|
268
268
|
mapWithConcurrency,
|
|
269
|
+
nextScheduleUpdatedAt,
|
|
269
270
|
normalizeIdTokens,
|
|
270
271
|
normalizeMeasurementExecutionQueryText,
|
|
271
272
|
normalizeServedModel,
|
|
@@ -295,7 +296,7 @@ import {
|
|
|
295
296
|
validationError,
|
|
296
297
|
winnabilityClassLabel,
|
|
297
298
|
withRetry
|
|
298
|
-
} from "./chunk-
|
|
299
|
+
} from "./chunk-DY5ZDKQW.js";
|
|
299
300
|
|
|
300
301
|
// src/telemetry.ts
|
|
301
302
|
import crypto from "crypto";
|
|
@@ -11866,7 +11867,7 @@ function readStoredGroundingSources(rawResponse) {
|
|
|
11866
11867
|
return result;
|
|
11867
11868
|
}
|
|
11868
11869
|
async function backfillInsightsCommand(project, opts) {
|
|
11869
|
-
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-
|
|
11870
|
+
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-HGA553GT.js");
|
|
11870
11871
|
const config = loadConfig();
|
|
11871
11872
|
const db = createClient(config.database);
|
|
11872
11873
|
migrate(db);
|
|
@@ -12447,6 +12448,21 @@ import cron from "node-cron";
|
|
|
12447
12448
|
import { and as and14, eq as eq17, inArray as inArray6, notExists, sql as sql8 } from "drizzle-orm";
|
|
12448
12449
|
var log14 = createLogger("Scheduler");
|
|
12449
12450
|
var DEFAULT_HEALTH_CRON = "0 */6 * * *";
|
|
12451
|
+
function ensureDefaultHealthSchedule(db, projectId, now = (/* @__PURE__ */ new Date()).toISOString()) {
|
|
12452
|
+
const result = db.insert(schedules).values({
|
|
12453
|
+
id: crypto20.randomUUID(),
|
|
12454
|
+
projectId,
|
|
12455
|
+
kind: SchedulableRunKinds.doctor,
|
|
12456
|
+
cronExpr: DEFAULT_HEALTH_CRON,
|
|
12457
|
+
timezone: "UTC",
|
|
12458
|
+
enabled: true,
|
|
12459
|
+
providers: [],
|
|
12460
|
+
nextRunAt: nextRunFromCron(DEFAULT_HEALTH_CRON, "UTC"),
|
|
12461
|
+
createdAt: now,
|
|
12462
|
+
updatedAt: now
|
|
12463
|
+
}).onConflictDoNothing().run();
|
|
12464
|
+
return result.changes === 1;
|
|
12465
|
+
}
|
|
12450
12466
|
function taskKey(projectId, kind) {
|
|
12451
12467
|
return `${projectId}::${kind}`;
|
|
12452
12468
|
}
|
|
@@ -12483,21 +12499,13 @@ var Scheduler = class {
|
|
|
12483
12499
|
)).all();
|
|
12484
12500
|
if (projectsWithoutHealth.length === 0) return;
|
|
12485
12501
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
12502
|
+
let seeded = 0;
|
|
12486
12503
|
for (const project of projectsWithoutHealth) {
|
|
12487
|
-
this.db.
|
|
12488
|
-
|
|
12489
|
-
|
|
12490
|
-
|
|
12491
|
-
cronExpr: DEFAULT_HEALTH_CRON,
|
|
12492
|
-
timezone: "UTC",
|
|
12493
|
-
enabled: true,
|
|
12494
|
-
providers: [],
|
|
12495
|
-
nextRunAt: nextRunFromCron(DEFAULT_HEALTH_CRON, "UTC"),
|
|
12496
|
-
createdAt: now,
|
|
12497
|
-
updatedAt: now
|
|
12498
|
-
}).run();
|
|
12504
|
+
if (ensureDefaultHealthSchedule(this.db, project.id, now)) seeded += 1;
|
|
12505
|
+
}
|
|
12506
|
+
if (seeded > 0) {
|
|
12507
|
+
log14.info("health-schedule.seeded", { projectCount: seeded, cron: DEFAULT_HEALTH_CRON });
|
|
12499
12508
|
}
|
|
12500
|
-
log14.info("health-schedule.seeded", { projectCount: projectsWithoutHealth.length, cron: DEFAULT_HEALTH_CRON });
|
|
12501
12509
|
}
|
|
12502
12510
|
/**
|
|
12503
12511
|
* Record each project's current query set as basket revision 1 if it has
|
|
@@ -12584,6 +12592,17 @@ var Scheduler = class {
|
|
|
12584
12592
|
void task.destroy();
|
|
12585
12593
|
log14.info(`task.${verb.toLowerCase()}`, { key });
|
|
12586
12594
|
}
|
|
12595
|
+
/** Runtime timing writes must not restore a version already issued to a settings caller. */
|
|
12596
|
+
updateScheduleTiming(scheduleId, timing) {
|
|
12597
|
+
this.db.transaction((tx) => {
|
|
12598
|
+
const current = tx.select({ updatedAt: schedules.updatedAt }).from(schedules).where(eq17(schedules.id, scheduleId)).get();
|
|
12599
|
+
if (!current) return;
|
|
12600
|
+
tx.update(schedules).set({
|
|
12601
|
+
...timing,
|
|
12602
|
+
updatedAt: nextScheduleUpdatedAt(current.updatedAt)
|
|
12603
|
+
}).where(eq17(schedules.id, scheduleId)).run();
|
|
12604
|
+
});
|
|
12605
|
+
}
|
|
12587
12606
|
registerCronTask(schedule) {
|
|
12588
12607
|
const { id: scheduleId, projectId, cronExpr, timezone } = schedule;
|
|
12589
12608
|
const kind = schedule.kind;
|
|
@@ -12597,10 +12616,9 @@ var Scheduler = class {
|
|
|
12597
12616
|
timezone
|
|
12598
12617
|
});
|
|
12599
12618
|
this.tasks.set(taskKey(projectId, kind), task);
|
|
12600
|
-
this.
|
|
12601
|
-
nextRunAt: nextRunFromCron(cronExpr, timezone)
|
|
12602
|
-
|
|
12603
|
-
}).where(eq17(schedules.id, scheduleId)).run();
|
|
12619
|
+
this.updateScheduleTiming(scheduleId, {
|
|
12620
|
+
nextRunAt: nextRunFromCron(cronExpr, timezone)
|
|
12621
|
+
});
|
|
12604
12622
|
const label = schedule.preset ?? cronExpr;
|
|
12605
12623
|
log14.info("cron.registered", { projectId, kind, schedule: label, timezone });
|
|
12606
12624
|
}
|
|
@@ -12630,11 +12648,10 @@ var Scheduler = class {
|
|
|
12630
12648
|
log14.warn("traffic-sync.no-callback", { scheduleId, projectId, msg: "host did not register onTrafficSyncRequested" });
|
|
12631
12649
|
return;
|
|
12632
12650
|
}
|
|
12633
|
-
this.
|
|
12651
|
+
this.updateScheduleTiming(currentSchedule.id, {
|
|
12634
12652
|
lastRunAt: now,
|
|
12635
|
-
nextRunAt
|
|
12636
|
-
|
|
12637
|
-
}).where(eq17(schedules.id, currentSchedule.id)).run();
|
|
12653
|
+
nextRunAt
|
|
12654
|
+
});
|
|
12638
12655
|
log14.info("traffic-sync.triggered", { projectName: project.name, sourceId });
|
|
12639
12656
|
this.callbacks.onTrafficSyncRequested(project.name, sourceId);
|
|
12640
12657
|
return;
|
|
@@ -12653,11 +12670,10 @@ var Scheduler = class {
|
|
|
12653
12670
|
trigger: RunTriggers.scheduled,
|
|
12654
12671
|
createdAt: now
|
|
12655
12672
|
}).run();
|
|
12656
|
-
this.
|
|
12673
|
+
this.updateScheduleTiming(currentSchedule.id, {
|
|
12657
12674
|
lastRunAt: now,
|
|
12658
|
-
nextRunAt
|
|
12659
|
-
|
|
12660
|
-
}).where(eq17(schedules.id, currentSchedule.id)).run();
|
|
12675
|
+
nextRunAt
|
|
12676
|
+
});
|
|
12661
12677
|
log14.info("gbp-sync.triggered", { runId: runId2, projectName: project.name });
|
|
12662
12678
|
this.callbacks.onGbpSyncRequested(runId2, projectId);
|
|
12663
12679
|
return;
|
|
@@ -12674,7 +12690,7 @@ var Scheduler = class {
|
|
|
12674
12690
|
)).get();
|
|
12675
12691
|
if (activeAdsRun) {
|
|
12676
12692
|
log14.info("ads-sync.skipped-active", { projectName: project.name, activeRunId: activeAdsRun.id });
|
|
12677
|
-
this.
|
|
12693
|
+
this.updateScheduleTiming(currentSchedule.id, { nextRunAt });
|
|
12678
12694
|
return;
|
|
12679
12695
|
}
|
|
12680
12696
|
const runId2 = crypto20.randomUUID();
|
|
@@ -12686,11 +12702,10 @@ var Scheduler = class {
|
|
|
12686
12702
|
trigger: RunTriggers.scheduled,
|
|
12687
12703
|
createdAt: now
|
|
12688
12704
|
}).run();
|
|
12689
|
-
this.
|
|
12705
|
+
this.updateScheduleTiming(currentSchedule.id, {
|
|
12690
12706
|
lastRunAt: now,
|
|
12691
|
-
nextRunAt
|
|
12692
|
-
|
|
12693
|
-
}).where(eq17(schedules.id, currentSchedule.id)).run();
|
|
12707
|
+
nextRunAt
|
|
12708
|
+
});
|
|
12694
12709
|
log14.info("ads-sync.triggered", { runId: runId2, projectName: project.name });
|
|
12695
12710
|
this.callbacks.onAdsSyncRequested(runId2, projectId);
|
|
12696
12711
|
return;
|
|
@@ -12700,11 +12715,10 @@ var Scheduler = class {
|
|
|
12700
12715
|
log14.warn("data-refresh.no-callback", { scheduleId, projectId, msg: "host did not register onDataRefreshRequested" });
|
|
12701
12716
|
return;
|
|
12702
12717
|
}
|
|
12703
|
-
this.
|
|
12718
|
+
this.updateScheduleTiming(currentSchedule.id, {
|
|
12704
12719
|
lastRunAt: now,
|
|
12705
|
-
nextRunAt
|
|
12706
|
-
|
|
12707
|
-
}).where(eq17(schedules.id, currentSchedule.id)).run();
|
|
12720
|
+
nextRunAt
|
|
12721
|
+
});
|
|
12708
12722
|
log14.info("data-refresh.triggered", { projectName: project.name });
|
|
12709
12723
|
this.callbacks.onDataRefreshRequested(project.name);
|
|
12710
12724
|
return;
|
|
@@ -12714,11 +12728,10 @@ var Scheduler = class {
|
|
|
12714
12728
|
log14.warn("doctor.no-callback", { scheduleId, projectId, msg: "host did not register onDoctorRequested" });
|
|
12715
12729
|
return;
|
|
12716
12730
|
}
|
|
12717
|
-
this.
|
|
12731
|
+
this.updateScheduleTiming(currentSchedule.id, {
|
|
12718
12732
|
lastRunAt: now,
|
|
12719
|
-
nextRunAt
|
|
12720
|
-
|
|
12721
|
-
}).where(eq17(schedules.id, currentSchedule.id)).run();
|
|
12733
|
+
nextRunAt
|
|
12734
|
+
});
|
|
12722
12735
|
log14.info("doctor.triggered", { projectName: project.name });
|
|
12723
12736
|
this.callbacks.onDoctorRequested(project.name);
|
|
12724
12737
|
return;
|
|
@@ -12728,11 +12741,10 @@ var Scheduler = class {
|
|
|
12728
12741
|
log14.warn("backlinks-sync.no-callback", { scheduleId, projectId, msg: "host did not register onBacklinksSyncRequested" });
|
|
12729
12742
|
return;
|
|
12730
12743
|
}
|
|
12731
|
-
this.
|
|
12744
|
+
this.updateScheduleTiming(currentSchedule.id, {
|
|
12732
12745
|
lastRunAt: now,
|
|
12733
|
-
nextRunAt
|
|
12734
|
-
|
|
12735
|
-
}).where(eq17(schedules.id, currentSchedule.id)).run();
|
|
12746
|
+
nextRunAt
|
|
12747
|
+
});
|
|
12736
12748
|
log14.info("backlinks-sync.triggered", { projectName: project.name });
|
|
12737
12749
|
this.callbacks.onBacklinksSyncRequested(project.name);
|
|
12738
12750
|
return;
|
|
@@ -12749,7 +12761,7 @@ var Scheduler = class {
|
|
|
12749
12761
|
)).get();
|
|
12750
12762
|
if (active) {
|
|
12751
12763
|
log14.info("site-audit.skipped-active", { projectName: project.name, activeRunId: active.id });
|
|
12752
|
-
this.
|
|
12764
|
+
this.updateScheduleTiming(currentSchedule.id, { nextRunAt });
|
|
12753
12765
|
return;
|
|
12754
12766
|
}
|
|
12755
12767
|
const runId2 = crypto20.randomUUID();
|
|
@@ -12771,11 +12783,10 @@ var Scheduler = class {
|
|
|
12771
12783
|
createdAt: now
|
|
12772
12784
|
}).run();
|
|
12773
12785
|
});
|
|
12774
|
-
this.
|
|
12786
|
+
this.updateScheduleTiming(currentSchedule.id, {
|
|
12775
12787
|
lastRunAt: now,
|
|
12776
|
-
nextRunAt
|
|
12777
|
-
|
|
12778
|
-
}).where(eq17(schedules.id, currentSchedule.id)).run();
|
|
12788
|
+
nextRunAt
|
|
12789
|
+
});
|
|
12779
12790
|
log14.info("site-audit.triggered", { runId: runId2, projectName: project.name });
|
|
12780
12791
|
this.callbacks.onSiteAuditRequested(runId2, projectId);
|
|
12781
12792
|
return;
|
|
@@ -12805,18 +12816,16 @@ var Scheduler = class {
|
|
|
12805
12816
|
});
|
|
12806
12817
|
if (queueResult.conflict) {
|
|
12807
12818
|
log14.info("run.skipped-active", { projectName: project.name, activeRunId: queueResult.activeRunId });
|
|
12808
|
-
this.
|
|
12809
|
-
nextRunAt
|
|
12810
|
-
|
|
12811
|
-
}).where(eq17(schedules.id, currentSchedule.id)).run();
|
|
12819
|
+
this.updateScheduleTiming(currentSchedule.id, {
|
|
12820
|
+
nextRunAt
|
|
12821
|
+
});
|
|
12812
12822
|
return;
|
|
12813
12823
|
}
|
|
12814
12824
|
const runId = queueResult.runId;
|
|
12815
|
-
this.
|
|
12825
|
+
this.updateScheduleTiming(currentSchedule.id, {
|
|
12816
12826
|
lastRunAt: now,
|
|
12817
|
-
nextRunAt
|
|
12818
|
-
|
|
12819
|
-
}).where(eq17(schedules.id, currentSchedule.id)).run();
|
|
12827
|
+
nextRunAt
|
|
12828
|
+
});
|
|
12820
12829
|
log14.info("run.triggered", { runId, projectName: project.name, providers: providers ?? "all" });
|
|
12821
12830
|
this.callbacks.onRunCreated(runId, projectId, providers, resolvedLocation);
|
|
12822
12831
|
} catch (err) {
|
|
@@ -13794,6 +13803,68 @@ function trimRowsToFit(rows, render) {
|
|
|
13794
13803
|
}
|
|
13795
13804
|
return kept;
|
|
13796
13805
|
}
|
|
13806
|
+
function nestedArrayCandidates(root) {
|
|
13807
|
+
const candidates = [];
|
|
13808
|
+
const visit = (object) => {
|
|
13809
|
+
let containsRecordCollection = false;
|
|
13810
|
+
for (const [key, value] of Object.entries(object)) {
|
|
13811
|
+
if (Array.isArray(value)) {
|
|
13812
|
+
let hasNestedRecords = false;
|
|
13813
|
+
let hasRecordRows = false;
|
|
13814
|
+
for (const row of value) {
|
|
13815
|
+
if (row && typeof row === "object" && !Array.isArray(row)) {
|
|
13816
|
+
hasRecordRows = true;
|
|
13817
|
+
hasNestedRecords = visit(row) || hasNestedRecords;
|
|
13818
|
+
}
|
|
13819
|
+
}
|
|
13820
|
+
if (value.length > 0 && !hasNestedRecords) {
|
|
13821
|
+
candidates.push({ owner: object, key, rows: value, size: serializeResult(value).length, hasRecordRows });
|
|
13822
|
+
}
|
|
13823
|
+
containsRecordCollection = hasRecordRows || hasNestedRecords || containsRecordCollection;
|
|
13824
|
+
} else if (value && typeof value === "object") {
|
|
13825
|
+
containsRecordCollection = visit(value) || containsRecordCollection;
|
|
13826
|
+
}
|
|
13827
|
+
}
|
|
13828
|
+
return containsRecordCollection;
|
|
13829
|
+
};
|
|
13830
|
+
visit(root);
|
|
13831
|
+
return candidates.sort(
|
|
13832
|
+
(left, right) => Number(right.hasRecordRows) - Number(left.hasRecordRows) || right.size - left.size
|
|
13833
|
+
);
|
|
13834
|
+
}
|
|
13835
|
+
function trimNestedArrays(full) {
|
|
13836
|
+
const parsed = JSON.parse(full);
|
|
13837
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return void 0;
|
|
13838
|
+
const copy = parsed;
|
|
13839
|
+
copy.__truncated = true;
|
|
13840
|
+
let out = serializeResult(copy);
|
|
13841
|
+
while (out.length > MAX_TOOL_RESULT_CHARS) {
|
|
13842
|
+
const candidate = nestedArrayCandidates(copy).at(0);
|
|
13843
|
+
if (!candidate) return void 0;
|
|
13844
|
+
const { owner, key, rows } = candidate;
|
|
13845
|
+
const previous = owner.__omittedRowsByField;
|
|
13846
|
+
const omitted = previous && typeof previous === "object" && !Array.isArray(previous) ? { ...previous } : {};
|
|
13847
|
+
const priorCount = typeof omitted[key] === "number" ? omitted[key] : 0;
|
|
13848
|
+
owner.__truncated = true;
|
|
13849
|
+
owner.__omittedRowsByField = omitted;
|
|
13850
|
+
const keep = (count2) => {
|
|
13851
|
+
owner[key] = rows.slice(0, count2);
|
|
13852
|
+
omitted[key] = priorCount + rows.length - count2;
|
|
13853
|
+
return serializeResult(copy);
|
|
13854
|
+
};
|
|
13855
|
+
out = keep(0);
|
|
13856
|
+
if (out.length > MAX_TOOL_RESULT_CHARS) continue;
|
|
13857
|
+
let low = 0;
|
|
13858
|
+
let high = rows.length - 1;
|
|
13859
|
+
while (low < high) {
|
|
13860
|
+
const middle = Math.ceil((low + high) / 2);
|
|
13861
|
+
if (keep(middle).length <= MAX_TOOL_RESULT_CHARS) low = middle;
|
|
13862
|
+
else high = middle - 1;
|
|
13863
|
+
}
|
|
13864
|
+
out = keep(low);
|
|
13865
|
+
}
|
|
13866
|
+
return out;
|
|
13867
|
+
}
|
|
13797
13868
|
function truncateToolResult(details) {
|
|
13798
13869
|
const full = serializeResult(details);
|
|
13799
13870
|
if (full.length <= MAX_TOOL_RESULT_CHARS) return full;
|
|
@@ -13821,6 +13892,8 @@ function truncateToolResult(details) {
|
|
|
13821
13892
|
});
|
|
13822
13893
|
if (out.length <= MAX_TOOL_RESULT_CHARS) return out;
|
|
13823
13894
|
}
|
|
13895
|
+
const nested = trimNestedArrays(full);
|
|
13896
|
+
if (nested !== void 0) return nested;
|
|
13824
13897
|
}
|
|
13825
13898
|
return full.slice(0, MAX_TOOL_RESULT_CHARS) + "\n" + TRUNCATION_NOTE;
|
|
13826
13899
|
}
|
|
@@ -16775,6 +16848,11 @@ async function executeGtmMarketingSync(db, runtime, runId, projectId) {
|
|
|
16775
16848
|
var _require3 = createRequire4(import.meta.url);
|
|
16776
16849
|
var { version: PKG_VERSION2 } = _require3("../package.json");
|
|
16777
16850
|
var log21 = createLogger("Server");
|
|
16851
|
+
var runtimeStartupByServer = /* @__PURE__ */ new WeakMap();
|
|
16852
|
+
function waitForServerRuntimeStartup(app) {
|
|
16853
|
+
const startup = runtimeStartupByServer.get(app);
|
|
16854
|
+
return startup ?? Promise.reject(new Error("Server runtime startup was not registered"));
|
|
16855
|
+
}
|
|
16778
16856
|
var DEFAULT_QUOTA = {
|
|
16779
16857
|
maxConcurrency: 2,
|
|
16780
16858
|
maxRequestsPerMinute: 10,
|
|
@@ -18114,7 +18192,7 @@ async function createServer(opts) {
|
|
|
18114
18192
|
return reply.status(401).send({
|
|
18115
18193
|
error: {
|
|
18116
18194
|
code: "AUTH_INVALID",
|
|
18117
|
-
message: "Server API key not found \u2014
|
|
18195
|
+
message: "Server API key not found \u2014 run canonry bootstrap"
|
|
18118
18196
|
}
|
|
18119
18197
|
});
|
|
18120
18198
|
}
|
|
@@ -18679,6 +18757,11 @@ async function createServer(opts) {
|
|
|
18679
18757
|
if (action === "upsert") scheduler.upsert(projectId, kind);
|
|
18680
18758
|
if (action === "delete") scheduler.remove(projectId, kind);
|
|
18681
18759
|
},
|
|
18760
|
+
onProjectCreated: (projectId) => {
|
|
18761
|
+
if (ensureDefaultHealthSchedule(opts.db, projectId)) {
|
|
18762
|
+
scheduler.upsert(projectId, SchedulableRunKinds.doctor);
|
|
18763
|
+
}
|
|
18764
|
+
},
|
|
18682
18765
|
onProjectDeleting: prepareGoogleMarketingCredentialDelete,
|
|
18683
18766
|
onProjectDeleted: (projectId) => {
|
|
18684
18767
|
scheduler.removeAllForProject(projectId);
|
|
@@ -18948,10 +19031,30 @@ async function createServer(opts) {
|
|
|
18948
19031
|
app.get(`${basePath}health`, healthHandler);
|
|
18949
19032
|
}
|
|
18950
19033
|
checkLatestVersionForServer();
|
|
18951
|
-
|
|
18952
|
-
|
|
18953
|
-
|
|
18954
|
-
|
|
19034
|
+
let resolveRuntimeStartup;
|
|
19035
|
+
let rejectRuntimeStartup;
|
|
19036
|
+
const runtimeStartup = new Promise((resolve, reject) => {
|
|
19037
|
+
resolveRuntimeStartup = resolve;
|
|
19038
|
+
rejectRuntimeStartup = reject;
|
|
19039
|
+
});
|
|
19040
|
+
void runtimeStartup.catch(() => {
|
|
19041
|
+
});
|
|
19042
|
+
runtimeStartupByServer.set(app, runtimeStartup);
|
|
19043
|
+
let runtimeStartupSettled = false;
|
|
19044
|
+
app.addHook("onListen", () => {
|
|
19045
|
+
if (runtimeStartupSettled) return;
|
|
19046
|
+
try {
|
|
19047
|
+
scheduler.start();
|
|
19048
|
+
for (const run of opts.db.select({ id: researchRuns.id, projectId: researchRuns.projectId }).from(researchRuns).where(eq26(researchRuns.status, ResearchRunStatuses.queued)).all()) {
|
|
19049
|
+
dispatchResearchRun(run.id, run.projectId);
|
|
19050
|
+
}
|
|
19051
|
+
runtimeStartupSettled = true;
|
|
19052
|
+
resolveRuntimeStartup();
|
|
19053
|
+
} catch (error) {
|
|
19054
|
+
runtimeStartupSettled = true;
|
|
19055
|
+
rejectRuntimeStartup(error);
|
|
19056
|
+
}
|
|
19057
|
+
});
|
|
18955
19058
|
app.addHook("onClose", async () => {
|
|
18956
19059
|
scheduler.stop();
|
|
18957
19060
|
});
|
|
@@ -19043,5 +19146,7 @@ export {
|
|
|
19043
19146
|
GoogleMarketingRuntimeError,
|
|
19044
19147
|
createGoogleMarketingCredentialStore,
|
|
19045
19148
|
createGoogleMarketingRuntime,
|
|
19149
|
+
waitForServerRuntimeStartup,
|
|
19150
|
+
isLoopbackBindHost,
|
|
19046
19151
|
createServer
|
|
19047
19152
|
};
|