abstractnote 0.1.0__py3-none-any.whl

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 (80) hide show
  1. abstractnote/__init__.py +18 -0
  2. abstractnote/cli.py +240 -0
  3. abstractnote/flows/__init__.py +2 -0
  4. abstractnote/flows/build.py +970 -0
  5. abstractnote/flows/bundle.py +62 -0
  6. abstractnote/flows/contract.py +88 -0
  7. abstractnote/flows/graph.py +540 -0
  8. abstractnote/flows/json/note-capture.json +2280 -0
  9. abstractnote/flows/json/note-drain.json +2012 -0
  10. abstractnote/flows/json/note-mine.json +2392 -0
  11. abstractnote/flows/json/note-process.json +1853 -0
  12. abstractnote/flows/json/note-recall.json +1876 -0
  13. abstractnote/flows/json/note-reflect.json +2057 -0
  14. abstractnote/flows/prompts_fallback.py +119 -0
  15. abstractnote/flows/runner.py +320 -0
  16. abstractnote/flows/schemas_fallback.py +175 -0
  17. abstractnote/gateway/__init__.py +24 -0
  18. abstractnote/gateway/appspec.py +10 -0
  19. abstractnote/gateway/router.py +571 -0
  20. abstractnote/gateway/tools.py +74 -0
  21. abstractnote/ids.py +177 -0
  22. abstractnote/importers/__init__.py +142 -0
  23. abstractnote/importers/__main__.py +3 -0
  24. abstractnote/importers/agora.py +203 -0
  25. abstractnote/importers/claude_sessions.py +415 -0
  26. abstractnote/importers/cli.py +113 -0
  27. abstractnote/importers/files.py +72 -0
  28. abstractnote/importers/markdown.py +165 -0
  29. abstractnote/ingest/__init__.py +7 -0
  30. abstractnote/ingest/blobs.py +47 -0
  31. abstractnote/ingest/capture.py +265 -0
  32. abstractnote/ingest/extract.py +118 -0
  33. abstractnote/ingest/normalise.py +95 -0
  34. abstractnote/model.py +229 -0
  35. abstractnote/process/__init__.py +5 -0
  36. abstractnote/process/context.py +218 -0
  37. abstractnote/process/merge.py +60 -0
  38. abstractnote/process/prompts/__init__.py +39 -0
  39. abstractnote/process/prompts/extract.md +30 -0
  40. abstractnote/process/prompts/link.md +32 -0
  41. abstractnote/process/prompts/mine_dossier.md +13 -0
  42. abstractnote/process/prompts/mine_findings.md +13 -0
  43. abstractnote/process/prompts/mine_plan.md +13 -0
  44. abstractnote/process/prompts/quick_filing.md +23 -0
  45. abstractnote/process/prompts/reflect.md +10 -0
  46. abstractnote/process/prompts/synthesize.md +17 -0
  47. abstractnote/process/resolve.py +96 -0
  48. abstractnote/process/revise.py +410 -0
  49. abstractnote/process/schemas.py +377 -0
  50. abstractnote/process/vocabulary.py +68 -0
  51. abstractnote/recall/__init__.py +1 -0
  52. abstractnote/recall/changes.py +191 -0
  53. abstractnote/recall/expand.py +379 -0
  54. abstractnote/recall/insights.py +62 -0
  55. abstractnote/recall/reflect.py +202 -0
  56. abstractnote/recall/review.py +191 -0
  57. abstractnote/recall/search.py +205 -0
  58. abstractnote/recall/shapes.py +52 -0
  59. abstractnote/recall/then_now.py +100 -0
  60. abstractnote/store/__init__.py +12 -0
  61. abstractnote/store/archive.py +166 -0
  62. abstractnote/store/embeddings.py +275 -0
  63. abstractnote/store/kg.py +219 -0
  64. abstractnote/store/notebook.py +829 -0
  65. abstractnote/store/notes.py +1190 -0
  66. abstractnote/store/queue.py +159 -0
  67. abstractnote/store/schema.py +348 -0
  68. abstractnote/store/vector_index.py +88 -0
  69. abstractnote/tools/__init__.py +215 -0
  70. abstractnote/tools/capture.py +121 -0
  71. abstractnote/tools/context.py +19 -0
  72. abstractnote/tools/process.py +22 -0
  73. abstractnote/tools/queue.py +23 -0
  74. abstractnote/tools/recall.py +64 -0
  75. abstractnote-0.1.0.dist-info/METADATA +145 -0
  76. abstractnote-0.1.0.dist-info/RECORD +80 -0
  77. abstractnote-0.1.0.dist-info/WHEEL +5 -0
  78. abstractnote-0.1.0.dist-info/entry_points.txt +2 -0
  79. abstractnote-0.1.0.dist-info/licenses/LICENSE +21 -0
  80. abstractnote-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1876 @@
