@adminide-stack/yantra-mobile 12.0.142-alpha.0 → 12.0.144

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.
Files changed (118) hide show
  1. package/lib/features/attachments/displayUserMessageText.js +2 -2
  2. package/lib/features/attachments/displayUserMessageText.js.map +1 -1
  3. package/lib/features/devices/bodyComposition.js +116 -0
  4. package/lib/features/devices/bodyComposition.js.map +1 -0
  5. package/lib/features/devices/readings.js.map +1 -1
  6. package/lib/features/devices/session.js +22 -2
  7. package/lib/features/devices/session.js.map +1 -1
  8. package/lib/features/notion/NotionAgentPanel.js +987 -0
  9. package/lib/features/notion/NotionAgentPanel.js.map +1 -0
  10. package/lib/features/notion/NotionAskAiSheet.js +362 -0
  11. package/lib/features/notion/NotionAskAiSheet.js.map +1 -0
  12. package/lib/features/notion/NotionBlockView.js +4 -3
  13. package/lib/features/notion/NotionBlockView.js.map +1 -1
  14. package/lib/features/notion/NotionConnectionsSheet.js +47 -13
  15. package/lib/features/notion/NotionConnectionsSheet.js.map +1 -1
  16. package/lib/features/notion/NotionPageView.js +68 -8
  17. package/lib/features/notion/NotionPageView.js.map +1 -1
  18. package/lib/features/notion/NotionSidebarSections.js +1 -1
  19. package/lib/features/notion/NotionSidebarSections.js.map +1 -1
  20. package/lib/features/notion/NotionWorkspaceView.js +14 -9
  21. package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
  22. package/lib/features/notion/database/DatabaseCells.js +3 -1
  23. package/lib/features/notion/database/DatabaseCells.js.map +1 -1
  24. package/lib/features/notion/database/DatabaseDateLayouts.js +1 -1
  25. package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -1
  26. package/lib/features/notion/database/NotionDatabaseView.js +1 -1
  27. package/lib/features/notion/database/NotionDatabaseView.js.map +1 -1
  28. package/lib/features/notion/notionAgentRunStatus.js +2 -2
  29. package/lib/features/notion/notionAgentRunStatus.js.map +1 -1
  30. package/lib/features/notion/notionAgentRuns.js +57 -0
  31. package/lib/features/notion/notionAgentRuns.js.map +1 -0
  32. package/lib/features/notion/notionAiContext.js +91 -0
  33. package/lib/features/notion/notionAiContext.js.map +1 -0
  34. package/lib/features/notion/notionConnections.js +42 -4
  35. package/lib/features/notion/notionConnections.js.map +1 -1
  36. package/lib/features/notion/notionDocuments.js +61 -1
  37. package/lib/features/notion/notionDocuments.js.map +1 -1
  38. package/lib/features/notion/notionNotesAgent.js +173 -3
  39. package/lib/features/notion/notionNotesAgent.js.map +1 -1
  40. package/lib/features/notion/notionPageKinds.js +1 -1
  41. package/lib/features/webbuilder/WebBuilderExperience.js +229 -97
  42. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  43. package/lib/features/webbuilder/buildFragments.js +33 -7
  44. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  45. package/lib/features/webbuilder/buildJob.js +2 -2
  46. package/lib/features/webbuilder/buildJob.js.map +1 -1
  47. package/lib/features/webbuilder/codeFiles.js +18 -1
  48. package/lib/features/webbuilder/codeFiles.js.map +1 -1
  49. package/lib/features/webbuilder/components/BottomTabs.js.map +1 -1
  50. package/lib/features/webbuilder/components/CodeView.js +134 -56
  51. package/lib/features/webbuilder/components/CodeView.js.map +1 -1
  52. package/lib/features/webbuilder/components/Composer.js +2 -2
  53. package/lib/features/webbuilder/components/Composer.js.map +1 -1
  54. package/lib/features/webbuilder/components/PreviewFrame.js +19 -3
  55. package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -1
  56. package/lib/features/webbuilder/components/PreviewScreen.js +310 -46
  57. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  58. package/lib/features/webbuilder/components/ProjectChat.js +141 -12
  59. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  60. package/lib/features/webbuilder/components/ProjectSheets.js +792 -0
  61. package/lib/features/webbuilder/components/ProjectSheets.js.map +1 -0
  62. package/lib/features/webbuilder/components/ProjectsScreen.js +14 -2
  63. package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -1
  64. package/lib/features/webbuilder/components/PublishSheet.js +914 -58
  65. package/lib/features/webbuilder/components/PublishSheet.js.map +1 -1
  66. package/lib/features/webbuilder/components/TemplateCard.js +9 -6
  67. package/lib/features/webbuilder/components/TemplateCard.js.map +1 -1
  68. package/lib/features/webbuilder/components/TemplatesSheet.js +5 -17
  69. package/lib/features/webbuilder/components/TemplatesSheet.js.map +1 -1
  70. package/lib/features/webbuilder/connectorTemplates.js +171 -0
  71. package/lib/features/webbuilder/connectorTemplates.js.map +1 -0
  72. package/lib/features/webbuilder/fileTree.js +163 -0
  73. package/lib/features/webbuilder/fileTree.js.map +1 -0
  74. package/lib/features/webbuilder/followUps.js +67 -0
  75. package/lib/features/webbuilder/followUps.js.map +1 -0
  76. package/lib/features/webbuilder/previewProbe.js +49 -0
  77. package/lib/features/webbuilder/previewProbe.js.map +1 -0
  78. package/lib/features/webbuilder/previewRoutes.js +156 -0
  79. package/lib/features/webbuilder/previewRoutes.js.map +1 -0
  80. package/lib/features/webbuilder/projectTools.js +341 -0
  81. package/lib/features/webbuilder/projectTools.js.map +1 -0
  82. package/lib/features/webbuilder/publishTools.js +475 -0
  83. package/lib/features/webbuilder/publishTools.js.map +1 -0
  84. package/lib/features/webbuilder/sleepNotice.js +13 -0
  85. package/lib/features/webbuilder/sleepNotice.js.map +1 -0
  86. package/lib/features/webbuilder/stepLabels.js +37 -7
  87. package/lib/features/webbuilder/stepLabels.js.map +1 -1
  88. package/lib/features/webbuilder/studioCatalog.js +5 -1
  89. package/lib/features/webbuilder/studioCatalog.js.map +1 -1
  90. package/lib/features/webbuilder/templateCatalog.js +140 -0
  91. package/lib/features/webbuilder/templateCatalog.js.map +1 -0
  92. package/lib/features/webbuilder/webbuilderPrompts.js +31 -5
  93. package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -1
  94. package/lib/features/webbuilder/workflow.js +8 -4
  95. package/lib/features/webbuilder/workflow.js.map +1 -1
  96. package/lib/screens/Devices/index.js +205 -3
  97. package/lib/screens/Devices/index.js.map +1 -1
  98. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +9 -6
  99. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -1
  100. package/lib/screens/WebBuilderNative/index.js +1 -1
  101. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  102. package/lib/screens/WebBuilderNative/keepAlive.js +53 -3
  103. package/lib/screens/WebBuilderNative/keepAlive.js.map +1 -1
  104. package/lib/screens/WebBuilderNative/unreachableRetry.js +23 -0
  105. package/lib/screens/WebBuilderNative/unreachableRetry.js.map +1 -0
  106. package/lib/screens/WebBuilderNative/useConnectorTemplates.js +37 -0
  107. package/lib/screens/WebBuilderNative/useConnectorTemplates.js.map +1 -0
  108. package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js +6 -0
  109. package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js.map +1 -1
  110. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +302 -40
  111. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  112. package/lib/screens/WebBuilderNative/useWebBuilderJobs.js +2 -2
  113. package/lib/screens/WebBuilderNative/useWebBuilderJobs.js.map +1 -1
  114. package/lib/screens/WebBuilderNative/versionUndo.js +1 -1
  115. package/lib/screens/WebBuilderNative/versionUndo.js.map +1 -1
  116. package/lib/screens/WebBuilderNative/webbuilderTransport.js +147 -77
  117. package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
  118. package/package.json +4 -4
@@ -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;