@adminide-stack/yantra-mobile 12.0.142 → 12.0.145-alpha.0
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/lib/features/attachments/displayUserMessageText.js +2 -2
- package/lib/features/attachments/displayUserMessageText.js.map +1 -1
- package/lib/features/devices/readings.js.map +1 -1
- package/lib/features/devices/session.js +2 -22
- package/lib/features/devices/session.js.map +1 -1
- package/lib/features/notion/NotionAgentPanel.js +987 -0
- package/lib/features/notion/NotionAgentPanel.js.map +1 -0
- package/lib/features/notion/NotionAskAiSheet.js +362 -0
- package/lib/features/notion/NotionAskAiSheet.js.map +1 -0
- package/lib/features/notion/NotionBlockView.js +4 -3
- package/lib/features/notion/NotionBlockView.js.map +1 -1
- package/lib/features/notion/NotionConnectionsSheet.js +47 -13
- package/lib/features/notion/NotionConnectionsSheet.js.map +1 -1
- package/lib/features/notion/NotionPageView.js +68 -8
- package/lib/features/notion/NotionPageView.js.map +1 -1
- package/lib/features/notion/NotionSidebarSections.js +1 -1
- package/lib/features/notion/NotionSidebarSections.js.map +1 -1
- package/lib/features/notion/NotionWorkspaceView.js +14 -9
- package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
- package/lib/features/notion/database/DatabaseCells.js +3 -1
- package/lib/features/notion/database/DatabaseCells.js.map +1 -1
- package/lib/features/notion/database/DatabaseDateLayouts.js +1 -1
- package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -1
- package/lib/features/notion/database/NotionDatabaseView.js +1 -1
- package/lib/features/notion/database/NotionDatabaseView.js.map +1 -1
- package/lib/features/notion/notionAgentRunStatus.js +2 -2
- package/lib/features/notion/notionAgentRunStatus.js.map +1 -1
- package/lib/features/notion/notionAgentRuns.js +57 -0
- package/lib/features/notion/notionAgentRuns.js.map +1 -0
- package/lib/features/notion/notionAiContext.js +91 -0
- package/lib/features/notion/notionAiContext.js.map +1 -0
- package/lib/features/notion/notionConnections.js +42 -4
- package/lib/features/notion/notionConnections.js.map +1 -1
- package/lib/features/notion/notionDocuments.js +61 -1
- package/lib/features/notion/notionDocuments.js.map +1 -1
- package/lib/features/notion/notionNotesAgent.js +173 -3
- package/lib/features/notion/notionNotesAgent.js.map +1 -1
- package/lib/features/notion/notionPageKinds.js +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +229 -97
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +33 -7
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/buildJob.js +2 -2
- package/lib/features/webbuilder/buildJob.js.map +1 -1
- package/lib/features/webbuilder/codeFiles.js +18 -1
- package/lib/features/webbuilder/codeFiles.js.map +1 -1
- package/lib/features/webbuilder/components/BottomTabs.js.map +1 -1
- package/lib/features/webbuilder/components/CodeView.js +134 -56
- package/lib/features/webbuilder/components/CodeView.js.map +1 -1
- package/lib/features/webbuilder/components/Composer.js +2 -2
- package/lib/features/webbuilder/components/Composer.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewFrame.js +19 -3
- package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js +310 -46
- package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectChat.js +141 -12
- package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectSheets.js +792 -0
- package/lib/features/webbuilder/components/ProjectSheets.js.map +1 -0
- package/lib/features/webbuilder/components/ProjectsScreen.js +14 -2
- package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -1
- package/lib/features/webbuilder/components/PublishSheet.js +914 -58
- package/lib/features/webbuilder/components/PublishSheet.js.map +1 -1
- package/lib/features/webbuilder/components/TemplateCard.js +9 -6
- package/lib/features/webbuilder/components/TemplateCard.js.map +1 -1
- package/lib/features/webbuilder/components/TemplatesSheet.js +5 -17
- package/lib/features/webbuilder/components/TemplatesSheet.js.map +1 -1
- package/lib/features/webbuilder/connectorTemplates.js +171 -0
- package/lib/features/webbuilder/connectorTemplates.js.map +1 -0
- package/lib/features/webbuilder/fileTree.js +163 -0
- package/lib/features/webbuilder/fileTree.js.map +1 -0
- package/lib/features/webbuilder/followUps.js +67 -0
- package/lib/features/webbuilder/followUps.js.map +1 -0
- package/lib/features/webbuilder/previewProbe.js +49 -0
- package/lib/features/webbuilder/previewProbe.js.map +1 -0
- package/lib/features/webbuilder/previewRoutes.js +156 -0
- package/lib/features/webbuilder/previewRoutes.js.map +1 -0
- package/lib/features/webbuilder/projectTools.js +341 -0
- package/lib/features/webbuilder/projectTools.js.map +1 -0
- package/lib/features/webbuilder/publishTools.js +475 -0
- package/lib/features/webbuilder/publishTools.js.map +1 -0
- package/lib/features/webbuilder/sleepNotice.js +13 -0
- package/lib/features/webbuilder/sleepNotice.js.map +1 -0
- package/lib/features/webbuilder/stepLabels.js +37 -7
- package/lib/features/webbuilder/stepLabels.js.map +1 -1
- package/lib/features/webbuilder/studioCatalog.js +5 -1
- package/lib/features/webbuilder/studioCatalog.js.map +1 -1
- package/lib/features/webbuilder/templateCatalog.js +140 -0
- package/lib/features/webbuilder/templateCatalog.js.map +1 -0
- package/lib/features/webbuilder/webbuilderPrompts.js +31 -5
- package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -1
- package/lib/features/webbuilder/workflow.js +8 -4
- package/lib/features/webbuilder/workflow.js.map +1 -1
- package/lib/screens/Devices/index.js +3 -205
- package/lib/screens/Devices/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +9 -6
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -1
- package/lib/screens/WebBuilderNative/index.js +1 -1
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/keepAlive.js +53 -3
- package/lib/screens/WebBuilderNative/keepAlive.js.map +1 -1
- package/lib/screens/WebBuilderNative/unreachableRetry.js +23 -0
- package/lib/screens/WebBuilderNative/unreachableRetry.js.map +1 -0
- package/lib/screens/WebBuilderNative/useConnectorTemplates.js +37 -0
- package/lib/screens/WebBuilderNative/useConnectorTemplates.js.map +1 -0
- package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js +6 -0
- package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +302 -40
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderJobs.js +2 -2
- package/lib/screens/WebBuilderNative/useWebBuilderJobs.js.map +1 -1
- package/lib/screens/WebBuilderNative/versionUndo.js +1 -1
- package/lib/screens/WebBuilderNative/versionUndo.js.map +1 -1
- package/lib/screens/WebBuilderNative/webbuilderTransport.js +147 -77
- package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
- package/package.json +4 -4
- package/lib/features/devices/bodyComposition.js +0 -116
- package/lib/features/devices/bodyComposition.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {newAgentProperties}from'./notionPageKinds.js';import {isAgentRunStatus,AGENT_RUN_STATUSES,RUN_STATUS_OPTION}from'./notionAgentRunStatus.js';import {textTitle}from'./notionRichTitle.js';var __defProp = Object.defineProperty;
|
|
1
|
+
import {newAgentProperties}from'./notionPageKinds.js';import {isAgentRunStatus,AGENT_RUN_STATUSES,RUN_STATUS_OPTION}from'./notionAgentRunStatus.js';import {textTitle,titlePlainText}from'./notionRichTitle.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -142,7 +142,82 @@ function normalizeAgentConfig(raw) {
|
|
|
142
142
|
template: r.template
|
|
143
143
|
} : {});
|
|
144
144
|
}
|
|
145
|
+
function mergeAgentConfig(current, patch) {
|
|
146
|
+
const base = normalizeAgentConfig(current);
|
|
147
|
+
const next = __spreadValues({}, base);
|
|
148
|
+
for (const [k, v] of Object.entries(patch)) {
|
|
149
|
+
if (k === "scope") continue;
|
|
150
|
+
if (v === void 0) delete next[k];
|
|
151
|
+
else next[k] = v;
|
|
152
|
+
}
|
|
153
|
+
if (patch.scope) next.scope = __spreadValues(__spreadValues({}, base.scope), patch.scope);
|
|
154
|
+
return normalizeAgentConfig(next);
|
|
155
|
+
}
|
|
156
|
+
function agentPropertiesPatch(properties, patch) {
|
|
157
|
+
const agent = mergeAgentConfig(properties == null ? void 0 : properties.agent, patch);
|
|
158
|
+
return patch.color ? {
|
|
159
|
+
agent,
|
|
160
|
+
color: patch.color
|
|
161
|
+
} : {
|
|
162
|
+
agent
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function upsertTrigger(list, trigger) {
|
|
166
|
+
const key = triggerKey(trigger);
|
|
167
|
+
const idx = list.findIndex((t) => triggerKey(t) === key);
|
|
168
|
+
if (idx === -1) return [...list, trigger];
|
|
169
|
+
const next = [...list];
|
|
170
|
+
next[idx] = trigger;
|
|
171
|
+
return next;
|
|
172
|
+
}
|
|
173
|
+
function removeTrigger(list, key) {
|
|
174
|
+
if (key === "manual") return [...list];
|
|
175
|
+
return list.filter((t) => triggerKey(t) !== key);
|
|
176
|
+
}
|
|
177
|
+
function toggleConnectorTool(list, connector, label) {
|
|
178
|
+
if (connector === "yantra-notion") return [...list];
|
|
179
|
+
if (list.some((t) => t.connector === connector)) return list.filter((t) => t.connector !== connector);
|
|
180
|
+
return [...list, __spreadValues({
|
|
181
|
+
kind: "connector",
|
|
182
|
+
connector
|
|
183
|
+
}, label ? {
|
|
184
|
+
label
|
|
185
|
+
} : {})];
|
|
186
|
+
}
|
|
187
|
+
function toggleScopeItem(scope, item) {
|
|
188
|
+
var _a;
|
|
189
|
+
const key = item.type === "database" ? "databaseIds" : "pageIds";
|
|
190
|
+
const has = scope[key].includes(item.id);
|
|
191
|
+
const titles = __spreadValues({}, (_a = scope.titles) != null ? _a : {});
|
|
192
|
+
if (has) delete titles[item.id];
|
|
193
|
+
else if (item.title) titles[item.id] = item.title;
|
|
194
|
+
return __spreadProps(__spreadValues({}, scope), {
|
|
195
|
+
[key]: has ? scope[key].filter((id) => id !== item.id) : [...scope[key], item.id],
|
|
196
|
+
titles
|
|
197
|
+
});
|
|
198
|
+
}
|
|
145
199
|
const WEEKDAY_NAMES = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
|
|
200
|
+
const SCHEDULE_FREQUENCIES = [{
|
|
201
|
+
id: "hourly",
|
|
202
|
+
label: "Every hour"
|
|
203
|
+
}, {
|
|
204
|
+
id: "daily",
|
|
205
|
+
label: "Every day"
|
|
206
|
+
}, {
|
|
207
|
+
id: "weekdays",
|
|
208
|
+
label: "Every weekday"
|
|
209
|
+
}, {
|
|
210
|
+
id: "weekly",
|
|
211
|
+
label: "Every week"
|
|
212
|
+
}, {
|
|
213
|
+
id: "monthly",
|
|
214
|
+
label: "Every month"
|
|
215
|
+
}];
|
|
216
|
+
const DEFAULT_SCHEDULE = {
|
|
217
|
+
frequency: "weekdays",
|
|
218
|
+
hour: 9,
|
|
219
|
+
minute: 0
|
|
220
|
+
};
|
|
146
221
|
const MAX_MONTH_DAY = 28;
|
|
147
222
|
const clamp = (n, lo, hi, dflt) => {
|
|
148
223
|
const v = typeof n === "number" && Number.isFinite(n) ? Math.round(n) : dflt;
|
|
@@ -225,7 +300,9 @@ function scheduleTrigger(s, timezone) {
|
|
|
225
300
|
type: "schedule",
|
|
226
301
|
cron: scheduleToCron(s),
|
|
227
302
|
label: scheduleLabel(s)
|
|
228
|
-
}, {
|
|
303
|
+
}, timezone ? {
|
|
304
|
+
timezone
|
|
305
|
+
} : {});
|
|
229
306
|
}
|
|
230
307
|
function triggerLabel(t) {
|
|
231
308
|
switch (t.type) {
|
|
@@ -411,6 +488,67 @@ function templateInstructionBlocks(t) {
|
|
|
411
488
|
}
|
|
412
489
|
}));
|
|
413
490
|
}
|
|
491
|
+
const TEXT_PREFIX = {
|
|
492
|
+
heading_1: () => "# ",
|
|
493
|
+
heading_2: () => "## ",
|
|
494
|
+
heading_3: () => "### ",
|
|
495
|
+
bulleted_list: () => "- ",
|
|
496
|
+
numbered_list: (i) => `${i}. `,
|
|
497
|
+
quote: () => "> ",
|
|
498
|
+
callout: () => "> ",
|
|
499
|
+
toggle: () => "- ",
|
|
500
|
+
paragraph: () => "",
|
|
501
|
+
text: () => ""
|
|
502
|
+
};
|
|
503
|
+
function blocksToInstructions(blocks) {
|
|
504
|
+
var _a, _b, _c;
|
|
505
|
+
const out = [];
|
|
506
|
+
let n = 0;
|
|
507
|
+
for (const b of blocks != null ? blocks : []) {
|
|
508
|
+
if (!b || ((_a = b.properties) == null ? void 0 : _a.hidden) === true) continue;
|
|
509
|
+
const type = String((_b = b.type) != null ? _b : "");
|
|
510
|
+
const text = titlePlainText(b.properties).trim();
|
|
511
|
+
n = type === "numbered_list" ? n + 1 : 0;
|
|
512
|
+
if (type === "todo") {
|
|
513
|
+
if (text) out.push(`- [${((_c = b.properties) == null ? void 0 : _c.checked) ? "x" : " "}] ${text}`);
|
|
514
|
+
continue;
|
|
515
|
+
}
|
|
516
|
+
if (type === "code" && text) {
|
|
517
|
+
out.push("```\n" + text + "\n```");
|
|
518
|
+
continue;
|
|
519
|
+
}
|
|
520
|
+
const prefix = TEXT_PREFIX[type];
|
|
521
|
+
if (!prefix || !text) continue;
|
|
522
|
+
out.push(prefix(n) + text);
|
|
523
|
+
}
|
|
524
|
+
return out.join("\n");
|
|
525
|
+
}
|
|
526
|
+
const AGENT_RUN_MARKER = "[Agent run]";
|
|
527
|
+
function scopeLine(scope) {
|
|
528
|
+
const name = (id) => {
|
|
529
|
+
var _a;
|
|
530
|
+
return ((_a = scope.titles) == null ? void 0 : _a[id]) ? `${id} (\u201C${scope.titles[id]}\u201D)` : id;
|
|
531
|
+
};
|
|
532
|
+
const parts = [];
|
|
533
|
+
if (scope.pageIds.length) parts.push(`pages ${scope.pageIds.map(name).join(", ")}`);
|
|
534
|
+
if (scope.databaseIds.length) parts.push(`databases ${scope.databaseIds.map(name).join(", ")}`);
|
|
535
|
+
if (scope.teamspace) parts.push(`teamspace \u201C${scope.teamspace}\u201D`);
|
|
536
|
+
return parts.length ? parts.join("; ") : "the whole workspace";
|
|
537
|
+
}
|
|
538
|
+
function buildAgentRunPrompt(input) {
|
|
539
|
+
const {
|
|
540
|
+
config
|
|
541
|
+
} = input;
|
|
542
|
+
const tools = config.tools.map((t) => t.kind === "yantra-notion" ? "yantra-notion" : t.connector);
|
|
543
|
+
const lines = [`${AGENT_RUN_MARKER} You are the agent \u201C${input.name || "Untitled agent"}\u201D (agent page ${input.agentId}${input.runId ? `, run ${input.runId}` : ""}).`, `Trigger: ${triggerLabel(input.trigger)}.`, "", "Instructions:", input.instructions.trim() || "(The agent page has no instructions yet \u2014 say so and stop.)", "", `Scope: ${scopeLine(config.scope)}. Only read and change things in scope.`, `Tools: ${tools.join(", ")}. Use the yantra-notion skill for every workspace read and write.`];
|
|
544
|
+
if (config.requireApproval) {
|
|
545
|
+
lines.push("Approval required: do NOT change anything yet. List the exact changes you would make and ask for approval.");
|
|
546
|
+
} else {
|
|
547
|
+
lines.push("Do the task now, without asking questions unless you cannot continue.");
|
|
548
|
+
}
|
|
549
|
+
lines.push("When you are done, reply with a one-paragraph summary of what you did (or found).");
|
|
550
|
+
return lines.join("\n");
|
|
551
|
+
}
|
|
414
552
|
({
|
|
415
553
|
Status: {
|
|
416
554
|
options: AGENT_RUN_STATUSES.map((s) => __spreadValues({}, RUN_STATUS_OPTION[s]))
|
|
@@ -424,6 +562,38 @@ function templateInstructionBlocks(t) {
|
|
|
424
562
|
};
|
|
425
563
|
})
|
|
426
564
|
}});
|
|
565
|
+
const SESSION_URL_PREFIX = "yantra-session:";
|
|
566
|
+
const optName = (v) => {
|
|
567
|
+
var _a;
|
|
568
|
+
return typeof v === "string" ? v : v && typeof v === "object" ? String((_a = v.name) != null ? _a : "") : "";
|
|
569
|
+
};
|
|
570
|
+
function statusFromName(name) {
|
|
571
|
+
const hit = AGENT_RUN_STATUSES.find((s) => RUN_STATUS_OPTION[s].name.toLowerCase() === name.trim().toLowerCase());
|
|
572
|
+
return hit != null ? hit : "queued";
|
|
573
|
+
}
|
|
574
|
+
function parseRunRow(row) {
|
|
575
|
+
var _a, _b;
|
|
576
|
+
if (!(row == null ? void 0 : row.id)) return null;
|
|
577
|
+
const p = (_a = row.properties) != null ? _a : {};
|
|
578
|
+
const started = p.Started;
|
|
579
|
+
const startedRaw = typeof started === "string" ? started : started && typeof started === "object" ? started.start : "";
|
|
580
|
+
const summary = typeof p.Summary === "string" ? p.Summary : titlePlainText({
|
|
581
|
+
title: p.Summary
|
|
582
|
+
});
|
|
583
|
+
const session = typeof p.Session === "string" ? p.Session : "";
|
|
584
|
+
return __spreadValues({
|
|
585
|
+
id: String(row.id),
|
|
586
|
+
status: statusFromName(optName(p.Status)),
|
|
587
|
+
startedAt: Date.parse(startedRaw || "") || Date.parse((_b = row.createdTime) != null ? _b : "") || 0,
|
|
588
|
+
trigger: optName(p.Trigger) || "Manual",
|
|
589
|
+
summary
|
|
590
|
+
}, session.startsWith(SESSION_URL_PREFIX) ? {
|
|
591
|
+
sessionId: session.slice(SESSION_URL_PREFIX.length)
|
|
592
|
+
} : {});
|
|
593
|
+
}
|
|
594
|
+
function latestRuns(rows, limit = 10) {
|
|
595
|
+
return [...rows].sort((a, b) => b.startedAt - a.startedAt).slice(0, limit);
|
|
596
|
+
}
|
|
427
597
|
function templateAgentProperties(id, opts = {}) {
|
|
428
598
|
var _a;
|
|
429
599
|
const t = agentTemplate(id);
|
|
@@ -442,4 +612,4 @@ function templateAgentProperties(id, opts = {}) {
|
|
|
442
612
|
return __spreadProps(__spreadValues({}, base), {
|
|
443
613
|
agent
|
|
444
614
|
});
|
|
445
|
-
}export{AGENT_RUN_STATUSES,AGENT_TEMPLATES,MAX_MONTH_DAY,RUN_STATUS_OPTION,TRIGGER_KIND_LABEL,WEEKDAY_NAMES,YANTRA_NOTION_TOOL,agentTemplate,cronToSchedule,isAgentTemplateId,normalizeAgentConfig,scheduleLabel,scheduleToCron,scheduleTrigger,templateAgentProperties,templateInstructionBlocks,triggerKey,triggerLabel};//# sourceMappingURL=notionNotesAgent.js.map
|
|
615
|
+
}export{AGENT_RUN_MARKER,AGENT_RUN_STATUSES,AGENT_TEMPLATES,DEFAULT_SCHEDULE,MAX_MONTH_DAY,RUN_STATUS_OPTION,SCHEDULE_FREQUENCIES,SESSION_URL_PREFIX,TRIGGER_KIND_LABEL,WEEKDAY_NAMES,YANTRA_NOTION_TOOL,agentPropertiesPatch,agentTemplate,blocksToInstructions,buildAgentRunPrompt,cronToSchedule,isAgentTemplateId,latestRuns,mergeAgentConfig,normalizeAgentConfig,parseRunRow,removeTrigger,scheduleLabel,scheduleToCron,scheduleTrigger,templateAgentProperties,templateInstructionBlocks,toggleConnectorTool,toggleScopeItem,triggerKey,triggerLabel,upsertTrigger};//# sourceMappingURL=notionNotesAgent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notionNotesAgent.js","sources":["../../../src/features/notion/notionNotesAgent.ts"],"sourcesContent":["// Ported from forms-stack packages/notion-api/browser/src/utils/notesAgent.ts (develop); import paths changed and\n// the database schema type (web utils/databaseView) inlined as a local type.\n/* eslint-disable */\n/**\n * notesAgent — pure helpers for agent pages (PLAN §4). An agent is a page with\n * `properties.kind === 'agent'`; its configuration lives in `properties.agent` (this file's\n * {@link NotesAgent}) and its page body is the instructions.\n *\n * - config: normalise whatever is stored, merge patches, trigger / tool / scope edits;\n * - schedule: a friendly picker value ⇄ a 5-field cron + label (\"Every weekday at 9:00\");\n * - templates: Blank, Project Updater, Task Router, IT Answer Bot;\n * - runs: the prompt sent for \"Run now\", the reply → status + summary, and the hidden Runs\n * database (schema, row properties, row parsing).\n *\n * Framework-free (tested in notesAgent.test.ts). The GraphQL side is components/api/agentRuns.ts,\n * the UI components/AgentPageHeader.tsx.\n */\nimport { HIDDEN_FLAG, isHiddenBlock, newAgentProperties } from './notionPageKinds';\nimport {\n AGENT_RUN_STATUSES,\n RUN_STATUS_OPTION,\n effectiveRunStatus,\n isAgentRunStatus,\n type AgentRunStatus,\n} from './notionAgentRunStatus';\nimport { textTitle, titlePlainText } from './notionRichTitle';\ntype DatabaseSchema = Record<\n string,\n { type: string; name?: string; options?: Array<Record<string, unknown>>; [k: string]: unknown }\n>;\n\n// Run statuses and the hidden-block flag have one home each (utils/agentRunStatus, utils/pageKinds).\nexport type { AgentRunStatus };\nexport { AGENT_RUN_STATUSES, RUN_STATUS_OPTION, HIDDEN_FLAG, isHiddenBlock };\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport type AgentTrigger =\n | { type: 'manual' }\n | { type: 'schedule'; cron: string; timezone?: string; label?: string }\n | {\n type: 'database_row';\n databaseId: string;\n on: 'created' | 'updated';\n where?: Record<string, unknown>;\n /** Display only (the database's title when it was picked). */\n databaseTitle?: string;\n }\n | { type: 'comment_mention' }\n | { type: 'meeting_ended' };\n\nexport type AgentTriggerType = AgentTrigger['type'];\n\nexport interface AgentTool {\n kind: 'yantra-notion' | 'connector';\n connector: string;\n actions?: string[];\n /** Display only (catalogue label when it was picked). */\n label?: string;\n}\n\nexport interface AgentScope {\n pageIds: string[];\n databaseIds: string[];\n teamspace?: string;\n /** Display only: titles of the picked pages / databases, by id. */\n titles?: Record<string, string>;\n}\n\nexport interface AgentLastRun {\n runId: string;\n at: string;\n status: AgentRunStatus;\n summary?: string;\n sessionId?: string;\n}\n\n/** `page.properties.agent` (PLAN §4 `NotesAgent`, plus where the Runs database lives). */\nexport interface NotesAgent {\n version: 1;\n enabled: boolean;\n color?: string;\n triggers: AgentTrigger[];\n tools: AgentTool[];\n scope: AgentScope;\n model?: string;\n requireApproval?: boolean;\n lastRun?: AgentLastRun;\n /** The hidden Runs database (child of the agent page), created on the first run. */\n runsDatabaseId?: string;\n /** The template the agent was created from (informational). */\n template?: AgentTemplateId;\n}\n\nexport const YANTRA_NOTION_TOOL: AgentTool = { kind: 'yantra-notion', connector: 'yantra-notion' };\n\n// ============================================================================\n// CONFIG\n// ============================================================================\n\nconst str = (v: unknown): string | undefined => (typeof v === 'string' && v.trim() ? v.trim() : undefined);\nconst strList = (v: unknown): string[] =>\n Array.isArray(v) ? [...new Set(v.filter((x): x is string => typeof x === 'string' && !!x.trim()))] : [];\n\nfunction normalizeTrigger(raw: unknown): AgentTrigger | null {\n if (!raw || typeof raw !== 'object') return null;\n const r = raw as Record<string, unknown>;\n switch (r.type) {\n case 'manual':\n return { type: 'manual' };\n case 'schedule': {\n const cron = str(r.cron);\n if (!cron) return null;\n return {\n type: 'schedule',\n cron,\n ...(str(r.timezone) ? { timezone: str(r.timezone) } : {}),\n ...(str(r.label) ? { label: str(r.label) } : {}),\n };\n }\n case 'database_row': {\n const databaseId = str(r.databaseId);\n if (!databaseId) return null;\n return {\n type: 'database_row',\n databaseId,\n on: r.on === 'updated' ? 'updated' : 'created',\n ...(r.where && typeof r.where === 'object' ? { where: r.where as Record<string, unknown> } : {}),\n ...(str(r.databaseTitle) ? { databaseTitle: str(r.databaseTitle) } : {}),\n };\n }\n case 'comment_mention':\n return { type: 'comment_mention' };\n case 'meeting_ended':\n return { type: 'meeting_ended' };\n default:\n return null;\n }\n}\n\n/** Key that makes two triggers \"the same slot\" (one schedule, one per database + event, …). */\nexport function triggerKey(t: AgentTrigger): string {\n return t.type === 'database_row' ? `database_row:${t.databaseId}:${t.on}` : t.type;\n}\n\n/** Whatever is stored → a complete config (manual trigger and yantra-notion tool always present). */\nexport function normalizeAgentConfig(raw: unknown): NotesAgent {\n const r = (raw && typeof raw === 'object' ? raw : {}) as Record<string, unknown>;\n const triggers: AgentTrigger[] = [{ type: 'manual' }];\n const seen = new Set(['manual']);\n for (const t of Array.isArray(r.triggers) ? r.triggers : []) {\n const n = normalizeTrigger(t);\n if (!n || seen.has(triggerKey(n))) continue;\n seen.add(triggerKey(n));\n triggers.push(n);\n }\n const tools: AgentTool[] = [{ ...YANTRA_NOTION_TOOL }];\n const toolSeen = new Set(['yantra-notion']);\n for (const t of Array.isArray(r.tools) ? r.tools : []) {\n if (!t || typeof t !== 'object') continue;\n const tt = t as Record<string, unknown>;\n const connector = str(tt.connector);\n if (!connector || toolSeen.has(connector) || tt.kind === 'yantra-notion') continue;\n toolSeen.add(connector);\n tools.push({\n kind: 'connector',\n connector,\n ...(Array.isArray(tt.actions) ? { actions: strList(tt.actions) } : {}),\n ...(str(tt.label) ? { label: str(tt.label) } : {}),\n });\n }\n const s = (r.scope && typeof r.scope === 'object' ? r.scope : {}) as Record<string, unknown>;\n const titles =\n s.titles && typeof s.titles === 'object'\n ? Object.fromEntries(\n Object.entries(s.titles as Record<string, unknown>).filter(\n (e): e is [string, string] => typeof e[1] === 'string',\n ),\n )\n : undefined;\n const scope: AgentScope = {\n pageIds: strList(s.pageIds),\n databaseIds: strList(s.databaseIds),\n ...(str(s.teamspace) ? { teamspace: str(s.teamspace) } : {}),\n ...(titles && Object.keys(titles).length ? { titles } : {}),\n };\n const lr = r.lastRun as Record<string, unknown> | undefined;\n const lastRun: AgentLastRun | undefined =\n lr && typeof lr === 'object' && isAgentRunStatus(lr.status)\n ? {\n runId: str(lr.runId) ?? '',\n at: str(lr.at) ?? '',\n status: lr.status as AgentRunStatus,\n ...(str(lr.summary) ? { summary: str(lr.summary) } : {}),\n ...(str(lr.sessionId) ? { sessionId: str(lr.sessionId) } : {}),\n }\n : undefined;\n return {\n version: 1,\n enabled: r.enabled === true,\n ...(str(r.color) ? { color: str(r.color) } : {}),\n triggers,\n tools,\n scope,\n ...(str(r.model) ? { model: str(r.model) } : {}),\n ...(typeof r.requireApproval === 'boolean' ? { requireApproval: r.requireApproval } : {}),\n ...(lastRun ? { lastRun } : {}),\n ...(str(r.runsDatabaseId) ? { runsDatabaseId: str(r.runsDatabaseId) } : {}),\n ...(isAgentTemplateId(r.template) ? { template: r.template } : {}),\n };\n}\n\nexport type AgentConfigPatch = Partial<Omit<NotesAgent, 'version' | 'scope'>> & { scope?: Partial<AgentScope> };\n\n/**\n * Merge a patch into the stored config. `updateBlock` merges `properties` shallowly, so the\n * WHOLE `agent` object is written each time — this computes it. `undefined` values remove a key\n * (e.g. `{ model: undefined }` clears the model).\n */\nexport function mergeAgentConfig(current: unknown, patch: AgentConfigPatch): NotesAgent {\n const base = normalizeAgentConfig(current);\n const next: Record<string, unknown> = { ...base };\n for (const [k, v] of Object.entries(patch)) {\n if (k === 'scope') continue;\n if (v === undefined) delete next[k];\n else next[k] = v;\n }\n if (patch.scope) next.scope = { ...base.scope, ...patch.scope };\n return normalizeAgentConfig(next);\n}\n\n/**\n * The `properties` patch for `updateBlock`: the merged `agent`, plus the page-level `color`\n * (the sidebar reads `properties.color` first) when the colour changes.\n */\nexport function agentPropertiesPatch(\n properties: Record<string, unknown> | null | undefined,\n patch: AgentConfigPatch,\n): { agent: NotesAgent; color?: string } {\n const agent = mergeAgentConfig(properties?.agent, patch);\n return patch.color ? { agent, color: patch.color } : { agent };\n}\n\n/** Put a trigger in its slot (replacing the same slot). `manual` is always kept. */\nexport function upsertTrigger(list: readonly AgentTrigger[], trigger: AgentTrigger): AgentTrigger[] {\n const key = triggerKey(trigger);\n const idx = list.findIndex((t) => triggerKey(t) === key);\n if (idx === -1) return [...list, trigger];\n const next = [...list];\n next[idx] = trigger;\n return next;\n}\n\n/** Remove a trigger by slot key (`manual` can't be removed). */\nexport function removeTrigger(list: readonly AgentTrigger[], key: string): AgentTrigger[] {\n if (key === 'manual') return [...list];\n return list.filter((t) => triggerKey(t) !== key);\n}\n\n/** Add / remove a connector tool (yantra-notion is always on). */\nexport function toggleConnectorTool(list: readonly AgentTool[], connector: string, label?: string): AgentTool[] {\n if (connector === 'yantra-notion') return [...list];\n if (list.some((t) => t.connector === connector)) return list.filter((t) => t.connector !== connector);\n return [...list, { kind: 'connector', connector, ...(label ? { label } : {}) }];\n}\n\n/** Add / remove a page or database from the scope (titles kept for display). */\nexport function toggleScopeItem(\n scope: AgentScope,\n item: { id: string; type: 'page' | 'database'; title?: string },\n): AgentScope {\n const key = item.type === 'database' ? 'databaseIds' : 'pageIds';\n const has = scope[key].includes(item.id);\n const titles = { ...(scope.titles ?? {}) };\n if (has) delete titles[item.id];\n else if (item.title) titles[item.id] = item.title;\n return {\n ...scope,\n [key]: has ? scope[key].filter((id) => id !== item.id) : [...scope[key], item.id],\n titles,\n };\n}\n\n// ============================================================================\n// SCHEDULE (friendly picker ⇄ cron)\n// ============================================================================\n\nexport type ScheduleFrequency = 'hourly' | 'daily' | 'weekdays' | 'weekly' | 'monthly';\n\nexport interface FriendlySchedule {\n frequency: ScheduleFrequency;\n /** 0–23 (ignored for hourly). */\n hour: number;\n /** 0–59. */\n minute: number;\n /** 0 = Sunday … 6 = Saturday (weekly). */\n weekday?: number;\n /** 1–{@link MAX_MONTH_DAY} (monthly). */\n dayOfMonth?: number;\n}\n\nexport const WEEKDAY_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const SCHEDULE_FREQUENCIES: Array<{ id: ScheduleFrequency; label: string }> = [\n { id: 'hourly', label: 'Every hour' },\n { id: 'daily', label: 'Every day' },\n { id: 'weekdays', label: 'Every weekday' },\n { id: 'weekly', label: 'Every week' },\n { id: 'monthly', label: 'Every month' },\n];\n\nexport const DEFAULT_SCHEDULE: FriendlySchedule = { frequency: 'weekdays', hour: 9, minute: 0 };\n\n/**\n * Last day of month the picker offers (every month has it). A cron on day 29–31 — which standard\n * cron skips in shorter months — is not picker-representable: cronToSchedule returns null, so it\n * stays a raw cron (labelled as such) and is never silently rewritten.\n */\nexport const MAX_MONTH_DAY = 28;\n\nconst clamp = (n: unknown, lo: number, hi: number, dflt: number) => {\n const v = typeof n === 'number' && Number.isFinite(n) ? Math.round(n) : dflt;\n return Math.min(hi, Math.max(lo, v));\n};\n\nexport function scheduleToCron(s: FriendlySchedule): string {\n const m = clamp(s.minute, 0, 59, 0);\n const h = clamp(s.hour, 0, 23, 9);\n switch (s.frequency) {\n case 'hourly':\n return `${m} * * * *`;\n case 'daily':\n return `${m} ${h} * * *`;\n case 'weekdays':\n return `${m} ${h} * * 1-5`;\n case 'weekly':\n return `${m} ${h} * * ${clamp(s.weekday, 0, 6, 1)}`;\n case 'monthly':\n return `${m} ${h} ${clamp(s.dayOfMonth, 1, MAX_MONTH_DAY, 1)} * *`;\n }\n}\n\nconst INT = /^\\d{1,2}$/;\n\n/** A cron the picker can show, or null (anything else is kept as a raw cron). */\nexport function cronToSchedule(cron: string): FriendlySchedule | null {\n const parts = cron.trim().split(/\\s+/);\n if (parts.length !== 5) return null;\n const [mi, ho, dom, mon, dow] = parts;\n if (!INT.test(mi) || Number(mi) > 59 || mon !== '*') return null;\n const minute = Number(mi);\n if (ho === '*' && dom === '*' && dow === '*') return { frequency: 'hourly', hour: 0, minute };\n if (!INT.test(ho) || Number(ho) > 23) return null;\n const hour = Number(ho);\n if (dom === '*' && dow === '*') return { frequency: 'daily', hour, minute };\n if (dom === '*' && dow === '1-5') return { frequency: 'weekdays', hour, minute };\n if (dom === '*' && /^[0-7]$/.test(dow)) return { frequency: 'weekly', hour, minute, weekday: Number(dow) % 7 };\n if (dow === '*' && INT.test(dom) && Number(dom) >= 1 && Number(dom) <= MAX_MONTH_DAY) {\n return { frequency: 'monthly', hour, minute, dayOfMonth: Number(dom) };\n }\n return null;\n}\n\nconst pad2 = (n: number) => String(n).padStart(2, '0');\n\n/** \"Every weekday at 9:00\", \"Every Monday at 14:30\", \"Every hour at :15\", \"Monthly on day 1 at 9:00\". */\nexport function scheduleLabel(s: FriendlySchedule): string {\n const time = `${clamp(s.hour, 0, 23, 9)}:${pad2(clamp(s.minute, 0, 59, 0))}`;\n switch (s.frequency) {\n case 'hourly':\n return s.minute ? `Every hour at :${pad2(clamp(s.minute, 0, 59, 0))}` : 'Every hour';\n case 'daily':\n return `Every day at ${time}`;\n case 'weekdays':\n return `Every weekday at ${time}`;\n case 'weekly':\n return `Every ${WEEKDAY_NAMES[clamp(s.weekday, 0, 6, 1)]} at ${time}`;\n case 'monthly':\n return `Monthly on day ${clamp(s.dayOfMonth, 1, MAX_MONTH_DAY, 1)} at ${time}`;\n }\n}\n\n/** A schedule trigger from the picker value. */\nexport function scheduleTrigger(s: FriendlySchedule, timezone?: string): Extract<AgentTrigger, { type: 'schedule' }> {\n return {\n type: 'schedule',\n cron: scheduleToCron(s),\n label: scheduleLabel(s),\n ...(timezone ? { timezone } : {}),\n };\n}\n\n/** One line per trigger, for chips and the runs log. */\nexport function triggerLabel(t: AgentTrigger): string {\n switch (t.type) {\n case 'manual':\n return 'Manual';\n case 'schedule': {\n const friendly = cronToSchedule(t.cron);\n return t.label || (friendly ? scheduleLabel(friendly) : `Cron ${t.cron}`);\n }\n case 'database_row':\n return `When a row is ${t.on} in ${t.databaseTitle ? `“${t.databaseTitle}”` : 'a database'}`;\n case 'comment_mention':\n return 'When @mentioned in a comment';\n case 'meeting_ended':\n return 'When a meeting ends';\n }\n}\n\n/** The Runs database's Trigger select value. */\nexport const TRIGGER_KIND_LABEL: Record<AgentTriggerType, string> = {\n manual: 'Manual',\n schedule: 'Schedule',\n database_row: 'Database row',\n comment_mention: 'Comment',\n meeting_ended: 'Meeting ended',\n};\n\n// ============================================================================\n// TEMPLATES\n// ============================================================================\n\nexport type AgentTemplateId = 'blank' | 'project-updater' | 'task-router' | 'it-answer-bot';\n\nexport interface AgentInstructionLine {\n type: 'heading_2' | 'paragraph' | 'bulleted_list' | 'numbered_list';\n text: string;\n}\n\nexport interface AgentTemplate {\n id: AgentTemplateId;\n name: string;\n description: string;\n color: string;\n instructions: AgentInstructionLine[];\n triggers: AgentTrigger[];\n tools: AgentTool[];\n /** Shown on the template card (\"needs comments\"). */\n note?: string;\n}\n\nexport const AGENT_TEMPLATES: readonly AgentTemplate[] = [\n {\n id: 'blank',\n name: 'Blank agent',\n description: 'Start from scratch: write what it should do in the page.',\n color: 'gray',\n instructions: [\n { type: 'heading_2', text: 'Instructions' },\n {\n type: 'paragraph',\n text: 'Describe the job in plain words. The agent reads this page every time it runs.',\n },\n ],\n triggers: [{ type: 'manual' }],\n tools: [{ ...YANTRA_NOTION_TOOL }],\n },\n {\n id: 'project-updater',\n name: 'Project Updater',\n description: 'Reads what changed in your projects and posts a weekly update page.',\n color: 'blue',\n instructions: [\n { type: 'heading_2', text: 'Goal' },\n {\n type: 'paragraph',\n text: 'Keep the team up to date without anyone writing a status report by hand.',\n },\n { type: 'heading_2', text: 'Steps' },\n {\n type: 'numbered_list',\n text: 'Look at the pages and databases in scope that changed in the last 7 days.',\n },\n {\n type: 'numbered_list',\n text: 'Group the changes by project: shipped, in progress, blocked, and what is due next week.',\n },\n {\n type: 'numbered_list',\n text: 'Create a new page titled “Update — <today’s date>” with a short summary and a bulleted list per group.',\n },\n { type: 'numbered_list', text: 'Link every item back to its page or row.' },\n { type: 'heading_2', text: 'Style' },\n { type: 'bulleted_list', text: 'Short, factual bullets. No filler.' },\n { type: 'bulleted_list', text: 'Call out anything overdue or blocked first.' },\n ],\n triggers: [{ type: 'manual' }, scheduleTrigger({ frequency: 'weekly', hour: 9, minute: 0, weekday: 5 })],\n tools: [{ ...YANTRA_NOTION_TOOL }],\n },\n {\n id: 'task-router',\n name: 'Task Router',\n description: 'Finds unassigned tasks and sets an owner and a priority.',\n color: 'orange',\n instructions: [\n { type: 'heading_2', text: 'Goal' },\n { type: 'paragraph', text: 'No task sits in the tracker without an owner or a priority.' },\n { type: 'heading_2', text: 'Steps' },\n { type: 'numbered_list', text: 'Query the task databases in scope for rows with no “Assigned to”.' },\n {\n type: 'numbered_list',\n text: 'Pick the owner from who already works on similar tasks; spread the load evenly.',\n },\n {\n type: 'numbered_list',\n text: 'Set Priority from the due date and wording: Urgent (due in 2 days or “outage”), High, Medium, Low.',\n },\n { type: 'numbered_list', text: 'Reply with the rows you changed and why.' },\n { type: 'heading_2', text: 'Rules' },\n { type: 'bulleted_list', text: 'Never change a row that already has an owner.' },\n { type: 'bulleted_list', text: 'If you are unsure, leave the row and list it in the summary.' },\n ],\n triggers: [{ type: 'manual' }, scheduleTrigger({ frequency: 'weekdays', hour: 9, minute: 0 })],\n tools: [{ ...YANTRA_NOTION_TOOL }],\n },\n {\n id: 'it-answer-bot',\n name: 'IT Answer Bot',\n description: 'Answers IT questions in comment threads from your IT docs.',\n color: 'purple',\n note: 'Replies in comment threads when comments are available.',\n instructions: [\n { type: 'heading_2', text: 'Goal' },\n {\n type: 'paragraph',\n text: 'Answer IT questions (laptops, accounts, VPN, access requests) where people ask them.',\n },\n { type: 'heading_2', text: 'Steps' },\n { type: 'numbered_list', text: 'Read the comment that mentioned you and the page it is on.' },\n { type: 'numbered_list', text: 'Search the IT pages in scope for the answer.' },\n {\n type: 'numbered_list',\n text: 'Reply in the same thread with a short answer and a link to the source page.',\n },\n { type: 'heading_2', text: 'Rules' },\n { type: 'bulleted_list', text: 'If the docs don’t cover it, say so and suggest who to ask.' },\n { type: 'bulleted_list', text: 'Never share passwords or secrets.' },\n ],\n triggers: [{ type: 'manual' }, { type: 'comment_mention' }],\n tools: [{ ...YANTRA_NOTION_TOOL }],\n },\n];\n\nexport function isAgentTemplateId(v: unknown): v is AgentTemplateId {\n return typeof v === 'string' && AGENT_TEMPLATES.some((t) => t.id === v);\n}\n\nexport function agentTemplate(id: AgentTemplateId | null | undefined): AgentTemplate {\n return AGENT_TEMPLATES.find((t) => t.id === id) ?? AGENT_TEMPLATES[0];\n}\n\n/** The template's instructions as page blocks (appendChildren input). */\nexport function templateInstructionBlocks(\n t: AgentTemplate,\n): Array<{ type: string; properties: Record<string, unknown> }> {\n return t.instructions.map((l) => ({ type: l.type, properties: { title: textTitle(l.text) } }));\n}\n\n// ============================================================================\n// INSTRUCTIONS (page blocks → text)\n// ============================================================================\n\nexport interface InstructionBlock {\n id?: string;\n type?: string;\n properties?: Record<string, unknown> | null;\n}\n\nconst TEXT_PREFIX: Record<string, (i: number) => string> = {\n heading_1: () => '# ',\n heading_2: () => '## ',\n heading_3: () => '### ',\n bulleted_list: () => '- ',\n numbered_list: (i) => `${i}. `,\n quote: () => '> ',\n callout: () => '> ',\n toggle: () => '- ',\n paragraph: () => '',\n text: () => '',\n};\n\n/** The page body (top-level blocks) as markdown-ish text: what the agent is told to do. */\nexport function blocksToInstructions(blocks: readonly InstructionBlock[] | null | undefined): string {\n const out: string[] = [];\n let n = 0;\n for (const b of blocks ?? []) {\n if (!b || b.properties?.hidden === true) continue;\n const type = String(b.type ?? '');\n const text = titlePlainText(b.properties).trim();\n n = type === 'numbered_list' ? n + 1 : 0;\n if (type === 'todo') {\n if (text) out.push(`- [${b.properties?.checked ? 'x' : ' '}] ${text}`);\n continue;\n }\n if (type === 'code' && text) {\n out.push('```\\n' + text + '\\n```');\n continue;\n }\n const prefix = TEXT_PREFIX[type];\n if (!prefix || !text) continue;\n out.push(prefix(n) + text);\n }\n return out.join('\\n');\n}\n\n// ============================================================================\n// RUN PROMPT + RESULT\n// ============================================================================\n\n/** Marks a chat turn as an agent run (the mock agent and transcripts key off it). */\nexport const AGENT_RUN_MARKER = '[Agent run]';\n\n/** What the browser hands the runner (context/NotesAgentRunnerContext). */\nexport interface AgentRunInput {\n agentId: string;\n workspaceId?: string | null;\n name: string;\n /** The page body as text (blocksToInstructions). */\n instructions: string;\n config: NotesAgent;\n trigger: AgentTrigger;\n /** The run row id in the Runs database (when logging worked). */\n runId?: string;\n}\n\nexport interface AgentRunResult {\n status: Exclude<AgentRunStatus, 'queued' | 'running'>;\n summary: string;\n sessionId?: string;\n}\n\nfunction scopeLine(scope: AgentScope): string {\n const name = (id: string) => (scope.titles?.[id] ? `${id} (“${scope.titles[id]}”)` : id);\n const parts: string[] = [];\n if (scope.pageIds.length) parts.push(`pages ${scope.pageIds.map(name).join(', ')}`);\n if (scope.databaseIds.length) parts.push(`databases ${scope.databaseIds.map(name).join(', ')}`);\n if (scope.teamspace) parts.push(`teamspace “${scope.teamspace}”`);\n return parts.length ? parts.join('; ') : 'the whole workspace';\n}\n\n/** The structured prompt for one run (sent as the first turn of a NEW chat session). */\nexport function buildAgentRunPrompt(input: AgentRunInput): string {\n const { config } = input;\n const tools = config.tools.map((t) => (t.kind === 'yantra-notion' ? 'yantra-notion' : t.connector));\n const lines = [\n `${AGENT_RUN_MARKER} You are the agent “${input.name || 'Untitled agent'}” (agent page ${input.agentId}${\n input.runId ? `, run ${input.runId}` : ''\n }).`,\n `Trigger: ${triggerLabel(input.trigger)}.`,\n '',\n 'Instructions:',\n input.instructions.trim() || '(The agent page has no instructions yet — say so and stop.)',\n '',\n `Scope: ${scopeLine(config.scope)}. Only read and change things in scope.`,\n `Tools: ${tools.join(', ')}. Use the yantra-notion skill for every workspace read and write.`,\n ];\n if (config.requireApproval) {\n lines.push(\n 'Approval required: do NOT change anything yet. List the exact changes you would make and ask for approval.',\n );\n } else {\n lines.push('Do the task now, without asking questions unless you cannot continue.');\n }\n lines.push('When you are done, reply with a one-paragraph summary of what you did (or found).');\n return lines.join('\\n');\n}\n\nconst MARKER_BLOCK = /\\[([A-Z_]+)\\][\\s\\S]*?\\[\\/\\1\\]/g;\n\n/** The agent's reply → run status + a short summary for the log. */\nexport function classifyRunReply(\n text: string | null | undefined,\n opts: { requireApproval?: boolean } = {},\n): AgentRunResult {\n const raw = (text ?? '').trim();\n if (!raw) return { status: 'failed', summary: 'The agent did not reply.' };\n const asks = /\\[(CDECLI_ASK_USER_QUESTION|CONNECTOR_CONNECT|FORM_REQUEST)\\]/.test(raw);\n const plain = raw\n .replace(MARKER_BLOCK, ' ')\n .replace(/[ \\t]+\\n/g, '\\n')\n .trim();\n const paras = plain\n .split(/\\n\\s*\\n/)\n .map((p) =>\n p\n .replace(/[#*_`>]+/g, '')\n .replace(/\\s+/g, ' ')\n .trim(),\n )\n .filter(Boolean);\n // The prompt asks for the summary LAST (agents often narrate first): the last real paragraph,\n // else the first one.\n const para = [...paras].reverse().find((p) => p.length >= 30 && !/^[-•\\d]/.test(p)) ?? paras[0] ?? '';\n const summary = (para.length > 280 ? `${para.slice(0, 279)}…` : para) || 'The agent needs input.';\n if (asks) return { status: 'needs_input', summary };\n if (opts.requireApproval && /\\b(approve|approval|confirm)\\b/i.test(plain))\n return { status: 'needs_input', summary };\n return { status: 'succeeded', summary };\n}\n\n// ============================================================================\n// RUNS DATABASE (hidden child of the agent page)\n// ============================================================================\n\nexport const RUNS_DATABASE_SCHEMA: DatabaseSchema = {\n title: { type: 'title' },\n Status: {\n type: 'status',\n options: AGENT_RUN_STATUSES.map((s) => ({ ...RUN_STATUS_OPTION[s] })) as DatabaseSchema[string]['options'],\n },\n Started: { type: 'date' },\n Trigger: {\n type: 'select',\n options: (Object.keys(TRIGGER_KIND_LABEL) as AgentTriggerType[]).map((k, i) => ({\n name: TRIGGER_KIND_LABEL[k],\n color: ['gray', 'blue', 'purple', 'orange', 'green'][i] ?? 'gray',\n })),\n },\n Summary: { type: 'text' },\n Session: { type: 'url' },\n};\n\nexport function runsDatabaseProperties(agentId: string, agentName: string): Record<string, unknown> {\n return {\n title: textTitle(`Runs — ${agentName || 'Agent'}`),\n icon: { type: 'emoji', emoji: '🧾' },\n schema: RUNS_DATABASE_SCHEMA,\n [HIDDEN_FLAG]: true,\n agentRunsOf: agentId,\n };\n}\n\n/** `yantra-session:<id>` — what the Session url cell stores (the runner can reopen it). */\nexport const SESSION_URL_PREFIX = 'yantra-session:';\n\nexport function sessionUrl(sessionId: string | undefined): string {\n return sessionId ? `${SESSION_URL_PREFIX}${sessionId}` : '';\n}\n\nexport function runRowTitle(at: Date): string {\n const d = at.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n const t = at.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });\n return `Run — ${d}, ${t}`;\n}\n\n/** Properties of a new run row (written when the run starts). */\nexport function runRowProperties(opts: { at: Date; trigger: AgentTrigger; status?: AgentRunStatus }) {\n return {\n title: textTitle(runRowTitle(opts.at)),\n Status: { name: RUN_STATUS_OPTION[opts.status ?? 'running'].name },\n Started: opts.at.toISOString(),\n Trigger: { name: TRIGGER_KIND_LABEL[opts.trigger.type] },\n Summary: '',\n Session: '',\n };\n}\n\n/** The patch written when the run finishes. */\nexport function runRowFinishPatch(result: AgentRunResult) {\n return {\n Status: { name: RUN_STATUS_OPTION[result.status].name },\n Summary: result.summary,\n Session: sessionUrl(result.sessionId),\n };\n}\n\nexport interface AgentRunRow {\n id: string;\n status: AgentRunStatus;\n /** ms since epoch (0 when unknown). */\n startedAt: number;\n trigger: string;\n summary: string;\n sessionId?: string;\n}\n\nconst optName = (v: unknown): string =>\n typeof v === 'string' ? v : v && typeof v === 'object' ? String((v as { name?: unknown }).name ?? '') : '';\n\nfunction statusFromName(name: string): AgentRunStatus {\n const hit = AGENT_RUN_STATUSES.find((s) => RUN_STATUS_OPTION[s].name.toLowerCase() === name.trim().toLowerCase());\n return hit ?? 'queued';\n}\n\n/** A Runs database row → what the runs list shows. */\nexport function parseRunRow(row: {\n id?: unknown;\n properties?: Record<string, unknown> | null;\n createdTime?: string | null;\n}): AgentRunRow | null {\n if (!row?.id) return null;\n const p = row.properties ?? {};\n const started = p.Started;\n const startedRaw =\n typeof started === 'string' ? started : started && typeof started === 'object' ? (started as any).start : '';\n const summary = typeof p.Summary === 'string' ? p.Summary : titlePlainText({ title: p.Summary });\n const session = typeof p.Session === 'string' ? p.Session : '';\n return {\n id: String(row.id),\n status: statusFromName(optName(p.Status)),\n startedAt: Date.parse(startedRaw || '') || Date.parse(row.createdTime ?? '') || 0,\n trigger: optName(p.Trigger) || 'Manual',\n summary,\n ...(session.startsWith(SESSION_URL_PREFIX) ? { sessionId: session.slice(SESSION_URL_PREFIX.length) } : {}),\n };\n}\n\n/** Newest first, capped. */\nexport function latestRuns(rows: readonly AgentRunRow[], limit = 10): AgentRunRow[] {\n return [...rows].sort((a, b) => b.startedAt - a.startedAt).slice(0, limit);\n}\n\n// ============================================================================\n// NEW AGENT FROM A TEMPLATE\n// ============================================================================\n\n/** Properties of a new agent page made from a template (kind 'agent' + a full `agent` config). */\nexport function templateAgentProperties(\n id: AgentTemplateId | null | undefined,\n opts: { teamspace?: string | null } = {},\n) {\n const t = agentTemplate(id);\n const blank = t.id === 'blank';\n const base = newAgentProperties({\n ...(blank ? {} : { name: t.name, color: t.color }),\n teamspace: opts.teamspace ?? null,\n });\n const agent = normalizeAgentConfig({\n ...base.agent,\n triggers: t.triggers,\n tools: t.tools,\n template: t.id,\n });\n return { ...base, agent };\n}\n\n/** The sidebar dot: the last run's EFFECTIVE status (utils/agentRunStatus: a stale \"running\" is failed). */\nexport function agentRunStatusOf(\n properties: Record<string, unknown> | null | undefined,\n now: number = Date.now(),\n): AgentRunStatus | undefined {\n const lr = (properties?.agent as { lastRun?: { status?: unknown; at?: unknown } } | undefined)?.lastRun;\n if (!lr || !isAgentRunStatus(lr.status)) return undefined;\n return effectiveRunStatus(lr.status, typeof lr.at === 'string' ? lr.at : undefined, now);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"notionNotesAgent.js","sources":["../../../src/features/notion/notionNotesAgent.ts"],"sourcesContent":["// Ported from forms-stack packages/notion-api/browser/src/utils/notesAgent.ts (develop); import paths changed and\n// the database schema type (web utils/databaseView) inlined as a local type.\n/* eslint-disable */\n/**\n * notesAgent — pure helpers for agent pages (PLAN §4). An agent is a page with\n * `properties.kind === 'agent'`; its configuration lives in `properties.agent` (this file's\n * {@link NotesAgent}) and its page body is the instructions.\n *\n * - config: normalise whatever is stored, merge patches, trigger / tool / scope edits;\n * - schedule: a friendly picker value ⇄ a 5-field cron + label (\"Every weekday at 9:00\");\n * - templates: Blank, Project Updater, Task Router, IT Answer Bot;\n * - runs: the prompt sent for \"Run now\", the reply → status + summary, and the hidden Runs\n * database (schema, row properties, row parsing).\n *\n * Framework-free (tested in notesAgent.test.ts). The GraphQL side is components/api/agentRuns.ts,\n * the UI components/AgentPageHeader.tsx.\n */\nimport { HIDDEN_FLAG, isHiddenBlock, newAgentProperties } from './notionPageKinds';\nimport {\n AGENT_RUN_STATUSES,\n RUN_STATUS_OPTION,\n effectiveRunStatus,\n isAgentRunStatus,\n type AgentRunStatus,\n} from './notionAgentRunStatus';\nimport { textTitle, titlePlainText } from './notionRichTitle';\ntype DatabaseSchema = Record<\n string,\n { type: string; name?: string; options?: Array<Record<string, unknown>>; [k: string]: unknown }\n>;\n\n// Run statuses and the hidden-block flag have one home each (utils/agentRunStatus, utils/pageKinds).\nexport type { AgentRunStatus };\nexport { AGENT_RUN_STATUSES, RUN_STATUS_OPTION, HIDDEN_FLAG, isHiddenBlock };\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport type AgentTrigger =\n | { type: 'manual' }\n | { type: 'schedule'; cron: string; timezone?: string; label?: string }\n | {\n type: 'database_row';\n databaseId: string;\n on: 'created' | 'updated';\n where?: Record<string, unknown>;\n /** Display only (the database's title when it was picked). */\n databaseTitle?: string;\n }\n | { type: 'comment_mention' }\n | { type: 'meeting_ended' };\n\nexport type AgentTriggerType = AgentTrigger['type'];\n\nexport interface AgentTool {\n kind: 'yantra-notion' | 'connector';\n connector: string;\n actions?: string[];\n /** Display only (catalogue label when it was picked). */\n label?: string;\n}\n\nexport interface AgentScope {\n pageIds: string[];\n databaseIds: string[];\n teamspace?: string;\n /** Display only: titles of the picked pages / databases, by id. */\n titles?: Record<string, string>;\n}\n\nexport interface AgentLastRun {\n runId: string;\n at: string;\n status: AgentRunStatus;\n summary?: string;\n sessionId?: string;\n}\n\n/** `page.properties.agent` (PLAN §4 `NotesAgent`, plus where the Runs database lives). */\nexport interface NotesAgent {\n version: 1;\n enabled: boolean;\n color?: string;\n triggers: AgentTrigger[];\n tools: AgentTool[];\n scope: AgentScope;\n model?: string;\n requireApproval?: boolean;\n lastRun?: AgentLastRun;\n /** The hidden Runs database (child of the agent page), created on the first run. */\n runsDatabaseId?: string;\n /** The template the agent was created from (informational). */\n template?: AgentTemplateId;\n}\n\nexport const YANTRA_NOTION_TOOL: AgentTool = { kind: 'yantra-notion', connector: 'yantra-notion' };\n\n// ============================================================================\n// CONFIG\n// ============================================================================\n\nconst str = (v: unknown): string | undefined => (typeof v === 'string' && v.trim() ? v.trim() : undefined);\nconst strList = (v: unknown): string[] =>\n Array.isArray(v) ? [...new Set(v.filter((x): x is string => typeof x === 'string' && !!x.trim()))] : [];\n\nfunction normalizeTrigger(raw: unknown): AgentTrigger | null {\n if (!raw || typeof raw !== 'object') return null;\n const r = raw as Record<string, unknown>;\n switch (r.type) {\n case 'manual':\n return { type: 'manual' };\n case 'schedule': {\n const cron = str(r.cron);\n if (!cron) return null;\n return {\n type: 'schedule',\n cron,\n ...(str(r.timezone) ? { timezone: str(r.timezone) } : {}),\n ...(str(r.label) ? { label: str(r.label) } : {}),\n };\n }\n case 'database_row': {\n const databaseId = str(r.databaseId);\n if (!databaseId) return null;\n return {\n type: 'database_row',\n databaseId,\n on: r.on === 'updated' ? 'updated' : 'created',\n ...(r.where && typeof r.where === 'object' ? { where: r.where as Record<string, unknown> } : {}),\n ...(str(r.databaseTitle) ? { databaseTitle: str(r.databaseTitle) } : {}),\n };\n }\n case 'comment_mention':\n return { type: 'comment_mention' };\n case 'meeting_ended':\n return { type: 'meeting_ended' };\n default:\n return null;\n }\n}\n\n/** Key that makes two triggers \"the same slot\" (one schedule, one per database + event, …). */\nexport function triggerKey(t: AgentTrigger): string {\n return t.type === 'database_row' ? `database_row:${t.databaseId}:${t.on}` : t.type;\n}\n\n/** Whatever is stored → a complete config (manual trigger and yantra-notion tool always present). */\nexport function normalizeAgentConfig(raw: unknown): NotesAgent {\n const r = (raw && typeof raw === 'object' ? raw : {}) as Record<string, unknown>;\n const triggers: AgentTrigger[] = [{ type: 'manual' }];\n const seen = new Set(['manual']);\n for (const t of Array.isArray(r.triggers) ? r.triggers : []) {\n const n = normalizeTrigger(t);\n if (!n || seen.has(triggerKey(n))) continue;\n seen.add(triggerKey(n));\n triggers.push(n);\n }\n const tools: AgentTool[] = [{ ...YANTRA_NOTION_TOOL }];\n const toolSeen = new Set(['yantra-notion']);\n for (const t of Array.isArray(r.tools) ? r.tools : []) {\n if (!t || typeof t !== 'object') continue;\n const tt = t as Record<string, unknown>;\n const connector = str(tt.connector);\n if (!connector || toolSeen.has(connector) || tt.kind === 'yantra-notion') continue;\n toolSeen.add(connector);\n tools.push({\n kind: 'connector',\n connector,\n ...(Array.isArray(tt.actions) ? { actions: strList(tt.actions) } : {}),\n ...(str(tt.label) ? { label: str(tt.label) } : {}),\n });\n }\n const s = (r.scope && typeof r.scope === 'object' ? r.scope : {}) as Record<string, unknown>;\n const titles =\n s.titles && typeof s.titles === 'object'\n ? Object.fromEntries(\n Object.entries(s.titles as Record<string, unknown>).filter(\n (e): e is [string, string] => typeof e[1] === 'string',\n ),\n )\n : undefined;\n const scope: AgentScope = {\n pageIds: strList(s.pageIds),\n databaseIds: strList(s.databaseIds),\n ...(str(s.teamspace) ? { teamspace: str(s.teamspace) } : {}),\n ...(titles && Object.keys(titles).length ? { titles } : {}),\n };\n const lr = r.lastRun as Record<string, unknown> | undefined;\n const lastRun: AgentLastRun | undefined =\n lr && typeof lr === 'object' && isAgentRunStatus(lr.status)\n ? {\n runId: str(lr.runId) ?? '',\n at: str(lr.at) ?? '',\n status: lr.status as AgentRunStatus,\n ...(str(lr.summary) ? { summary: str(lr.summary) } : {}),\n ...(str(lr.sessionId) ? { sessionId: str(lr.sessionId) } : {}),\n }\n : undefined;\n return {\n version: 1,\n enabled: r.enabled === true,\n ...(str(r.color) ? { color: str(r.color) } : {}),\n triggers,\n tools,\n scope,\n ...(str(r.model) ? { model: str(r.model) } : {}),\n ...(typeof r.requireApproval === 'boolean' ? { requireApproval: r.requireApproval } : {}),\n ...(lastRun ? { lastRun } : {}),\n ...(str(r.runsDatabaseId) ? { runsDatabaseId: str(r.runsDatabaseId) } : {}),\n ...(isAgentTemplateId(r.template) ? { template: r.template } : {}),\n };\n}\n\nexport type AgentConfigPatch = Partial<Omit<NotesAgent, 'version' | 'scope'>> & { scope?: Partial<AgentScope> };\n\n/**\n * Merge a patch into the stored config. `updateBlock` merges `properties` shallowly, so the\n * WHOLE `agent` object is written each time — this computes it. `undefined` values remove a key\n * (e.g. `{ model: undefined }` clears the model).\n */\nexport function mergeAgentConfig(current: unknown, patch: AgentConfigPatch): NotesAgent {\n const base = normalizeAgentConfig(current);\n const next: Record<string, unknown> = { ...base };\n for (const [k, v] of Object.entries(patch)) {\n if (k === 'scope') continue;\n if (v === undefined) delete next[k];\n else next[k] = v;\n }\n if (patch.scope) next.scope = { ...base.scope, ...patch.scope };\n return normalizeAgentConfig(next);\n}\n\n/**\n * The `properties` patch for `updateBlock`: the merged `agent`, plus the page-level `color`\n * (the sidebar reads `properties.color` first) when the colour changes.\n */\nexport function agentPropertiesPatch(\n properties: Record<string, unknown> | null | undefined,\n patch: AgentConfigPatch,\n): { agent: NotesAgent; color?: string } {\n const agent = mergeAgentConfig(properties?.agent, patch);\n return patch.color ? { agent, color: patch.color } : { agent };\n}\n\n/** Put a trigger in its slot (replacing the same slot). `manual` is always kept. */\nexport function upsertTrigger(list: readonly AgentTrigger[], trigger: AgentTrigger): AgentTrigger[] {\n const key = triggerKey(trigger);\n const idx = list.findIndex((t) => triggerKey(t) === key);\n if (idx === -1) return [...list, trigger];\n const next = [...list];\n next[idx] = trigger;\n return next;\n}\n\n/** Remove a trigger by slot key (`manual` can't be removed). */\nexport function removeTrigger(list: readonly AgentTrigger[], key: string): AgentTrigger[] {\n if (key === 'manual') return [...list];\n return list.filter((t) => triggerKey(t) !== key);\n}\n\n/** Add / remove a connector tool (yantra-notion is always on). */\nexport function toggleConnectorTool(list: readonly AgentTool[], connector: string, label?: string): AgentTool[] {\n if (connector === 'yantra-notion') return [...list];\n if (list.some((t) => t.connector === connector)) return list.filter((t) => t.connector !== connector);\n return [...list, { kind: 'connector', connector, ...(label ? { label } : {}) }];\n}\n\n/** Add / remove a page or database from the scope (titles kept for display). */\nexport function toggleScopeItem(\n scope: AgentScope,\n item: { id: string; type: 'page' | 'database'; title?: string },\n): AgentScope {\n const key = item.type === 'database' ? 'databaseIds' : 'pageIds';\n const has = scope[key].includes(item.id);\n const titles = { ...(scope.titles ?? {}) };\n if (has) delete titles[item.id];\n else if (item.title) titles[item.id] = item.title;\n return {\n ...scope,\n [key]: has ? scope[key].filter((id) => id !== item.id) : [...scope[key], item.id],\n titles,\n };\n}\n\n// ============================================================================\n// SCHEDULE (friendly picker ⇄ cron)\n// ============================================================================\n\nexport type ScheduleFrequency = 'hourly' | 'daily' | 'weekdays' | 'weekly' | 'monthly';\n\nexport interface FriendlySchedule {\n frequency: ScheduleFrequency;\n /** 0–23 (ignored for hourly). */\n hour: number;\n /** 0–59. */\n minute: number;\n /** 0 = Sunday … 6 = Saturday (weekly). */\n weekday?: number;\n /** 1–{@link MAX_MONTH_DAY} (monthly). */\n dayOfMonth?: number;\n}\n\nexport const WEEKDAY_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const SCHEDULE_FREQUENCIES: Array<{ id: ScheduleFrequency; label: string }> = [\n { id: 'hourly', label: 'Every hour' },\n { id: 'daily', label: 'Every day' },\n { id: 'weekdays', label: 'Every weekday' },\n { id: 'weekly', label: 'Every week' },\n { id: 'monthly', label: 'Every month' },\n];\n\nexport const DEFAULT_SCHEDULE: FriendlySchedule = { frequency: 'weekdays', hour: 9, minute: 0 };\n\n/**\n * Last day of month the picker offers (every month has it). A cron on day 29–31 — which standard\n * cron skips in shorter months — is not picker-representable: cronToSchedule returns null, so it\n * stays a raw cron (labelled as such) and is never silently rewritten.\n */\nexport const MAX_MONTH_DAY = 28;\n\nconst clamp = (n: unknown, lo: number, hi: number, dflt: number) => {\n const v = typeof n === 'number' && Number.isFinite(n) ? Math.round(n) : dflt;\n return Math.min(hi, Math.max(lo, v));\n};\n\nexport function scheduleToCron(s: FriendlySchedule): string {\n const m = clamp(s.minute, 0, 59, 0);\n const h = clamp(s.hour, 0, 23, 9);\n switch (s.frequency) {\n case 'hourly':\n return `${m} * * * *`;\n case 'daily':\n return `${m} ${h} * * *`;\n case 'weekdays':\n return `${m} ${h} * * 1-5`;\n case 'weekly':\n return `${m} ${h} * * ${clamp(s.weekday, 0, 6, 1)}`;\n case 'monthly':\n return `${m} ${h} ${clamp(s.dayOfMonth, 1, MAX_MONTH_DAY, 1)} * *`;\n }\n}\n\nconst INT = /^\\d{1,2}$/;\n\n/** A cron the picker can show, or null (anything else is kept as a raw cron). */\nexport function cronToSchedule(cron: string): FriendlySchedule | null {\n const parts = cron.trim().split(/\\s+/);\n if (parts.length !== 5) return null;\n const [mi, ho, dom, mon, dow] = parts;\n if (!INT.test(mi) || Number(mi) > 59 || mon !== '*') return null;\n const minute = Number(mi);\n if (ho === '*' && dom === '*' && dow === '*') return { frequency: 'hourly', hour: 0, minute };\n if (!INT.test(ho) || Number(ho) > 23) return null;\n const hour = Number(ho);\n if (dom === '*' && dow === '*') return { frequency: 'daily', hour, minute };\n if (dom === '*' && dow === '1-5') return { frequency: 'weekdays', hour, minute };\n if (dom === '*' && /^[0-7]$/.test(dow)) return { frequency: 'weekly', hour, minute, weekday: Number(dow) % 7 };\n if (dow === '*' && INT.test(dom) && Number(dom) >= 1 && Number(dom) <= MAX_MONTH_DAY) {\n return { frequency: 'monthly', hour, minute, dayOfMonth: Number(dom) };\n }\n return null;\n}\n\nconst pad2 = (n: number) => String(n).padStart(2, '0');\n\n/** \"Every weekday at 9:00\", \"Every Monday at 14:30\", \"Every hour at :15\", \"Monthly on day 1 at 9:00\". */\nexport function scheduleLabel(s: FriendlySchedule): string {\n const time = `${clamp(s.hour, 0, 23, 9)}:${pad2(clamp(s.minute, 0, 59, 0))}`;\n switch (s.frequency) {\n case 'hourly':\n return s.minute ? `Every hour at :${pad2(clamp(s.minute, 0, 59, 0))}` : 'Every hour';\n case 'daily':\n return `Every day at ${time}`;\n case 'weekdays':\n return `Every weekday at ${time}`;\n case 'weekly':\n return `Every ${WEEKDAY_NAMES[clamp(s.weekday, 0, 6, 1)]} at ${time}`;\n case 'monthly':\n return `Monthly on day ${clamp(s.dayOfMonth, 1, MAX_MONTH_DAY, 1)} at ${time}`;\n }\n}\n\n/** A schedule trigger from the picker value. */\nexport function scheduleTrigger(s: FriendlySchedule, timezone?: string): Extract<AgentTrigger, { type: 'schedule' }> {\n return {\n type: 'schedule',\n cron: scheduleToCron(s),\n label: scheduleLabel(s),\n ...(timezone ? { timezone } : {}),\n };\n}\n\n/** One line per trigger, for chips and the runs log. */\nexport function triggerLabel(t: AgentTrigger): string {\n switch (t.type) {\n case 'manual':\n return 'Manual';\n case 'schedule': {\n const friendly = cronToSchedule(t.cron);\n return t.label || (friendly ? scheduleLabel(friendly) : `Cron ${t.cron}`);\n }\n case 'database_row':\n return `When a row is ${t.on} in ${t.databaseTitle ? `“${t.databaseTitle}”` : 'a database'}`;\n case 'comment_mention':\n return 'When @mentioned in a comment';\n case 'meeting_ended':\n return 'When a meeting ends';\n }\n}\n\n/** The Runs database's Trigger select value. */\nexport const TRIGGER_KIND_LABEL: Record<AgentTriggerType, string> = {\n manual: 'Manual',\n schedule: 'Schedule',\n database_row: 'Database row',\n comment_mention: 'Comment',\n meeting_ended: 'Meeting ended',\n};\n\n// ============================================================================\n// TEMPLATES\n// ============================================================================\n\nexport type AgentTemplateId = 'blank' | 'project-updater' | 'task-router' | 'it-answer-bot';\n\nexport interface AgentInstructionLine {\n type: 'heading_2' | 'paragraph' | 'bulleted_list' | 'numbered_list';\n text: string;\n}\n\nexport interface AgentTemplate {\n id: AgentTemplateId;\n name: string;\n description: string;\n color: string;\n instructions: AgentInstructionLine[];\n triggers: AgentTrigger[];\n tools: AgentTool[];\n /** Shown on the template card (\"needs comments\"). */\n note?: string;\n}\n\nexport const AGENT_TEMPLATES: readonly AgentTemplate[] = [\n {\n id: 'blank',\n name: 'Blank agent',\n description: 'Start from scratch: write what it should do in the page.',\n color: 'gray',\n instructions: [\n { type: 'heading_2', text: 'Instructions' },\n {\n type: 'paragraph',\n text: 'Describe the job in plain words. The agent reads this page every time it runs.',\n },\n ],\n triggers: [{ type: 'manual' }],\n tools: [{ ...YANTRA_NOTION_TOOL }],\n },\n {\n id: 'project-updater',\n name: 'Project Updater',\n description: 'Reads what changed in your projects and posts a weekly update page.',\n color: 'blue',\n instructions: [\n { type: 'heading_2', text: 'Goal' },\n {\n type: 'paragraph',\n text: 'Keep the team up to date without anyone writing a status report by hand.',\n },\n { type: 'heading_2', text: 'Steps' },\n {\n type: 'numbered_list',\n text: 'Look at the pages and databases in scope that changed in the last 7 days.',\n },\n {\n type: 'numbered_list',\n text: 'Group the changes by project: shipped, in progress, blocked, and what is due next week.',\n },\n {\n type: 'numbered_list',\n text: 'Create a new page titled “Update — <today’s date>” with a short summary and a bulleted list per group.',\n },\n { type: 'numbered_list', text: 'Link every item back to its page or row.' },\n { type: 'heading_2', text: 'Style' },\n { type: 'bulleted_list', text: 'Short, factual bullets. No filler.' },\n { type: 'bulleted_list', text: 'Call out anything overdue or blocked first.' },\n ],\n triggers: [{ type: 'manual' }, scheduleTrigger({ frequency: 'weekly', hour: 9, minute: 0, weekday: 5 })],\n tools: [{ ...YANTRA_NOTION_TOOL }],\n },\n {\n id: 'task-router',\n name: 'Task Router',\n description: 'Finds unassigned tasks and sets an owner and a priority.',\n color: 'orange',\n instructions: [\n { type: 'heading_2', text: 'Goal' },\n { type: 'paragraph', text: 'No task sits in the tracker without an owner or a priority.' },\n { type: 'heading_2', text: 'Steps' },\n { type: 'numbered_list', text: 'Query the task databases in scope for rows with no “Assigned to”.' },\n {\n type: 'numbered_list',\n text: 'Pick the owner from who already works on similar tasks; spread the load evenly.',\n },\n {\n type: 'numbered_list',\n text: 'Set Priority from the due date and wording: Urgent (due in 2 days or “outage”), High, Medium, Low.',\n },\n { type: 'numbered_list', text: 'Reply with the rows you changed and why.' },\n { type: 'heading_2', text: 'Rules' },\n { type: 'bulleted_list', text: 'Never change a row that already has an owner.' },\n { type: 'bulleted_list', text: 'If you are unsure, leave the row and list it in the summary.' },\n ],\n triggers: [{ type: 'manual' }, scheduleTrigger({ frequency: 'weekdays', hour: 9, minute: 0 })],\n tools: [{ ...YANTRA_NOTION_TOOL }],\n },\n {\n id: 'it-answer-bot',\n name: 'IT Answer Bot',\n description: 'Answers IT questions in comment threads from your IT docs.',\n color: 'purple',\n note: 'Replies in comment threads when comments are available.',\n instructions: [\n { type: 'heading_2', text: 'Goal' },\n {\n type: 'paragraph',\n text: 'Answer IT questions (laptops, accounts, VPN, access requests) where people ask them.',\n },\n { type: 'heading_2', text: 'Steps' },\n { type: 'numbered_list', text: 'Read the comment that mentioned you and the page it is on.' },\n { type: 'numbered_list', text: 'Search the IT pages in scope for the answer.' },\n {\n type: 'numbered_list',\n text: 'Reply in the same thread with a short answer and a link to the source page.',\n },\n { type: 'heading_2', text: 'Rules' },\n { type: 'bulleted_list', text: 'If the docs don’t cover it, say so and suggest who to ask.' },\n { type: 'bulleted_list', text: 'Never share passwords or secrets.' },\n ],\n triggers: [{ type: 'manual' }, { type: 'comment_mention' }],\n tools: [{ ...YANTRA_NOTION_TOOL }],\n },\n];\n\nexport function isAgentTemplateId(v: unknown): v is AgentTemplateId {\n return typeof v === 'string' && AGENT_TEMPLATES.some((t) => t.id === v);\n}\n\nexport function agentTemplate(id: AgentTemplateId | null | undefined): AgentTemplate {\n return AGENT_TEMPLATES.find((t) => t.id === id) ?? AGENT_TEMPLATES[0];\n}\n\n/** The template's instructions as page blocks (appendChildren input). */\nexport function templateInstructionBlocks(\n t: AgentTemplate,\n): Array<{ type: string; properties: Record<string, unknown> }> {\n return t.instructions.map((l) => ({ type: l.type, properties: { title: textTitle(l.text) } }));\n}\n\n// ============================================================================\n// INSTRUCTIONS (page blocks → text)\n// ============================================================================\n\nexport interface InstructionBlock {\n id?: string;\n type?: string;\n properties?: Record<string, unknown> | null;\n}\n\nconst TEXT_PREFIX: Record<string, (i: number) => string> = {\n heading_1: () => '# ',\n heading_2: () => '## ',\n heading_3: () => '### ',\n bulleted_list: () => '- ',\n numbered_list: (i) => `${i}. `,\n quote: () => '> ',\n callout: () => '> ',\n toggle: () => '- ',\n paragraph: () => '',\n text: () => '',\n};\n\n/** The page body (top-level blocks) as markdown-ish text: what the agent is told to do. */\nexport function blocksToInstructions(blocks: readonly InstructionBlock[] | null | undefined): string {\n const out: string[] = [];\n let n = 0;\n for (const b of blocks ?? []) {\n if (!b || b.properties?.hidden === true) continue;\n const type = String(b.type ?? '');\n const text = titlePlainText(b.properties).trim();\n n = type === 'numbered_list' ? n + 1 : 0;\n if (type === 'todo') {\n if (text) out.push(`- [${b.properties?.checked ? 'x' : ' '}] ${text}`);\n continue;\n }\n if (type === 'code' && text) {\n out.push('```\\n' + text + '\\n```');\n continue;\n }\n const prefix = TEXT_PREFIX[type];\n if (!prefix || !text) continue;\n out.push(prefix(n) + text);\n }\n return out.join('\\n');\n}\n\n// ============================================================================\n// RUN PROMPT + RESULT\n// ============================================================================\n\n/** Marks a chat turn as an agent run (the mock agent and transcripts key off it). */\nexport const AGENT_RUN_MARKER = '[Agent run]';\n\n/** What the browser hands the runner (context/NotesAgentRunnerContext). */\nexport interface AgentRunInput {\n agentId: string;\n workspaceId?: string | null;\n name: string;\n /** The page body as text (blocksToInstructions). */\n instructions: string;\n config: NotesAgent;\n trigger: AgentTrigger;\n /** The run row id in the Runs database (when logging worked). */\n runId?: string;\n}\n\nexport interface AgentRunResult {\n status: Exclude<AgentRunStatus, 'queued' | 'running'>;\n summary: string;\n sessionId?: string;\n}\n\nfunction scopeLine(scope: AgentScope): string {\n const name = (id: string) => (scope.titles?.[id] ? `${id} (“${scope.titles[id]}”)` : id);\n const parts: string[] = [];\n if (scope.pageIds.length) parts.push(`pages ${scope.pageIds.map(name).join(', ')}`);\n if (scope.databaseIds.length) parts.push(`databases ${scope.databaseIds.map(name).join(', ')}`);\n if (scope.teamspace) parts.push(`teamspace “${scope.teamspace}”`);\n return parts.length ? parts.join('; ') : 'the whole workspace';\n}\n\n/** The structured prompt for one run (sent as the first turn of a NEW chat session). */\nexport function buildAgentRunPrompt(input: AgentRunInput): string {\n const { config } = input;\n const tools = config.tools.map((t) => (t.kind === 'yantra-notion' ? 'yantra-notion' : t.connector));\n const lines = [\n `${AGENT_RUN_MARKER} You are the agent “${input.name || 'Untitled agent'}” (agent page ${input.agentId}${\n input.runId ? `, run ${input.runId}` : ''\n }).`,\n `Trigger: ${triggerLabel(input.trigger)}.`,\n '',\n 'Instructions:',\n input.instructions.trim() || '(The agent page has no instructions yet — say so and stop.)',\n '',\n `Scope: ${scopeLine(config.scope)}. Only read and change things in scope.`,\n `Tools: ${tools.join(', ')}. Use the yantra-notion skill for every workspace read and write.`,\n ];\n if (config.requireApproval) {\n lines.push(\n 'Approval required: do NOT change anything yet. List the exact changes you would make and ask for approval.',\n );\n } else {\n lines.push('Do the task now, without asking questions unless you cannot continue.');\n }\n lines.push('When you are done, reply with a one-paragraph summary of what you did (or found).');\n return lines.join('\\n');\n}\n\nconst MARKER_BLOCK = /\\[([A-Z_]+)\\][\\s\\S]*?\\[\\/\\1\\]/g;\n\n/** The agent's reply → run status + a short summary for the log. */\nexport function classifyRunReply(\n text: string | null | undefined,\n opts: { requireApproval?: boolean } = {},\n): AgentRunResult {\n const raw = (text ?? '').trim();\n if (!raw) return { status: 'failed', summary: 'The agent did not reply.' };\n const asks = /\\[(CDECLI_ASK_USER_QUESTION|CONNECTOR_CONNECT|FORM_REQUEST)\\]/.test(raw);\n const plain = raw\n .replace(MARKER_BLOCK, ' ')\n .replace(/[ \\t]+\\n/g, '\\n')\n .trim();\n const paras = plain\n .split(/\\n\\s*\\n/)\n .map((p) =>\n p\n .replace(/[#*_`>]+/g, '')\n .replace(/\\s+/g, ' ')\n .trim(),\n )\n .filter(Boolean);\n // The prompt asks for the summary LAST (agents often narrate first): the last real paragraph,\n // else the first one.\n const para = [...paras].reverse().find((p) => p.length >= 30 && !/^[-•\\d]/.test(p)) ?? paras[0] ?? '';\n const summary = (para.length > 280 ? `${para.slice(0, 279)}…` : para) || 'The agent needs input.';\n if (asks) return { status: 'needs_input', summary };\n if (opts.requireApproval && /\\b(approve|approval|confirm)\\b/i.test(plain))\n return { status: 'needs_input', summary };\n return { status: 'succeeded', summary };\n}\n\n// ============================================================================\n// RUNS DATABASE (hidden child of the agent page)\n// ============================================================================\n\nexport const RUNS_DATABASE_SCHEMA: DatabaseSchema = {\n title: { type: 'title' },\n Status: {\n type: 'status',\n options: AGENT_RUN_STATUSES.map((s) => ({ ...RUN_STATUS_OPTION[s] })) as DatabaseSchema[string]['options'],\n },\n Started: { type: 'date' },\n Trigger: {\n type: 'select',\n options: (Object.keys(TRIGGER_KIND_LABEL) as AgentTriggerType[]).map((k, i) => ({\n name: TRIGGER_KIND_LABEL[k],\n color: ['gray', 'blue', 'purple', 'orange', 'green'][i] ?? 'gray',\n })),\n },\n Summary: { type: 'text' },\n Session: { type: 'url' },\n};\n\nexport function runsDatabaseProperties(agentId: string, agentName: string): Record<string, unknown> {\n return {\n title: textTitle(`Runs — ${agentName || 'Agent'}`),\n icon: { type: 'emoji', emoji: '🧾' },\n schema: RUNS_DATABASE_SCHEMA,\n [HIDDEN_FLAG]: true,\n agentRunsOf: agentId,\n };\n}\n\n/** `yantra-session:<id>` — what the Session url cell stores (the runner can reopen it). */\nexport const SESSION_URL_PREFIX = 'yantra-session:';\n\nexport function sessionUrl(sessionId: string | undefined): string {\n return sessionId ? `${SESSION_URL_PREFIX}${sessionId}` : '';\n}\n\nexport function runRowTitle(at: Date): string {\n const d = at.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n const t = at.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });\n return `Run — ${d}, ${t}`;\n}\n\n/** Properties of a new run row (written when the run starts). */\nexport function runRowProperties(opts: { at: Date; trigger: AgentTrigger; status?: AgentRunStatus }) {\n return {\n title: textTitle(runRowTitle(opts.at)),\n Status: { name: RUN_STATUS_OPTION[opts.status ?? 'running'].name },\n Started: opts.at.toISOString(),\n Trigger: { name: TRIGGER_KIND_LABEL[opts.trigger.type] },\n Summary: '',\n Session: '',\n };\n}\n\n/** The patch written when the run finishes. */\nexport function runRowFinishPatch(result: AgentRunResult) {\n return {\n Status: { name: RUN_STATUS_OPTION[result.status].name },\n Summary: result.summary,\n Session: sessionUrl(result.sessionId),\n };\n}\n\nexport interface AgentRunRow {\n id: string;\n status: AgentRunStatus;\n /** ms since epoch (0 when unknown). */\n startedAt: number;\n trigger: string;\n summary: string;\n sessionId?: string;\n}\n\nconst optName = (v: unknown): string =>\n typeof v === 'string' ? v : v && typeof v === 'object' ? String((v as { name?: unknown }).name ?? '') : '';\n\nfunction statusFromName(name: string): AgentRunStatus {\n const hit = AGENT_RUN_STATUSES.find((s) => RUN_STATUS_OPTION[s].name.toLowerCase() === name.trim().toLowerCase());\n return hit ?? 'queued';\n}\n\n/** A Runs database row → what the runs list shows. */\nexport function parseRunRow(row: {\n id?: unknown;\n properties?: Record<string, unknown> | null;\n createdTime?: string | null;\n}): AgentRunRow | null {\n if (!row?.id) return null;\n const p = row.properties ?? {};\n const started = p.Started;\n const startedRaw =\n typeof started === 'string' ? started : started && typeof started === 'object' ? (started as any).start : '';\n const summary = typeof p.Summary === 'string' ? p.Summary : titlePlainText({ title: p.Summary });\n const session = typeof p.Session === 'string' ? p.Session : '';\n return {\n id: String(row.id),\n status: statusFromName(optName(p.Status)),\n startedAt: Date.parse(startedRaw || '') || Date.parse(row.createdTime ?? '') || 0,\n trigger: optName(p.Trigger) || 'Manual',\n summary,\n ...(session.startsWith(SESSION_URL_PREFIX) ? { sessionId: session.slice(SESSION_URL_PREFIX.length) } : {}),\n };\n}\n\n/** Newest first, capped. */\nexport function latestRuns(rows: readonly AgentRunRow[], limit = 10): AgentRunRow[] {\n return [...rows].sort((a, b) => b.startedAt - a.startedAt).slice(0, limit);\n}\n\n// ============================================================================\n// NEW AGENT FROM A TEMPLATE\n// ============================================================================\n\n/** Properties of a new agent page made from a template (kind 'agent' + a full `agent` config). */\nexport function templateAgentProperties(\n id: AgentTemplateId | null | undefined,\n opts: { teamspace?: string | null } = {},\n) {\n const t = agentTemplate(id);\n const blank = t.id === 'blank';\n const base = newAgentProperties({\n ...(blank ? {} : { name: t.name, color: t.color }),\n teamspace: opts.teamspace ?? null,\n });\n const agent = normalizeAgentConfig({\n ...base.agent,\n triggers: t.triggers,\n tools: t.tools,\n template: t.id,\n });\n return { ...base, agent };\n}\n\n/** The sidebar dot: the last run's EFFECTIVE status (utils/agentRunStatus: a stale \"running\" is failed). */\nexport function agentRunStatusOf(\n properties: Record<string, unknown> | null | undefined,\n now: number = Date.now(),\n): AgentRunStatus | undefined {\n const lr = (properties?.agent as { lastRun?: { status?: unknown; at?: unknown } } | undefined)?.lastRun;\n if (!lr || !isAgentRunStatus(lr.status)) return undefined;\n return effectiveRunStatus(lr.status, typeof lr.at === 'string' ? lr.at : undefined, now);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import'./notionTemplates.js';import {titlePlainText,textTitle}from'./notionRichTitle.js';import {isAgentRunStatus,effectiveRunStatus}from'./notionAgentRunStatus.js';var __defProp = Object.defineProperty;
|
|
1
|
+
import'./notionTemplates.js';import {titlePlainText,textTitle}from'./notionRichTitle.js';import {isAgentRunStatus,effectiveRunStatus}from'./notionAgentRunStatus.js';export{AGENT_RUN_LABEL}from'./notionAgentRunStatus.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|