1
+ {
2
+ "id": "note-recall",
3
+ "name": "Ask your notes",
4
+ "description": "Answer a question from the notes at the requested effort (quick, standard or deep). Also serves the chat agent contract: prompt in, response out.",
5
+ "interfaces": [
6
+ "abstractnote.recall.v1",
7
+ "abstractcode.agent.v1"
8
+ ],
9
+ "nodes": [
10
+ {
11
+ "id": "start",
12
+ "type": "on_flow_start",
13
+ "position": {
14
+ "x": 0.0,
15
+ "y": 0.0
16
+ },
17
+ "data": {
18
+ "nodeType": "on_flow_start",
19
+ "label": "Start",
20
+ "inputs": [],
21
+ "outputs": [
22
+ {
23
+ "id": "exec-out",
24
+ "label": "",
25
+ "type": "execution"
26
+ },
27
+ {
28
+ "id": "question",
29
+ "label": "question",
30
+ "type": "string"
31
+ },
32
+ {
33
+ "id": "prompt",
34
+ "label": "prompt",
35
+ "type": "string"
36
+ },
37
+ {
38
+ "id": "effort",
39
+ "label": "effort",
40
+ "type": "string"
41
+ },
42
+ {
43
+ "id": "as_of",
44
+ "label": "as_of",
45
+ "type": "string"
46
+ },
47
+ {
48
+ "id": "since",
49
+ "label": "since",
50
+ "type": "string"
51
+ },
52
+ {
53
+ "id": "until",
54
+ "label": "until",
55
+ "type": "string"
56
+ },
57
+ {
58
+ "id": "entities",
59
+ "label": "entities",
60
+ "type": "array"
61
+ },
62
+ {
63
+ "id": "topics",
64
+ "label": "topics",
65
+ "type": "array"
66
+ },
67
+ {
68
+ "id": "provider",
69
+ "label": "provider",
70
+ "type": "provider_text"
71
+ },
72
+ {
73
+ "id": "model",
74
+ "label": "model",
75
+ "type": "model"
76
+ }
77
+ ],
78
+ "pinDefaults": {
79
+ "effort": "standard",
80
+ "provider": "",
81
+ "model": ""
82
+ }
83
+ }
84
+ },
85
+ {
86
+ "id": "ask",
87
+ "type": "code",
88
+ "position": {
89
+ "x": 480.0,
90
+ "y": 0.0
91
+ },
92
+ "data": {
93
+ "nodeType": "code",
94
+ "label": "The question",
95
+ "inputs": [
96
+ {
97
+ "id": "exec-in",
98
+ "label": "",
99
+ "type": "execution"
100
+ },
101
+ {
102
+ "id": "question",
103
+ "label": "question",
104
+ "type": "string"
105
+ },
106
+ {
107
+ "id": "prompt",
108
+ "label": "prompt",
109
+ "type": "string"
110
+ },
111
+ {
112
+ "id": "effort",
113
+ "label": "effort",
114
+ "type": "string"
115
+ },
116
+ {
117
+ "id": "permissions",
118
+ "label": "permissions",
119
+ "type": "string"
120
+ }
121
+ ],
122
+ "outputs": [
123
+ {
124
+ "id": "exec-out",
125
+ "label": "",
126
+ "type": "execution"
127
+ },
128
+ {
129
+ "id": "question_text",
130
+ "label": "question_text",
131
+ "type": "string"
132
+ },
133
+ {
134
+ "id": "effort_level",
135
+ "label": "effort_level",
136
+ "type": "string"
137
+ }
138
+ ],
139
+ "pinDefaults": {
140
+ "permissions": "sandbox"
141
+ },
142
+ "functionName": "transform",
143
+ "codeBody": "q = question if isinstance(question, str) and question.strip() else prompt\nif not isinstance(q, str) or not q.strip():\n raise ValueError(\"Ask a question.\")\ne = str(effort or \"standard\").strip().lower()\nif e not in (\"quick\", \"standard\", \"deep\"):\n raise ValueError(\"Effort must be quick, standard or deep.\")\nreturn {\"question_text\": q.strip(), \"effort_level\": e}\n"
144
+ }
145
+ },
146
+ {
147
+ "id": "search_args",
148
+ "type": "code",
149
+ "position": {
150
+ "x": 960.0,
151
+ "y": 0.0
152
+ },
153
+ "data": {
154
+ "nodeType": "code",
155
+ "label": "Search the notes: arguments",
156
+ "inputs": [
157
+ {
158
+ "id": "exec-in",
159
+ "label": "",
160
+ "type": "execution"
161
+ },
162
+ {
163
+ "id": "query",
164
+ "label": "query",
165
+ "type": "string"
166
+ },
167
+ {
168
+ "id": "since",
169
+ "label": "since",
170
+ "type": "string"
171
+ },
172
+ {
173
+ "id": "until",
174
+ "label": "until",
175
+ "type": "string"
176
+ },
177
+ {
178
+ "id": "entities",
179
+ "label": "entities",
180
+ "type": "array"
181
+ },
182
+ {
183
+ "id": "topics",
184
+ "label": "topics",
185
+ "type": "array"
186
+ },
187
+ {
188
+ "id": "limit",
189
+ "label": "limit",
190
+ "type": "number"
191
+ },
192
+ {
193
+ "id": "permissions",
194
+ "label": "permissions",
195
+ "type": "string"
196
+ }
197
+ ],
198
+ "outputs": [
199
+ {
200
+ "id": "exec-out",
201
+ "label": "",
202
+ "type": "execution"
203
+ },
204
+ {
205
+ "id": "tool_calls",
206
+ "label": "tool_calls",
207
+ "type": "array"
208
+ }
209
+ ],
210
+ "pinDefaults": {
211
+ "permissions": "sandbox",
212
+ "limit": 20
213
+ },
214
+ "functionName": "transform",
215
+ "codeBody": "arguments = {}\nif query is not None and query != \"\":\n arguments[\"query\"] = query\nif since is not None and since != \"\":\n arguments[\"since\"] = since\nif until is not None and until != \"\":\n arguments[\"until\"] = until\nif entities is not None and entities != \"\":\n arguments[\"entities\"] = entities\nif topics is not None and topics != \"\":\n arguments[\"topics\"] = topics\nif limit is not None and limit != \"\":\n arguments[\"limit\"] = limit\nreturn {\"tool_calls\": [{\"name\": \"note_search\", \"call_id\": \"search\", \"arguments\": arguments}]}\n"
216
+ }
217
+ },
218
+ {
219
+ "id": "search",
220
+ "type": "tool_calls",
221
+ "position": {
222
+ "x": 1440.0,
223
+ "y": 0.0
224
+ },
225
+ "data": {
226
+ "nodeType": "tool_calls",
227
+ "label": "Search the notes",
228
+ "inputs": [
229
+ {
230
+ "id": "exec-in",
231
+ "label": "",
232
+ "type": "execution"
233
+ },
234
+ {
235
+ "id": "tool_calls",
236
+ "label": "tool_calls",
237
+ "type": "array"
238
+ },
239
+ {
240
+ "id": "allowed_tools",
241
+ "label": "allowed_tools",
242
+ "type": "array"
243
+ }
244
+ ],
245
+ "outputs": [
246
+ {
247
+ "id": "exec-out",
248
+ "label": "",
249
+ "type": "execution"
250
+ },
251
+ {
252
+ "id": "results",
253
+ "label": "results",
254
+ "type": "array"
255
+ },
256
+ {
257
+ "id": "success",
258
+ "label": "success",
259
+ "type": "boolean"
260
+ }
261
+ ],
262
+ "pinDefaults": {
263
+ "allowed_tools": [
264
+ "note_search"
265
+ ]
266
+ },
267
+ "effectConfig": {
268
+ "allowed_tools": [
269
+ "note_search"
270
+ ]
271
+ }
272
+ }
273
+ },
274
+ {
275
+ "id": "search_out",
276
+ "type": "code",
277
+ "position": {
278
+ "x": 1920.0,
279
+ "y": 0.0
280
+ },
281
+ "data": {
282
+ "nodeType": "code",
283
+ "label": "Search the notes: result",
284
+ "inputs": [
285
+ {
286
+ "id": "exec-in",
287
+ "label": "",
288
+ "type": "execution"
289
+ },
290
+ {
291
+ "id": "results",
292
+ "label": "results",
293
+ "type": "array"
294
+ },
295
+ {
296
+ "id": "permissions",
297
+ "label": "permissions",
298
+ "type": "string"
299
+ }
300
+ ],
301
+ "outputs": [
302
+ {
303
+ "id": "exec-out",
304
+ "label": "",
305
+ "type": "execution"
306
+ },
307
+ {
308
+ "id": "notes",
309
+ "label": "notes",
310
+ "type": "array"
311
+ },
312
+ {
313
+ "id": "entities",
314
+ "label": "entities",
315
+ "type": "array"
316
+ },
317
+ {
318
+ "id": "tool_output",
319
+ "label": "tool_output",
320
+ "type": "object"
321
+ }
322
+ ],
323
+ "pinDefaults": {
324
+ "permissions": "sandbox"
325
+ },
326
+ "functionName": "transform",
327
+ "codeBody": "r = results[0] if isinstance(results, list) and results else None\nfailure = None\nout = None\nif not isinstance(r, dict):\n failure = \"note_search returned no result.\"\nelif not r.get(\"success\"):\n failure = str(r.get(\"error\") or \"note_search failed.\")\nelse:\n out = r.get(\"output\")\n if not isinstance(out, dict):\n failure = \"note_search returned something other than an object.\"\nif failure is not None:\n raise ValueError(failure)\nreturn dict(out, tool_output=out)\n"
328
+ }
329
+ },
330
+ {
331
+ "id": "by_effort",
332
+ "type": "switch",
333
+ "position": {
334
+ "x": 2400.0,
335
+ "y": 0.0
336
+ },
337
+ "data": {
338
+ "nodeType": "switch",
339
+ "label": "How hard to think",
340
+ "inputs": [
341
+ {
342
+ "id": "exec-in",
343
+ "label": "",
344
+ "type": "execution"
345
+ },
346
+ {
347
+ "id": "value",
348
+ "label": "value",
349
+ "type": "string"
350
+ }
351
+ ],
352
+ "outputs": [
353
+ {
354
+ "id": "case:quick",
355
+ "label": "quick",
356
+ "type": "execution"
357
+ },
358
+ {
359
+ "id": "case:standard",
360
+ "label": "standard",
361
+ "type": "execution"
362
+ },
363
+ {
364
+ "id": "case:deep",
365
+ "label": "deep",
366
+ "type": "execution"
367
+ },
368
+ {
369
+ "id": "default",
370
+ "label": "default",
371
+ "type": "execution"
372
+ }
373
+ ],
374
+ "switchConfig": {
375
+ "cases": [
376
+ {
377
+ "id": "quick",
378
+ "value": "quick"
379
+ },
380
+ {
381
+ "id": "standard",
382
+ "value": "standard"
383
+ },
384
+ {
385
+ "id": "deep",
386
+ "value": "deep"
387
+ }
388
+ ]
389
+ }
390
+ }
391
+ },
392
+ {
393
+ "id": "quick",
394
+ "type": "code",
395
+ "position": {
396
+ "x": 2880.0,
397
+ "y": 0.0
398
+ },
399
+ "data": {
400
+ "nodeType": "code",
401
+ "label": "List what was found",
402
+ "inputs": [
403
+ {
404
+ "id": "exec-in",
405
+ "label": "",
406
+ "type": "execution"
407
+ },
408
+ {
409
+ "id": "notes",
410
+ "label": "notes",
411
+ "type": "array"
412
+ },
413
+ {
414
+ "id": "permissions",
415
+ "label": "permissions",
416
+ "type": "string"
417
+ }
418
+ ],
419
+ "outputs": [
420
+ {
421
+ "id": "exec-out",
422
+ "label": "",
423
+ "type": "execution"
424
+ },
425
+ {
426
+ "id": "response",
427
+ "label": "response",
428
+ "type": "string"
429
+ },
430
+ {
431
+ "id": "answer",
432
+ "label": "answer",
433
+ "type": "string"
434
+ },
435
+ {
436
+ "id": "evidence",
437
+ "label": "evidence",
438
+ "type": "array"
439
+ },
440
+ {
441
+ "id": "evolution",
442
+ "label": "evolution",
443
+ "type": "object"
444
+ },
445
+ {
446
+ "id": "open_loops",
447
+ "label": "open_loops",
448
+ "type": "array"
449
+ },
450
+ {
451
+ "id": "follow_ups",
452
+ "label": "follow_ups",
453
+ "type": "array"
454
+ },
455
+ {
456
+ "id": "dossier_note_id",
457
+ "label": "dossier_note_id",
458
+ "type": "string"
459
+ }
460
+ ],
461
+ "pinDefaults": {
462
+ "permissions": "sandbox"
463
+ },
464
+ "functionName": "transform",
465
+ "codeBody": "found = [n for n in (notes or []) if isinstance(n, dict)]\nevidence = [{\"note_id\": n.get(\"note_id\"), \"title\": n.get(\"title\"), \"kind\": n.get(\"kind\"),\n \"occurred_at\": n.get(\"occurred_at\"), \"excerpt\": n.get(\"excerpt\")} for n in found]\nif not found:\n text = \"I found nothing in your notes about that.\"\nelse:\n items = [\"\\u201c\" + str(n.get(\"title\") or \"Untitled\") + \"\\u201d (\" + str(n.get(\"occurred_at\") or \"\")[:10] + \") [\" + str(n.get(\"note_id\")) + \"]\" for n in found[:5]]\n text = \"I found \" + str(len(found)) + (\" note: \" if len(found) == 1 else \" notes: \") + \"; \".join(items) + \".\"\nreturn {\"response\": text, \"answer\": text, \"evidence\": evidence, \"evolution\": {}, \"open_loops\": [],\n \"follow_ups\": [], \"dossier_note_id\": None}\n"
466
+ }
467
+ },
468
+ {
469
+ "id": "end_quick",
470
+ "type": "on_flow_end",
471
+ "position": {
472
+ "x": 3360.0,
473
+ "y": 0.0
474
+ },
475
+ "data": {
476
+ "nodeType": "on_flow_end",
477
+ "label": "Done (quick)",
478
+ "inputs": [
479
+ {
480
+ "id": "exec-in",
481
+ "label": "",
482
+ "type": "execution"
483
+ },
484
+ {
485
+ "id": "response",
486
+ "label": "response",
487
+ "type": "string"
488
+ },
489
+ {
490
+ "id": "answer",
491
+ "label": "answer",
492
+ "type": "string"
493
+ },
494
+ {
495
+ "id": "evidence",
496
+ "label": "evidence",
497
+ "type": "array"
498
+ },
499
+ {
500
+ "id": "evolution",
501
+ "label": "evolution",
502
+ "type": "object"
503
+ },
504
+ {
505
+ "id": "open_loops",
506
+ "label": "open_loops",
507
+ "type": "array"
508
+ },
509
+ {
510
+ "id": "follow_ups",
511
+ "label": "follow_ups",
512
+ "type": "array"
513
+ },
514
+ {
515
+ "id": "dossier_note_id",
516
+ "label": "dossier_note_id",
517
+ "type": "string"
518
+ },
519
+ {
520
+ "id": "hits",
521
+ "label": "hits",
522
+ "type": "object"
523
+ },
524
+ {
525
+ "id": "effort",
526
+ "label": "effort",
527
+ "type": "string"
528
+ }
529
+ ],
530
+ "outputs": [],
531
+ "pinDefaults": {
532
+ "effort": "quick"
533
+ }
534
+ }
535
+ },
536
+ {
537
+ "id": "ids",
538
+ "type": "code",
539
+ "position": {
540
+ "x": 2400.0,
541
+ "y": 320.0
542
+ },
543
+ "data": {
544
+ "nodeType": "code",
545
+ "label": "Notes and entities found",
546
+ "inputs": [
547
+ {
548
+ "id": "notes",
549
+ "label": "notes",
550
+ "type": "array"
551
+ },
552
+ {
553
+ "id": "entities",
554
+ "label": "entities",
555
+ "type": "array"
556
+ },
557
+ {
558
+ "id": "permissions",
559
+ "label": "permissions",
560
+ "type": "string"
561
+ }
562
+ ],
563
+ "outputs": [
564
+ {
565
+ "id": "note_ids",
566
+ "label": "note_ids",
567
+ "type": "array"
568
+ },
569
+ {
570
+ "id": "entity_ids",
571
+ "label": "entity_ids",
572
+ "type": "array"
573
+ }
574
+ ],
575
+ "pinDefaults": {
576
+ "permissions": "sandbox"
577
+ },
578
+ "functionName": "transform",
579
+ "codeBody": "return {\"note_ids\": [n.get(\"note_id\") for n in (notes or []) if isinstance(n, dict) and n.get(\"note_id\")],\n \"entity_ids\": [x.get(\"entity_id\") for x in (entities or []) if isinstance(x, dict) and x.get(\"entity_id\")]}\n"
580
+ }
581
+ },
582
+ {
583
+ "id": "expand_args",
584
+ "type": "code",
585
+ "position": {
586
+ "x": 2880.0,
587
+ "y": 372.0
588
+ },
589
+ "data": {
590
+ "nodeType": "code",
591
+ "label": "Look closer: arguments",
592
+ "inputs": [
593
+ {
594
+ "id": "exec-in",
595
+ "label": "",
596
+ "type": "execution"
597
+ },
598
+ {
599
+ "id": "note_ids",
600
+ "label": "note_ids",
601
+ "type": "array"
602
+ },
603
+ {
604
+ "id": "entity_ids",
605
+ "label": "entity_ids",
606
+ "type": "array"
607
+ },
608
+ {
609
+ "id": "as_of",
610
+ "label": "as_of",
611
+ "type": "string"
612
+ },
613
+ {
614
+ "id": "permissions",
615
+ "label": "permissions",
616
+ "type": "string"
617
+ }
618
+ ],
619
+ "outputs": [
620
+ {
621
+ "id": "exec-out",
622
+ "label": "",
623
+ "type": "execution"
624
+ },
625
+ {
626
+ "id": "tool_calls",
627
+ "label": "tool_calls",
628
+ "type": "array"
629
+ }
630
+ ],
631
+ "pinDefaults": {
632
+ "permissions": "sandbox"
633
+ },
634
+ "functionName": "transform",
635
+ "codeBody": "arguments = {}\nif note_ids is not None and note_ids != \"\":\n arguments[\"note_ids\"] = note_ids\nif entity_ids is not None and entity_ids != \"\":\n arguments[\"entity_ids\"] = entity_ids\nif as_of is not None and as_of != \"\":\n arguments[\"as_of\"] = as_of\nreturn {\"tool_calls\": [{\"name\": \"note_expand\", \"call_id\": \"expand\", \"arguments\": arguments}]}\n"
636
+ }
637
+ },
638
+ {
639
+ "id": "expand",
640
+ "type": "tool_calls",
641
+ "position": {
642
+ "x": 3360.0,
643
+ "y": 424.0
644
+ },
645
+ "data": {
646
+ "nodeType": "tool_calls",
647
+ "label": "Look closer",
648
+ "inputs": [
649
+ {
650
+ "id": "exec-in",
651
+ "label": "",
652
+ "type": "execution"
653
+ },
654
+ {
655
+ "id": "tool_calls",
656
+ "label": "tool_calls",
657
+ "type": "array"
658
+ },
659
+ {
660
+ "id": "allowed_tools",
661
+ "label": "allowed_tools",
662
+ "type": "array"
663
+ }
664
+ ],
665
+ "outputs": [
666
+ {
667
+ "id": "exec-out",
668
+ "label": "",
669
+ "type": "execution"
670
+ },
671
+ {
672
+ "id": "results",
673
+ "label": "results",
674
+ "type": "array"
675
+ },
676
+ {
677
+ "id": "success",
678
+ "label": "success",
679
+ "type": "boolean"
680
+ }
681
+ ],
682
+ "pinDefaults": {
683
+ "allowed_tools": [
684
+ "note_expand"
685
+ ]
686
+ },
687
+ "effectConfig": {
688
+ "allowed_tools": [
689
+ "note_expand"
690
+ ]
691
+ }
692
+ }
693
+ },
694
+ {
695
+ "id": "expand_out",
696
+ "type": "code",
697
+ "position": {
698
+ "x": 3840.0,
699
+ "y": 0.0
700
+ },
701
+ "data": {
702
+ "nodeType": "code",
703
+ "label": "Look closer: result",
704
+ "inputs": [
705
+ {
706
+ "id": "exec-in",
707
+ "label": "",
708
+ "type": "execution"
709
+ },
710
+ {
711
+ "id": "results",
712
+ "label": "results",
713
+ "type": "array"
714
+ },
715
+ {
716
+ "id": "permissions",
717
+ "label": "permissions",
718
+ "type": "string"
719
+ }
720
+ ],
721
+ "outputs": [
722
+ {
723
+ "id": "exec-out",
724
+ "label": "",
725
+ "type": "execution"
726
+ },
727
+ {
728
+ "id": "tool_output",
729
+ "label": "tool_output",
730
+ "type": "object"
731
+ }
732
+ ],
733
+ "pinDefaults": {
734
+ "permissions": "sandbox"
735
+ },
736
+ "functionName": "transform",
737
+ "codeBody": "r = results[0] if isinstance(results, list) and results else None\nfailure = None\nout = None\nif not isinstance(r, dict):\n failure = \"note_expand returned no result.\"\nelif not r.get(\"success\"):\n failure = str(r.get(\"error\") or \"note_expand failed.\")\nelse:\n out = r.get(\"output\")\n if not isinstance(out, dict):\n failure = \"note_expand returned something other than an object.\"\nif failure is not None:\n raise ValueError(failure)\nreturn dict(out, tool_output=out)\n"
738
+ }
739
+ },
740
+ {
741
+ "id": "answer_prompt",
742
+ "type": "string_template",
743
+ "position": {
744
+ "x": 3840.0,
745
+ "y": 320.0
746
+ },
747
+ "data": {
748
+ "nodeType": "string_template",
749
+ "label": "Answer prompt",
750
+ "inputs": [
751
+ {
752
+ "id": "template",
753
+ "label": "template",
754
+ "type": "string"
755
+ },
756
+ {
757
+ "id": "question",
758
+ "label": "question",
759
+ "type": "any"
760
+ },
761
+ {
762
+ "id": "as_of",
763
+ "label": "as_of",
764
+ "type": "any"
765
+ },
766
+ {
767
+ "id": "hits",
768
+ "label": "hits",
769
+ "type": "any"
770
+ },
771
+ {
772
+ "id": "expansion",
773
+ "label": "expansion",
774
+ "type": "any"
775
+ }
776
+ ],
777
+ "outputs": [
778
+ {
779
+ "id": "result",
780
+ "label": "result",
781
+ "type": "string"
782
+ }
783
+ ],
784
+ "pinDefaults": {
785
+ "template": "You answer a question from a person's own notes.\n\nQuestion: {{question}}\nAs of: {{as_of}}\n\nSearch results:\n{{hits}}\n\nEntity cards, claim timelines, relation timelines and then-versus-now pairs:\n{{expansion}}\n\nWrite the `answer` with inline citations like [nt_...] using only the note ids above. Then give the `evidence` (note id, title, date, excerpt), what changed over time (`evolution`: the earliest stance, the latest stance, and the turning points with their note ids), the related `open_loops`, and up to three `follow_ups` worth asking next. When the notes do not answer the question, say so plainly in the answer.\n\nRules:\n- Use only the material above; never invent notes, people or dates.\n- Prefer the latest belief, and say when it changed and why.\n- Output JSON only, matching the schema.\n"
786
+ }
787
+ }
788
+ },
789
+ {
790
+ "id": "synthesize",
791
+ "type": "llm_call",
792
+ "position": {
793
+ "x": 4320.0,
794
+ "y": 0.0
795
+ },
796
+ "data": {
797
+ "nodeType": "llm_call",
798
+ "label": "Answer",
799
+ "inputs": [
800
+ {
801
+ "id": "exec-in",
802
+ "label": "",
803
+ "type": "execution"
804
+ },
805
+ {
806
+ "id": "provider",
807
+ "label": "provider",
808
+ "type": "provider_text"
809
+ },
810
+ {
811
+ "id": "model",
812
+ "label": "model",
813
+ "type": "model"
814
+ },
815
+ {
816
+ "id": "system",
817
+ "label": "system",
818
+ "type": "string"
819
+ },
820
+ {
821
+ "id": "prompt",
822
+ "label": "prompt",
823
+ "type": "string"
824
+ },
825
+ {
826
+ "id": "tools",
827
+ "label": "tools",
828
+ "type": "tools"
829
+ },
830
+ {
831
+ "id": "temperature",
832
+ "label": "temperature",
833
+ "type": "number"
834
+ },
835
+ {
836
+ "id": "resp_schema",
837
+ "label": "resp_schema",
838
+ "type": "json_schema"
839
+ }
840
+ ],
841
+ "outputs": [
842
+ {
843
+ "id": "exec-out",
844
+ "label": "",
845
+ "type": "execution"
846
+ },
847
+ {
848
+ "id": "response",
849
+ "label": "response",
850
+ "type": "string"
851
+ },
852
+ {
853
+ "id": "data",
854
+ "label": "data",
855
+ "type": "object"
856
+ },
857
+ {
858
+ "id": "success",
859
+ "label": "success",
860
+ "type": "boolean"
861
+ },
862
+ {
863
+ "id": "meta",
864
+ "label": "meta",
865
+ "type": "object"
866
+ },
867
+ {
868
+ "id": "tool_calls",
869
+ "label": "tool_calls",
870
+ "type": "array"
871
+ }
872
+ ],
873
+ "pinDefaults": {
874
+ "tools": [],
875
+ "system": "You answer questions from a person's notes. Output JSON only, matching the schema.",
876
+ "temperature": 0.2,
877
+ "resp_schema": {
878
+ "type": "object",
879
+ "properties": {
880
+ "answer": {
881
+ "type": "string",
882
+ "description": "the answer with inline citations [nt_...]"
883
+ },
884
+ "evidence": {
885
+ "type": "array",
886
+ "items": {
887
+ "type": "object",
888
+ "properties": {
889
+ "note_id": {
890
+ "type": "string"
891
+ },
892
+ "title": {
893
+ "type": "string"
894
+ },
895
+ "occurred_at": {
896
+ "type": "string"
897
+ },
898
+ "excerpt": {
899
+ "type": "string"
900
+ }
901
+ },
902
+ "required": [
903
+ "note_id",
904
+ "title",
905
+ "occurred_at",
906
+ "excerpt"
907
+ ]
908
+ }
909
+ },
910
+ "evolution": {
911
+ "type": "object",
912
+ "properties": {
913
+ "earliest": {
914
+ "type": "string",
915
+ "description": "the earliest stance"
916
+ },
917
+ "latest": {
918
+ "type": "string",
919
+ "description": "the latest stance"
920
+ },
921
+ "turning_points": {
922
+ "type": "array",
923
+ "items": {
924
+ "type": "object",
925
+ "properties": {
926
+ "note_id": {
927
+ "type": "string"
928
+ },
929
+ "occurred_at": {
930
+ "type": "string"
931
+ },
932
+ "change": {
933
+ "type": "string"
934
+ }
935
+ },
936
+ "required": [
937
+ "note_id",
938
+ "occurred_at",
939
+ "change"
940
+ ]
941
+ }
942
+ }
943
+ },
944
+ "required": [
945
+ "earliest",
946
+ "latest",
947
+ "turning_points"
948
+ ]
949
+ },
950
+ "open_loops": {
951
+ "type": "array",
952
+ "items": {
953
+ "type": "string"
954
+ }
955
+ },
956
+ "follow_ups": {
957
+ "type": "array",
958
+ "items": {
959
+ "type": "string"
960
+ }
961
+ }
962
+ },
963
+ "required": [
964
+ "answer",
965
+ "evidence",
966
+ "evolution",
967
+ "open_loops",
968
+ "follow_ups"
969
+ ]
970
+ }
971
+ }
972
+ }
973
+ },
974
+ {
975
+ "id": "standard",
976
+ "type": "code",
977
+ "position": {
978
+ "x": 4800.0,
979
+ "y": 0.0
980
+ },
981
+ "data": {
982
+ "nodeType": "code",
983
+ "label": "Shape the answer",
984
+ "inputs": [
985
+ {
986
+ "id": "exec-in",
987
+ "label": "",
988
+ "type": "execution"
989
+ },
990
+ {
991
+ "id": "data",
992
+ "label": "data",
993
+ "type": "object"
994
+ },
995
+ {
996
+ "id": "notes",
997
+ "label": "notes",
998
+ "type": "array"
999
+ },
1000
+ {
1001
+ "id": "permissions",
1002
+ "label": "permissions",
1003
+ "type": "string"
1004
+ }
1005
+ ],
1006
+ "outputs": [
1007
+ {
1008
+ "id": "exec-out",
1009
+ "label": "",
1010
+ "type": "execution"
1011
+ },
1012
+ {
1013
+ "id": "response",
1014
+ "label": "response",
1015
+ "type": "string"
1016
+ },
1017
+ {
1018
+ "id": "answer",
1019
+ "label": "answer",
1020
+ "type": "string"
1021
+ },
1022
+ {
1023
+ "id": "evidence",
1024
+ "label": "evidence",
1025
+ "type": "array"
1026
+ },
1027
+ {
1028
+ "id": "evolution",
1029
+ "label": "evolution",
1030
+ "type": "object"
1031
+ },
1032
+ {
1033
+ "id": "open_loops",
1034
+ "label": "open_loops",
1035
+ "type": "array"
1036
+ },
1037
+ {
1038
+ "id": "follow_ups",
1039
+ "label": "follow_ups",
1040
+ "type": "array"
1041
+ },
1042
+ {
1043
+ "id": "dossier_note_id",
1044
+ "label": "dossier_note_id",
1045
+ "type": "string"
1046
+ }
1047
+ ],
1048
+ "pinDefaults": {
1049
+ "permissions": "sandbox"
1050
+ },
1051
+ "functionName": "transform",
1052
+ "codeBody": "d = data if isinstance(data, dict) else {}\ntext = str(d.get(\"answer\") or \"\").strip()\nif not text:\n raise ValueError(\"The answer came back empty.\")\nfound = {n.get(\"note_id\"): n for n in (notes or []) if isinstance(n, dict) and n.get(\"note_id\")}\nevidence, seen = [], set()\nfor e in d.get(\"evidence\") or []:\n n = found.get(e.get(\"note_id\")) if isinstance(e, dict) else None\n if n is None or n[\"note_id\"] in seen:\n continue\n seen.add(n[\"note_id\"])\n evidence.append({\"note_id\": n[\"note_id\"], \"title\": n.get(\"title\"), \"kind\": n.get(\"kind\"),\n \"occurred_at\": n.get(\"occurred_at\"), \"excerpt\": e.get(\"excerpt\") or n.get(\"excerpt\")})\nreturn {\"response\": text, \"answer\": text, \"evidence\": evidence,\n \"evolution\": d.get(\"evolution\") or {}, \"open_loops\": d.get(\"open_loops\") or [],\n \"follow_ups\": d.get(\"follow_ups\") or [], \"dossier_note_id\": None}\n"
1053
+ }
1054
+ },
1055
+ {
1056
+ "id": "end_standard",
1057
+ "type": "on_flow_end",
1058
+ "position": {
1059
+ "x": 5280.0,
1060
+ "y": 0.0
1061
+ },
1062
+ "data": {
1063
+ "nodeType": "on_flow_end",
1064
+ "label": "Done (standard)",
1065
+ "inputs": [
1066
+ {
1067
+ "id": "exec-in",
1068
+ "label": "",
1069
+ "type": "execution"
1070
+ },
1071
+ {
1072
+ "id": "response",
1073
+ "label": "response",
1074
+ "type": "string"
1075
+ },
1076
+ {
1077
+ "id": "answer",
1078
+ "label": "answer",
1079
+ "type": "string"
1080
+ },
1081
+ {
1082
+ "id": "evidence",
1083
+ "label": "evidence",
1084
+ "type": "array"
1085
+ },
1086
+ {
1087
+ "id": "evolution",
1088
+ "label": "evolution",
1089
+ "type": "object"
1090
+ },
1091
+ {
1092
+ "id": "open_loops",
1093
+ "label": "open_loops",
1094
+ "type": "array"
1095
+ },
1096
+ {
1097
+ "id": "follow_ups",
1098
+ "label": "follow_ups",
1099
+ "type": "array"
1100
+ },
1101
+ {
1102
+ "id": "dossier_note_id",
1103
+ "label": "dossier_note_id",
1104
+ "type": "string"
1105
+ },
1106
+ {
1107
+ "id": "hits",
1108
+ "label": "hits",
1109
+ "type": "object"
1110
+ },
1111
+ {
1112
+ "id": "effort",
1113
+ "label": "effort",
1114
+ "type": "string"
1115
+ }
1116
+ ],
1117
+ "outputs": [],
1118
+ "pinDefaults": {
1119
+ "effort": "standard"
1120
+ }
1121
+ }
1122
+ },
1123
+ {
1124
+ "id": "mine",
1125
+ "type": "subflow",
1126
+ "position": {
1127
+ "x": 2880.0,
1128
+ "y": 692.0
1129
+ },
1130
+ "data": {
1131
+ "nodeType": "subflow",
1132
+ "label": "Dig through time",
1133
+ "inputs": [
1134
+ {
1135
+ "id": "exec-in",
1136
+ "label": "",
1137
+ "type": "execution"
1138
+ },
1139
+ {
1140
+ "id": "inherit_context",
1141
+ "label": "inherit_context",
1142
+ "type": "boolean"
1143
+ },
1144
+ {
1145
+ "id": "question",
1146
+ "label": "question",
1147
+ "type": "string"
1148
+ },
1149
+ {
1150
+ "id": "since",
1151
+ "label": "since",
1152
+ "type": "string"
1153
+ },
1154
+ {
1155
+ "id": "until",
1156
+ "label": "until",
1157
+ "type": "string"
1158
+ },
1159
+ {
1160
+ "id": "provider",
1161
+ "label": "provider",
1162
+ "type": "provider_text"
1163
+ },
1164
+ {
1165
+ "id": "model",
1166
+ "label": "model",
1167
+ "type": "model"
1168
+ }
1169
+ ],
1170
+ "outputs": [
1171
+ {
1172
+ "id": "exec-out",
1173
+ "label": "",
1174
+ "type": "execution"
1175
+ },
1176
+ {
1177
+ "id": "output",
1178
+ "label": "output",
1179
+ "type": "object"
1180
+ },
1181
+ {
1182
+ "id": "child_output",
1183
+ "label": "child_output",
1184
+ "type": "object"
1185
+ },
1186
+ {
1187
+ "id": "response",
1188
+ "label": "response",
1189
+ "type": "string"
1190
+ },
1191
+ {
1192
+ "id": "answer",
1193
+ "label": "answer",
1194
+ "type": "string"
1195
+ },
1196
+ {
1197
+ "id": "evidence",
1198
+ "label": "evidence",
1199
+ "type": "array"
1200
+ },
1201
+ {
1202
+ "id": "evolution",
1203
+ "label": "evolution",
1204
+ "type": "object"
1205
+ },
1206
+ {
1207
+ "id": "open_loops",
1208
+ "label": "open_loops",
1209
+ "type": "array"
1210
+ },
1211
+ {
1212
+ "id": "follow_ups",
1213
+ "label": "follow_ups",
1214
+ "type": "array"
1215
+ },
1216
+ {
1217
+ "id": "dossier_note_id",
1218
+ "label": "dossier_note_id",
1219
+ "type": "string"
1220
+ }
1221
+ ],
1222
+ "pinDefaults": {
1223
+ "inherit_context": false
1224
+ },
1225
+ "subflowId": "note-mine"
1226
+ }
1227
+ },
1228
+ {
1229
+ "id": "mine_ok",
1230
+ "type": "code",
1231
+ "position": {
1232
+ "x": 3360.0,
1233
+ "y": 744.0
1234
+ },
1235
+ "data": {
1236
+ "nodeType": "code",
1237
+ "label": "Dug through?",
1238
+ "inputs": [
1239
+ {
1240
+ "id": "exec-in",
1241
+ "label": "",
1242
+ "type": "execution"
1243
+ },
1244
+ {
1245
+ "id": "output",
1246
+ "label": "output",
1247
+ "type": "object"
1248
+ },
1249
+ {
1250
+ "id": "child_output",
1251
+ "label": "child_output",
1252
+ "type": "object"
1253
+ },
1254
+ {
1255
+ "id": "permissions",
1256
+ "label": "permissions",
1257
+ "type": "string"
1258
+ }
1259
+ ],
1260
+ "outputs": [
1261
+ {
1262
+ "id": "exec-out",
1263
+ "label": "",
1264
+ "type": "execution"
1265
+ },
1266
+ {
1267
+ "id": "checked",
1268
+ "label": "checked",
1269
+ "type": "boolean"
1270
+ }
1271
+ ],
1272
+ "pinDefaults": {
1273
+ "permissions": "sandbox"
1274
+ },
1275
+ "functionName": "transform",
1276
+ "codeBody": "o = output if isinstance(output, dict) else {}\nc = child_output if isinstance(child_output, dict) else {}\nif c.get(\"success\") is False or o.get(\"success\") is False:\n err = str(c.get(\"error\") or o.get(\"error\") or \"The step could not finish.\")\n for prefix in (\"Runtime error: \", \"Execution error: \"):\n if err.startswith(prefix):\n err = err[len(prefix):]\n raise ValueError(err)\nreturn {\"checked\": True}\n"
1277
+ }
1278
+ },
1279
+ {
1280
+ "id": "end_deep",
1281
+ "type": "on_flow_end",
1282
+ "position": {
1283
+ "x": 3840.0,
1284
+ "y": 640.0
1285
+ },
1286
+ "data": {
1287
+ "nodeType": "on_flow_end",
1288
+ "label": "Done (deep)",
1289
+ "inputs": [
1290
+ {
1291
+ "id": "exec-in",
1292
+ "label": "",
1293
+ "type": "execution"
1294
+ },
1295
+ {
1296
+ "id": "response",
1297
+ "label": "response",
1298
+ "type": "string"
1299
+ },
1300
+ {
1301
+ "id": "answer",
1302
+ "label": "answer",
1303
+ "type": "string"
1304
+ },
1305
+ {
1306
+ "id": "evidence",
1307
+ "label": "evidence",
1308
+ "type": "array"
1309
+ },
1310
+ {
1311
+ "id": "evolution",
1312
+ "label": "evolution",
1313
+ "type": "object"
1314
+ },
1315
+ {
1316
+ "id": "open_loops",
1317
+ "label": "open_loops",
1318
+ "type": "array"
1319
+ },
1320
+ {
1321
+ "id": "follow_ups",
1322
+ "label": "follow_ups",
1323
+ "type": "array"
1324
+ },
1325
+ {
1326
+ "id": "dossier_note_id",
1327
+ "label": "dossier_note_id",
1328
+ "type": "string"
1329
+ },
1330
+ {
1331
+ "id": "hits",
1332
+ "label": "hits",
1333
+ "type": "object"
1334
+ },
1335
+ {
1336
+ "id": "effort",
1337
+ "label": "effort",
1338
+ "type": "string"
1339
+ }
1340
+ ],
1341
+ "outputs": [],
1342
+ "pinDefaults": {
1343
+ "effort": "deep"
1344
+ }
1345
+ }
1346
+ }
1347
+ ],
1348
+ "edges": [
1349
+ {
1350
+ "id": "e-start-question-ask-question",
1351
+ "source": "start",
1352
+ "sourceHandle": "question",
1353
+ "target": "ask",
1354
+ "targetHandle": "question"
1355
+ },
1356
+ {
1357
+ "id": "e-start-prompt-ask-prompt",
1358
+ "source": "start",
1359
+ "sourceHandle": "prompt",
1360
+ "target": "ask",
1361
+ "targetHandle": "prompt"
1362
+ },
1363
+ {
1364
+ "id": "e-start-effort-ask-effort",
1365
+ "source": "start",
1366
+ "sourceHandle": "effort",
1367
+ "target": "ask",
1368
+ "targetHandle": "effort"
1369
+ },
1370
+ {
1371
+ "id": "e-start-exec-out-ask-exec-in",
1372
+ "source": "start",
1373
+ "sourceHandle": "exec-out",
1374
+ "target": "ask",
1375
+ "targetHandle": "exec-in"
1376
+ },
1377
+ {
1378
+ "id": "e-ask-question_text-search_args-query",
1379
+ "source": "ask",
1380
+ "sourceHandle": "question_text",
1381
+ "target": "search_args",
1382
+ "targetHandle": "query"
1383
+ },
1384
+ {
1385
+ "id": "e-start-since-search_args-since",
1386
+ "source": "start",
1387
+ "sourceHandle": "since",
1388
+ "target": "search_args",
1389
+ "targetHandle": "since"
1390
+ },
1391
+ {
1392
+ "id": "e-start-until-search_args-until",
1393
+ "source": "start",
1394
+ "sourceHandle": "until",
1395
+ "target": "search_args",
1396
+ "targetHandle": "until"
1397
+ },
1398
+ {
1399
+ "id": "e-start-entities-search_args-entities",
1400
+ "source": "start",
1401
+ "sourceHandle": "entities",
1402
+ "target": "search_args",
1403
+ "targetHandle": "entities"
1404
+ },
1405
+ {
1406
+ "id": "e-start-topics-search_args-topics",
1407
+ "source": "start",
1408
+ "sourceHandle": "topics",
1409
+ "target": "search_args",
1410
+ "targetHandle": "topics"
1411
+ },
1412
+ {
1413
+ "id": "e-ask-exec-out-search_args-exec-in",
1414
+ "source": "ask",
1415
+ "sourceHandle": "exec-out",
1416
+ "target": "search_args",
1417
+ "targetHandle": "exec-in"
1418
+ },
1419
+ {
1420
+ "id": "e-search_args-tool_calls-search-tool_calls",
1421
+ "source": "search_args",
1422
+ "sourceHandle": "tool_calls",
1423
+ "target": "search",
1424
+ "targetHandle": "tool_calls"
1425
+ },
1426
+ {
1427
+ "id": "e-search_args-exec-out-search-exec-in",
1428
+ "source": "search_args",
1429
+ "sourceHandle": "exec-out",
1430
+ "target": "search",
1431
+ "targetHandle": "exec-in"
1432
+ },
1433
+ {
1434
+ "id": "e-search-results-search_out-results",
1435
+ "source": "search",
1436
+ "sourceHandle": "results",
1437
+ "target": "search_out",
1438
+ "targetHandle": "results"
1439
+ },
1440
+ {
1441
+ "id": "e-search-exec-out-search_out-exec-in",
1442
+ "source": "search",
1443
+ "sourceHandle": "exec-out",
1444
+ "target": "search_out",
1445
+ "targetHandle": "exec-in"
1446
+ },
1447
+ {
1448
+ "id": "e-ask-effort_level-by_effort-value",
1449
+ "source": "ask",
1450
+ "sourceHandle": "effort_level",
1451
+ "target": "by_effort",
1452
+ "targetHandle": "value"
1453
+ },
1454
+ {
1455
+ "id": "e-search_out-exec-out-by_effort-exec-in",
1456
+ "source": "search_out",
1457
+ "sourceHandle": "exec-out",
1458
+ "target": "by_effort",
1459
+ "targetHandle": "exec-in"
1460
+ },
1461
+ {
1462
+ "id": "e-search_out-notes-quick-notes",
1463
+ "source": "search_out",
1464
+ "sourceHandle": "notes",
1465
+ "target": "quick",
1466
+ "targetHandle": "notes"
1467
+ },
1468
+ {
1469
+ "id": "e-by_effort-case-quick-quick-exec-in",
1470
+ "source": "by_effort",
1471
+ "sourceHandle": "case:quick",
1472
+ "target": "quick",
1473
+ "targetHandle": "exec-in"
1474
+ },
1475
+ {
1476
+ "id": "e-quick-response-end_quick-response",
1477
+ "source": "quick",
1478
+ "sourceHandle": "response",
1479
+ "target": "end_quick",
1480
+ "targetHandle": "response"
1481
+ },
1482
+ {
1483
+ "id": "e-quick-answer-end_quick-answer",
1484
+ "source": "quick",
1485
+ "sourceHandle": "answer",
1486
+ "target": "end_quick",
1487
+ "targetHandle": "answer"
1488
+ },
1489
+ {
1490
+ "id": "e-quick-evidence-end_quick-evidence",
1491
+ "source": "quick",
1492
+ "sourceHandle": "evidence",
1493
+ "target": "end_quick",
1494
+ "targetHandle": "evidence"
1495
+ },
1496
+ {
1497
+ "id": "e-quick-evolution-end_quick-evolution",
1498
+ "source": "quick",
1499
+ "sourceHandle": "evolution",
1500
+ "target": "end_quick",
1501
+ "targetHandle": "evolution"
1502
+ },
1503
+ {
1504
+ "id": "e-quick-open_loops-end_quick-open_loops",
1505
+ "source": "quick",
1506
+ "sourceHandle": "open_loops",
1507
+ "target": "end_quick",
1508
+ "targetHandle": "open_loops"
1509
+ },
1510
+ {
1511
+ "id": "e-quick-follow_ups-end_quick-follow_ups",
1512
+ "source": "quick",
1513
+ "sourceHandle": "follow_ups",
1514
+ "target": "end_quick",
1515
+ "targetHandle": "follow_ups"
1516
+ },
1517
+ {
1518
+ "id": "e-quick-dossier_note_id-end_quick-dossier_note_id",
1519
+ "source": "quick",
1520
+ "sourceHandle": "dossier_note_id",
1521
+ "target": "end_quick",
1522
+ "targetHandle": "dossier_note_id"
1523
+ },
1524
+ {
1525
+ "id": "e-search_out-tool_output-end_quick-hits",
1526
+ "source": "search_out",
1527
+ "sourceHandle": "tool_output",
1528
+ "target": "end_quick",
1529
+ "targetHandle": "hits"
1530
+ },
1531
+ {
1532
+ "id": "e-quick-exec-out-end_quick-exec-in",
1533
+ "source": "quick",
1534
+ "sourceHandle": "exec-out",
1535
+ "target": "end_quick",
1536
+ "targetHandle": "exec-in"
1537
+ },
1538
+ {
1539
+ "id": "e-search_out-notes-ids-notes",
1540
+ "source": "search_out",
1541
+ "sourceHandle": "notes",
1542
+ "target": "ids",
1543
+ "targetHandle": "notes"
1544
+ },
1545
+ {
1546
+ "id": "e-search_out-entities-ids-entities",
1547
+ "source": "search_out",
1548
+ "sourceHandle": "entities",
1549
+ "target": "ids",
1550
+ "targetHandle": "entities"
1551
+ },
1552
+ {
1553
+ "id": "e-ids-note_ids-expand_args-note_ids",
1554
+ "source": "ids",
1555
+ "sourceHandle": "note_ids",
1556
+ "target": "expand_args",
1557
+ "targetHandle": "note_ids"
1558
+ },
1559
+ {
1560
+ "id": "e-ids-entity_ids-expand_args-entity_ids",
1561
+ "source": "ids",
1562
+ "sourceHandle": "entity_ids",
1563
+ "target": "expand_args",
1564
+ "targetHandle": "entity_ids"
1565
+ },
1566
+ {
1567
+ "id": "e-start-as_of-expand_args-as_of",
1568
+ "source": "start",
1569
+ "sourceHandle": "as_of",
1570
+ "target": "expand_args",
1571
+ "targetHandle": "as_of"
1572
+ },
1573
+ {
1574
+ "id": "e-by_effort-case-standard-expand_args-exec-in",
1575
+ "source": "by_effort",
1576
+ "sourceHandle": "case:standard",
1577
+ "target": "expand_args",
1578
+ "targetHandle": "exec-in"
1579
+ },
1580
+ {
1581
+ "id": "e-expand_args-tool_calls-expand-tool_calls",
1582
+ "source": "expand_args",
1583
+ "sourceHandle": "tool_calls",
1584
+ "target": "expand",
1585
+ "targetHandle": "tool_calls"
1586
+ },
1587
+ {
1588
+ "id": "e-expand_args-exec-out-expand-exec-in",
1589
+ "source": "expand_args",
1590
+ "sourceHandle": "exec-out",
1591
+ "target": "expand",
1592
+ "targetHandle": "exec-in"
1593
+ },
1594
+ {
1595
+ "id": "e-expand-results-expand_out-results",
1596
+ "source": "expand",
1597
+ "sourceHandle": "results",
1598
+ "target": "expand_out",
1599
+ "targetHandle": "results"
1600
+ },
1601
+ {
1602
+ "id": "e-expand-exec-out-expand_out-exec-in",
1603
+ "source": "expand",
1604
+ "sourceHandle": "exec-out",
1605
+ "target": "expand_out",
1606
+ "targetHandle": "exec-in"
1607
+ },
1608
+ {
1609
+ "id": "e-ask-question_text-answer_prompt-question",
1610
+ "source": "ask",
1611
+ "sourceHandle": "question_text",
1612
+ "target": "answer_prompt",
1613
+ "targetHandle": "question"
1614
+ },
1615
+ {
1616
+ "id": "e-start-as_of-answer_prompt-as_of",
1617
+ "source": "start",
1618
+ "sourceHandle": "as_of",
1619
+ "target": "answer_prompt",
1620
+ "targetHandle": "as_of"
1621
+ },
1622
+ {
1623
+ "id": "e-search_out-tool_output-answer_prompt-hits",
1624
+ "source": "search_out",
1625
+ "sourceHandle": "tool_output",
1626
+ "target": "answer_prompt",
1627
+ "targetHandle": "hits"
1628
+ },
1629
+ {
1630
+ "id": "e-expand_out-tool_output-answer_prompt-expansion",
1631
+ "source": "expand_out",
1632
+ "sourceHandle": "tool_output",
1633
+ "target": "answer_prompt",
1634
+ "targetHandle": "expansion"
1635
+ },
1636
+ {
1637
+ "id": "e-answer_prompt-result-synthesize-prompt",
1638
+ "source": "answer_prompt",
1639
+ "sourceHandle": "result",
1640
+ "target": "synthesize",
1641
+ "targetHandle": "prompt"
1642
+ },
1643
+ {
1644
+ "id": "e-start-provider-synthesize-provider",
1645
+ "source": "start",
1646
+ "sourceHandle": "provider",
1647
+ "target": "synthesize",
1648
+ "targetHandle": "provider"
1649
+ },
1650
+ {
1651
+ "id": "e-start-model-synthesize-model",
1652
+ "source": "start",
1653
+ "sourceHandle": "model",
1654
+ "target": "synthesize",
1655
+ "targetHandle": "model"
1656
+ },
1657
+ {
1658
+ "id": "e-expand_out-exec-out-synthesize-exec-in",
1659
+ "source": "expand_out",
1660
+ "sourceHandle": "exec-out",
1661
+ "target": "synthesize",
1662
+ "targetHandle": "exec-in"
1663
+ },
1664
+ {
1665
+ "id": "e-synthesize-data-standard-data",
1666
+ "source": "synthesize",
1667
+ "sourceHandle": "data",
1668
+ "target": "standard",
1669
+ "targetHandle": "data"
1670
+ },
1671
+ {
1672
+ "id": "e-search_out-notes-standard-notes",
1673
+ "source": "search_out",
1674
+ "sourceHandle": "notes",
1675
+ "target": "standard",
1676
+ "targetHandle": "notes"
1677
+ },
1678
+ {
1679
+ "id": "e-synthesize-exec-out-standard-exec-in",
1680
+ "source": "synthesize",
1681
+ "sourceHandle": "exec-out",
1682
+ "target": "standard",
1683
+ "targetHandle": "exec-in"
1684
+ },
1685
+ {
1686
+ "id": "e-standard-response-end_standard-response",
1687
+ "source": "standard",
1688
+ "sourceHandle": "response",
1689
+ "target": "end_standard",
1690
+ "targetHandle": "response"
1691
+ },
1692
+ {
1693
+ "id": "e-standard-answer-end_standard-answer",
1694
+ "source": "standard",
1695
+ "sourceHandle": "answer",
1696
+ "target": "end_standard",
1697
+ "targetHandle": "answer"
1698
+ },
1699
+ {
1700
+ "id": "e-standard-evidence-end_standard-evidence",
1701
+ "source": "standard",
1702
+ "sourceHandle": "evidence",
1703
+ "target": "end_standard",
1704
+ "targetHandle": "evidence"
1705
+ },
1706
+ {
1707
+ "id": "e-standard-evolution-end_standard-evolution",
1708
+ "source": "standard",
1709
+ "sourceHandle": "evolution",
1710
+ "target": "end_standard",
1711
+ "targetHandle": "evolution"
1712
+ },
1713
+ {
1714
+ "id": "e-standard-open_loops-end_standard-open_loops",
1715
+ "source": "standard",
1716
+ "sourceHandle": "open_loops",
1717
+ "target": "end_standard",
1718
+ "targetHandle": "open_loops"
1719
+ },
1720
+ {
1721
+ "id": "e-standard-follow_ups-end_standard-follow_ups",
1722
+ "source": "standard",
1723
+ "sourceHandle": "follow_ups",
1724
+ "target": "end_standard",
1725
+ "targetHandle": "follow_ups"
1726
+ },
1727
+ {
1728
+ "id": "e-standard-dossier_note_id-end_standard-dossier_note_id",
1729
+ "source": "standard",
1730
+ "sourceHandle": "dossier_note_id",
1731
+ "target": "end_standard",
1732
+ "targetHandle": "dossier_note_id"
1733
+ },
1734
+ {
1735
+ "id": "e-search_out-tool_output-end_standard-hits",
1736
+ "source": "search_out",
1737
+ "sourceHandle": "tool_output",
1738
+ "target": "end_standard",
1739
+ "targetHandle": "hits"
1740
+ },
1741
+ {
1742
+ "id": "e-standard-exec-out-end_standard-exec-in",
1743
+ "source": "standard",
1744
+ "sourceHandle": "exec-out",
1745
+ "target": "end_standard",
1746
+ "targetHandle": "exec-in"
1747
+ },
1748
+ {
1749
+ "id": "e-ask-question_text-mine-question",
1750
+ "source": "ask",
1751
+ "sourceHandle": "question_text",
1752
+ "target": "mine",
1753
+ "targetHandle": "question"
1754
+ },
1755
+ {
1756
+ "id": "e-start-since-mine-since",
1757
+ "source": "start",
1758
+ "sourceHandle": "since",
1759
+ "target": "mine",
1760
+ "targetHandle": "since"
1761
+ },
1762
+ {
1763
+ "id": "e-start-until-mine-until",
1764
+ "source": "start",
1765
+ "sourceHandle": "until",
1766
+ "target": "mine",
1767
+ "targetHandle": "until"
1768
+ },
1769
+ {
1770
+ "id": "e-start-provider-mine-provider",
1771
+ "source": "start",
1772
+ "sourceHandle": "provider",
1773
+ "target": "mine",
1774
+ "targetHandle": "provider"
1775
+ },
1776
+ {
1777
+ "id": "e-start-model-mine-model",
1778
+ "source": "start",
1779
+ "sourceHandle": "model",
1780
+ "target": "mine",
1781
+ "targetHandle": "model"
1782
+ },
1783
+ {
1784
+ "id": "e-by_effort-case-deep-mine-exec-in",
1785
+ "source": "by_effort",
1786
+ "sourceHandle": "case:deep",
1787
+ "target": "mine",
1788
+ "targetHandle": "exec-in"
1789
+ },
1790
+ {
1791
+ "id": "e-mine-output-mine_ok-output",
1792
+ "source": "mine",
1793
+ "sourceHandle": "output",
1794
+ "target": "mine_ok",
1795
+ "targetHandle": "output"
1796
+ },
1797
+ {
1798
+ "id": "e-mine-child_output-mine_ok-child_output",
1799
+ "source": "mine",
1800
+ "sourceHandle": "child_output",
1801
+ "target": "mine_ok",
1802
+ "targetHandle": "child_output"
1803
+ },
1804
+ {
1805
+ "id": "e-mine-exec-out-mine_ok-exec-in",
1806
+ "source": "mine",
1807
+ "sourceHandle": "exec-out",
1808
+ "target": "mine_ok",
1809
+ "targetHandle": "exec-in"
1810
+ },
1811
+ {
1812
+ "id": "e-mine-response-end_deep-response",
1813
+ "source": "mine",
1814
+ "sourceHandle": "response",
1815
+ "target": "end_deep",
1816
+ "targetHandle": "response"
1817
+ },
1818
+ {
1819
+ "id": "e-mine-answer-end_deep-answer",
1820
+ "source": "mine",
1821
+ "sourceHandle": "answer",
1822
+ "target": "end_deep",
1823
+ "targetHandle": "answer"
1824
+ },
1825
+ {
1826
+ "id": "e-mine-evidence-end_deep-evidence",
1827
+ "source": "mine",
1828
+ "sourceHandle": "evidence",
1829
+ "target": "end_deep",
1830
+ "targetHandle": "evidence"
1831
+ },
1832
+ {
1833
+ "id": "e-mine-evolution-end_deep-evolution",
1834
+ "source": "mine",
1835
+ "sourceHandle": "evolution",
1836
+ "target": "end_deep",
1837
+ "targetHandle": "evolution"
1838
+ },
1839
+ {
1840
+ "id": "e-mine-open_loops-end_deep-open_loops",
1841
+ "source": "mine",
1842
+ "sourceHandle": "open_loops",
1843
+ "target": "end_deep",
1844
+ "targetHandle": "open_loops"
1845
+ },
1846
+ {
1847
+ "id": "e-mine-follow_ups-end_deep-follow_ups",
1848
+ "source": "mine",
1849
+ "sourceHandle": "follow_ups",
1850
+ "target": "end_deep",
1851
+ "targetHandle": "follow_ups"
1852
+ },
1853
+ {
1854
+ "id": "e-mine-dossier_note_id-end_deep-dossier_note_id",
1855
+ "source": "mine",
1856
+ "sourceHandle": "dossier_note_id",
1857
+ "target": "end_deep",
1858
+ "targetHandle": "dossier_note_id"
1859
+ },
1860
+ {
1861
+ "id": "e-search_out-tool_output-end_deep-hits",
1862
+ "source": "search_out",
1863
+ "sourceHandle": "tool_output",
1864
+ "target": "end_deep",
1865
+ "targetHandle": "hits"
1866
+ },
1867
+ {
1868
+ "id": "e-mine_ok-exec-out-end_deep-exec-in",
1869
+ "source": "mine_ok",
1870
+ "sourceHandle": "exec-out",
1871
+ "target": "end_deep",
1872
+ "targetHandle": "exec-in"
1873
+ }
1874
+ ],
1875
+ "entryNode": "start"
1876
+ }