json-object-editor 0.10.509 → 0.10.521

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 (47) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/_www/mcp-export.html +11 -4
  3. package/_www/mcp-nav.js +8 -4
  4. package/_www/mcp-prompt.html +96 -121
  5. package/_www/mcp-schemas.html +294 -0
  6. package/_www/mcp-test.html +86 -0
  7. package/docs/JOE_Master_Knowledge_Export.md +135 -0
  8. package/docs/joe_agent_custom_gpt_instructions_v_2.md +54 -0
  9. package/docs/joe_agent_spec_v_2.2.md +64 -0
  10. package/docs/schema_summary_guidelines.md +128 -0
  11. package/package.json +1 -1
  12. package/readme.md +525 -469
  13. package/server/modules/MCP.js +606 -405
  14. package/server/modules/Schemas.js +321 -111
  15. package/server/modules/Server.js +26 -15
  16. package/server/modules/Storage.js +9 -0
  17. package/server/relationships.graph.json +5 -0
  18. package/server/schemas/block.js +37 -0
  19. package/server/schemas/board.js +2 -1
  20. package/server/schemas/budget.js +28 -1
  21. package/server/schemas/event.js +42 -0
  22. package/server/schemas/financial_account.js +35 -0
  23. package/server/schemas/goal.js +30 -0
  24. package/server/schemas/group.js +31 -0
  25. package/server/schemas/include.js +28 -0
  26. package/server/schemas/ingredient.js +28 -0
  27. package/server/schemas/initiative.js +32 -0
  28. package/server/schemas/instance.js +31 -1
  29. package/server/schemas/layout.js +31 -0
  30. package/server/schemas/ledger.js +30 -0
  31. package/server/schemas/list.js +33 -0
  32. package/server/schemas/meal.js +30 -0
  33. package/server/schemas/note.js +30 -0
  34. package/server/schemas/notification.js +33 -1
  35. package/server/schemas/page.js +43 -0
  36. package/server/schemas/post.js +32 -0
  37. package/server/schemas/project.js +36 -0
  38. package/server/schemas/recipe.js +32 -0
  39. package/server/schemas/report.js +32 -0
  40. package/server/schemas/setting.js +22 -0
  41. package/server/schemas/site.js +30 -0
  42. package/server/schemas/status.js +33 -0
  43. package/server/schemas/tag.js +28 -1
  44. package/server/schemas/task.js +778 -737
  45. package/server/schemas/transaction.js +43 -0
  46. package/server/schemas/user.js +36 -1
  47. package/server/schemas/workflow.js +30 -1
@@ -3,6 +3,49 @@ var page = {
3
3
  info:"A page is a layout and include combination that displays content at a specific site URL.",
4
4
  hideNumbers:true,
5
5
  menuicon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="-6 -6 44 44"><path d="M6 3L6 4 6 28 6 29 7 29 25 29 26 29 26 28 26 10 26 9.6 25.7 9.3 19.7 3.3 19.4 3 19 3 7 3 6 3zM8 5L18 5 18 10 18 11 19 11 24 11 24 27 8 27 8 5zM20 6.4L22.6 9 20 9 20 6.4zM16 13L14 25 16 25 18 13 16 13zM12.2 15.4L9.7 18.4 9.2 19 9.7 19.6 12.2 22.6 13.8 21.4 11.8 19 13.8 16.6 12.2 15.4zM19.8 15.4L18.2 16.6 20.2 19 18.2 21.4 19.8 22.6 22.3 19.6 22.8 19 22.3 18.4 19.8 15.4z"/></svg>',
6
+ // Curated summary for agents
7
+ summary:{
8
+ description:'Renderable web page bound to a Site, with layout, blocks, and optional dynamic content.',
9
+ purpose:'Pages define route paths and content; they render layouts and includes and can pull dynamic items based on URL parameters.',
10
+ labelField:'name',
11
+ defaultSort:{ field:'path', dir:'asc' },
12
+ searchableFields:['name','info','path','_id'],
13
+ allowedSorts:['path','name','joeUpdated','created'],
14
+ relationships:{
15
+ outbound:[
16
+ { field:'site', targetSchema:'site', cardinality:'one' },
17
+ { field:'layout', targetSchema:'layout', cardinality:'one' },
18
+ { field:'includes', targetSchema:'include', cardinality:'many' },
19
+ { field:'blocks', targetSchema:'block', cardinality:'many' },
20
+ { field:'permissions', targetSchema:'user|group', cardinality:'many' }
21
+ ],
22
+ inbound:{ graphRef:'server/relationships.graph.json' }
23
+ },
24
+ joeManagedFields:['created','joeUpdated'],
25
+ fields:[
26
+ { name:'_id', type:'string', required:true },
27
+ { name:'itemtype', type:'string', required:true, const:'page' },
28
+ { name:'name', type:'string', required:true },
29
+ { name:'info', type:'string' },
30
+ { name:'site', type:'string', isReference:true, targetSchema:'site' },
31
+ { name:'path', type:'string' },
32
+ { name:'content_type', type:'string', enumValues:['wysiwyg','code','plugin','module'] },
33
+ { name:'content', type:'string' },
34
+ { name:'plugin', type:'string' },
35
+ { name:'plugin_method', type:'string' },
36
+ { name:'plugin_params', type:'objectList' },
37
+ { name:'blocks', type:'string', isArray:true, isReference:true, targetSchema:'block' },
38
+ { name:'layout', type:'string', isReference:true, targetSchema:'layout' },
39
+ { name:'includes', type:'string', isArray:true, isReference:true, targetSchema:'include' },
40
+ { name:'dynamic', type:'boolean' },
41
+ { name:'content_items', type:'objectList' },
42
+ { name:'datasets', type:'string', isArray:true },
43
+ { name:'meta', type:'object' },
44
+ { name:'permissions', type:'string', isArray:true, isReference:true, targetSchema:'user|group' },
45
+ { name:'joeUpdated', type:'string', format:'date-time', required:true },
46
+ { name:'created', type:'string', format:'date-time', required:true }
47
+ ]
48
+ },
6
49
  sorter:['path','name'],
7
50
  listView:{
8
51
  title:
@@ -2,6 +2,38 @@ var schema ={
2
2
  title: '${name}',
3
3
  info:"Manage pieces of content you will re-use throughout your site, like a blog post.",
4
4
  menuicon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="-9 -9 44 44"><path d="M18.9 0.2C18.6 0.1 18.1 0.4 17.8 0.8L13.1 7.4C10.4 6.6 7.3 7.3 5.2 9.4L16.6 20.8C18.7 18.6 19.4 15.5 18.6 12.8L18.6 12.8 25.2 8.3C25.8 7.8 26 7.2 25.6 6.8L19.3 0.4C19.2 0.3 19.1 0.2 18.9 0.2zM18.9 3.2L20.7 4.9 16.2 9 15.2 8 18.9 3.2zM13 9.3C13.2 9.3 13.3 9.3 13.3 9.3L14.3 10.3C14.3 10.3 13.6 10.4 11.6 12.4L9.8 10.6C11.3 9.5 12.5 9.3 13 9.3zM8.6 14.8L0.2 25.8 11.2 17.3 8.6 14.8z"></path></svg>',
5
+ // Curated summary for agents
6
+ summary:{
7
+ description:'Reusable content post with rich text, bullets, files, and tags.',
8
+ purpose:'Posts represent blog/news content to be rendered on site pages. They can be tagged and associated to a site, with a post_date for sorting.',
9
+ labelField:'name',
10
+ defaultSort:{ field:'post_date', dir:'desc' },
11
+ searchableFields:['name','info','_id'],
12
+ allowedSorts:['post_date','joeUpdated','created','name'],
13
+ relationships:{
14
+ outbound:[
15
+ { field:'site', targetSchema:'site', cardinality:'one' },
16
+ { field:'tags', targetSchema:'tag', cardinality:'many' }
17
+ ],
18
+ inbound:{ graphRef:'server/relationships.graph.json' }
19
+ },
20
+ joeManagedFields:['created','joeUpdated'],
21
+ fields:[
22
+ { name:'_id', type:'string', required:true },
23
+ { name:'itemtype', type:'string', required:true, const:'post' },
24
+ { name:'name', type:'string', required:true },
25
+ { name:'info', type:'string' },
26
+ { name:'content_type', type:'string' },
27
+ { name:'content', type:'string' },
28
+ { name:'bullets', type:'objectList' },
29
+ { name:'files', type:'string', isArray:true },
30
+ { name:'site', type:'string', isReference:true, targetSchema:'site' },
31
+ { name:'post_date', type:'string', format:'date' },
32
+ { name:'tags', type:'string', isArray:true, isReference:true, targetSchema:'tag' },
33
+ { name:'joeUpdated', type:'string', format:'date-time', required:true },
34
+ { name:'created', type:'string', format:'date-time', required:true }
35
+ ]
36
+ },
5
37
  fields:function(){
6
38
  var f = [
7
39
  'name',
@@ -39,6 +39,42 @@ var project = function(){return{
39
39
  },
40
40
  hideNumbers:true,
41
41
  sorter:[{display:'priority',field:'priority'},'name','status'],
42
+ // Curated summary for agents
43
+ summary:{
44
+ description:'Container for organizing work, teams, and timelines.',
45
+ purpose:'Projects group tasks, people, and timelines. A project typically has one status and group, many members (users), and many tags. Tasks reference their owning project. Use projects for planning, tracking, and reporting across related tasks.',
46
+ labelField:'name',
47
+ defaultSort:{ field:'joeUpdated', dir:'desc' },
48
+ searchableFields:['name','info','description','_id'],
49
+ allowedSorts:['priority','status','name','joeUpdated','created','start_dt','end_dt'],
50
+ relationships:{
51
+ outbound:[
52
+ { field:'status', targetSchema:'status', cardinality:'one' },
53
+ { field:'group', targetSchema:'group', cardinality:'one' },
54
+ { field:'members', targetSchema:'user', cardinality:'many' },
55
+ { field:'tags', targetSchema:'tag', cardinality:'many' }
56
+ ],
57
+ inbound:{ graphRef:'server/relationships.graph.json' }
58
+ },
59
+ joeManagedFields:['created','joeUpdated'],
60
+ fields:[
61
+ { name:'_id', type:'string', required:true },
62
+ { name:'itemtype', type:'string', required:true, const:'project' },
63
+ { name:'name', type:'string', required:true },
64
+ { name:'info', type:'string' },
65
+ { name:'description', type:'string' },
66
+ { name:'status', type:'string', isReference:true, targetSchema:'status' },
67
+ { name:'group', type:'string', isReference:true, targetSchema:'group' },
68
+ { name:'members', type:'string', isArray:true, isReference:true, targetSchema:'user' },
69
+ { name:'tags', type:'string', isArray:true, isReference:true, targetSchema:'tag' },
70
+ { name:'start_dt', type:'string', format:'date-time' },
71
+ { name:'end_dt', type:'string', format:'date-time' },
72
+ { name:'priority', type:'number', enumValues:[1,2,3,1000] },
73
+ { name:'complete', type:'boolean' },
74
+ { name:'joeUpdated', type:'string', format:'date-time', required:true },
75
+ { name:'created', type:'string', format:'date-time', required:true }
76
+ ]
77
+ },
42
78
  fields:function(){
43
79
  var fields=[
44
80
 
@@ -1,6 +1,38 @@
1
1
  var schema = {
2
2
  title : '${name}',
3
3
  info:'The ingredients and steps required to prepare a meal.',
4
+ // Curated summary for agents
5
+ summary:{
6
+ description:'Structured cooking instructions with typed ingredients and optional files.',
7
+ purpose:'Use recipes to define meal preparation. Each recipe lists ingredients with amounts and directions; recipes can be tagged and marked family_favorite.',
8
+ labelField:'name',
9
+ defaultSort:{ field:'name', dir:'asc' },
10
+ searchableFields:['name','info','mealtype','_id'],
11
+ allowedSorts:['name','mealtype','joeUpdated','created'],
12
+ relationships:{
13
+ outbound:[
14
+ { field:'ingredients.id', targetSchema:'ingredient', cardinality:'many' },
15
+ { field:'tags', targetSchema:'tag', cardinality:'many' }
16
+ ],
17
+ inbound:{ graphRef:'server/relationships.graph.json' }
18
+ },
19
+ joeManagedFields:['created','joeUpdated'],
20
+ fields:[
21
+ { name:'_id', type:'string', required:true },
22
+ { name:'itemtype', type:'string', required:true, const:'recipe' },
23
+ { name:'name', type:'string', required:true },
24
+ { name:'info', type:'string' },
25
+ { name:'url', type:'string' },
26
+ { name:'mealtype', type:'string', enumValues:['breakfast','lunch','dinner','snack','side','main','dessert'] },
27
+ { name:'ingredients', type:'objectList' },
28
+ { name:'description', type:'string' },
29
+ { name:'files', type:'string', isArray:true },
30
+ { name:'tags', type:'string', isArray:true, isReference:true, targetSchema:'tag' },
31
+ { name:'family_favorite', type:'boolean' },
32
+ { name:'joeUpdated', type:'string', format:'date-time', required:true },
33
+ { name:'created', type:'string', format:'date-time', required:true }
34
+ ]
35
+ },
4
36
  listView:{
5
37
  title: function(i){
6
38
  return `
@@ -2,6 +2,38 @@ var schema = {
2
2
  title : '${name}',
3
3
  info:"Check the status of each automated report tracking your content.",
4
4
  default_schema:true,
5
+ // Curated summary for agents
6
+ summary:{
7
+ description:'Reusable report templates rendering content items into HTML (or other).',
8
+ purpose:'Reports define templates and content bindings. They are executed via the reportbuilder plugin, typically with an item reference.',
9
+ labelField:'name',
10
+ defaultSort:{ field:'joeUpdated', dir:'desc' },
11
+ searchableFields:['name','info','id','_id'],
12
+ allowedSorts:['joeUpdated','created','name','id'],
13
+ relationships:{
14
+ outbound:[
15
+ { field:'content_items', targetSchema:'*', cardinality:'many' },
16
+ { field:'includes', targetSchema:'include', cardinality:'many' }
17
+ ],
18
+ inbound:{ graphRef:'server/relationships.graph.json' }
19
+ },
20
+ joeManagedFields:['created','joeUpdated'],
21
+ fields:[
22
+ { name:'_id', type:'string', required:true },
23
+ { name:'itemtype', type:'string', required:true, const:'report' },
24
+ { name:'name', type:'string', required:true },
25
+ { name:'info', type:'string' },
26
+ { name:'id', type:'string' },
27
+ { name:'content_items', type:'objectList' },
28
+ { name:'template_type', type:'string' },
29
+ { name:'template', type:'string' },
30
+ { name:'includes', type:'string', isArray:true, isReference:true, targetSchema:'include' },
31
+ { name:'use_htmlframework', type:'boolean' },
32
+ { name:'_protected', type:'boolean' },
33
+ { name:'joeUpdated', type:'string', format:'date-time', required:true },
34
+ { name:'created', type:'string', format:'date-time', required:true }
35
+ ]
36
+ },
5
37
  listView:{
6
38
  title: function(i){
7
39
  return `<joe-subtext>${i.id || ''}</joe-subtext>
@@ -3,6 +3,28 @@ var setting ={
3
3
  //info:'view global settings used across all apps, plugins and the server',
4
4
  info:"Each setting is global, and makes changes to the more advanced features of JOE.",
5
5
  default_schema:true,
6
+ // Curated summary for agents
7
+ summary:{
8
+ description:'Global configuration key/value used by server, apps, and plugins.',
9
+ purpose:'Settings control behavior like API keys, feature flags, and templates. Use with care; many subsystems read these at runtime.',
10
+ labelField:'name',
11
+ defaultSort:{ field:'joeUpdated', dir:'desc' },
12
+ searchableFields:['name','info','_id'],
13
+ allowedSorts:['joeUpdated','created','name'],
14
+ relationships:{ outbound: [], inbound:{ graphRef:'server/relationships.graph.json' } },
15
+ joeManagedFields:['created','joeUpdated'],
16
+ fields:[
17
+ { name:'_id', type:'string', required:true },
18
+ { name:'itemtype', type:'string', required:true, const:'setting' },
19
+ { name:'name', type:'string', required:true },
20
+ { name:'info', type:'string' },
21
+ { name:'setting_type', type:'string', enumValues:['text','code','wysiwyg'] },
22
+ { name:'value', type:'string' },
23
+ { name:'_protected', type:'boolean' },
24
+ { name:'joeUpdated', type:'string', format:'date-time', required:true },
25
+ { name:'created', type:'string', format:'date-time', required:true }
26
+ ]
27
+ },
6
28
  fields:[
7
29
  'name',
8
30
  'info',
@@ -2,6 +2,36 @@ var site ={
2
2
  title: '${name}',
3
3
  //info:'The main public facing elements, are made up of pages, includes, layouts and plugins that can display content from anywhere in JOE. Use the <b>sitebuilder</b> app for a more focused view.',
4
4
  info:"Manage each individual site bulit with JOE. ",
5
+ // Curated summary for agents
6
+ summary:{
7
+ description:'Top-level website container with URL, datasets, includes, and homepage.',
8
+ purpose:'Sites organize public content. Pages, layouts, blocks, and includes reference a Site. Use Site to set the base URL, homepage, and which datasets are exposed to templates.',
9
+ labelField:'name',
10
+ defaultSort:{ field:'joeUpdated', dir:'desc' },
11
+ searchableFields:['name','info','url','_id'],
12
+ allowedSorts:['joeUpdated','created','name','url'],
13
+ relationships:{
14
+ outbound:[
15
+ { field:'includes', targetSchema:'include', cardinality:'many' },
16
+ { field:'datasets', targetSchema:'<schemaName>', cardinality:'many' },
17
+ { field:'homepage', targetSchema:'page', cardinality:'one' }
18
+ ],
19
+ inbound:{ graphRef:'server/relationships.graph.json' }
20
+ },
21
+ joeManagedFields:['created','joeUpdated'],
22
+ fields:[
23
+ { name:'_id', type:'string', required:true },
24
+ { name:'itemtype', type:'string', required:true, const:'site' },
25
+ { name:'name', type:'string', required:true },
26
+ { name:'info', type:'string' },
27
+ { name:'url', type:'string' },
28
+ { name:'includes', type:'string', isArray:true, isReference:true, targetSchema:'include' },
29
+ { name:'datasets', type:'string', isArray:true },
30
+ { name:'homepage', type:'string', isReference:true, targetSchema:'page' },
31
+ { name:'joeUpdated', type:'string', format:'date-time', required:true },
32
+ { name:'created', type:'string', format:'date-time', required:true }
33
+ ]
34
+ },
5
35
  listWindowTitle:'Sites',
6
36
  listTitle:'<joe-subtitle>${info}</joe-subtitle><joe-title>${name}</joe-title><joe-subtitle>${url}</joe-subtitle>',
7
37
 
@@ -2,6 +2,39 @@ var schema = {
2
2
  title : '${name}',
3
3
  info:"Choose status options to track the progress of different panels throughout your dashboard in a workflow (ex: new member flow). Build a report to easily check the status of a workflow.",
4
4
  default_schema:true,
5
+ // Curated summary for agents
6
+ summary:{
7
+ description:'Workflow state used by multiple schemas (e.g., task, project).',
8
+ purpose:'Statuses represent workflow stages. Records (like tasks/projects) reference a single status; statuses can be scoped to specific schemas via datasets. Use status to show state labels and colors and to filter pipelines.',
9
+ labelField:'name',
10
+ defaultSort:{ field:'index', dir:'asc' },
11
+ searchableFields:['name','info','code','_id'],
12
+ allowedSorts:['index','name','joeUpdated','created'],
13
+ relationships:{
14
+ outbound:[
15
+ { field:'datasets', targetSchema:'<schemaName>', cardinality:'many' }
16
+ ],
17
+ inbound:{ graphRef:'server/relationships.graph.json' }
18
+ },
19
+ joeManagedFields:['created','joeUpdated'],
20
+ fields:[
21
+ { name:'_id', type:'string', required:true },
22
+ { name:'itemtype', type:'string', required:true, const:'status' },
23
+ { name:'name', type:'string', required:true },
24
+ { name:'info', type:'string' },
25
+ { name:'description', type:'string' },
26
+ { name:'color', type:'string' },
27
+ { name:'index', type:'number' },
28
+ { name:'code', type:'string' },
29
+ { name:'default', type:'boolean' },
30
+ { name:'terminal', type:'boolean' },
31
+ { name:'active', type:'boolean' },
32
+ { name:'inactive', type:'boolean' },
33
+ { name:'datasets', type:'string', isArray:true },
34
+ { name:'joeUpdated', type:'string', format:'date-time', required:true },
35
+ { name:'created', type:'string', format:'date-time', required:true }
36
+ ]
37
+ },
5
38
  listView:{
6
39
  title:
7
40
  '<joe-full-right><joe-subtext>${this.index}</joe-subtext></joe-full-right>'+
@@ -1,9 +1,36 @@
1
- const { itemExpander } = require("./goal");
2
1
 
3
2
  var tag ={
4
3
  title: '${name}',
5
4
  info:"Assign a tag to categorize different pieces of information so you can easily access information in a category in one place.",
6
5
  default_schema:true,
6
+ // Curated summary for agents
7
+ summary:{
8
+ description:'Categorization label applied across datasets; supports hierarchy.',
9
+ purpose:'Tags classify records for search, filters, and reporting. A tag may have a parent tag (for hierarchy) and may apply to specific schemas via datasets. Many schemas reference tags (e.g., task, project, user).',
10
+ labelField:'name',
11
+ defaultSort:{ field:'name', dir:'asc' },
12
+ searchableFields:['name','info','tag_id','_id'],
13
+ allowedSorts:['name','joeUpdated','created','tag_id'],
14
+ relationships:{
15
+ outbound:[
16
+ { field:'parent_tag', targetSchema:'tag', cardinality:'one' },
17
+ { field:'datasets', targetSchema:'<schemaName>', cardinality:'many' }
18
+ ],
19
+ inbound:{ graphRef:'server/relationships.graph.json' }
20
+ },
21
+ joeManagedFields:['created','joeUpdated'],
22
+ fields:[
23
+ { name:'_id', type:'string', required:true },
24
+ { name:'itemtype', type:'string', required:true, const:'tag' },
25
+ { name:'name', type:'string', required:true },
26
+ { name:'info', type:'string' },
27
+ { name:'parent_tag', type:'string', isReference:true, targetSchema:'tag' },
28
+ { name:'tag_id', type:'string' },
29
+ { name:'datasets', type:'string', isArray:true },
30
+ { name:'joeUpdated', type:'string', format:'date-time', required:true },
31
+ { name:'created', type:'string', format:'date-time', required:true }
32
+ ]
33
+ },
7
34
  fields:[
8
35
  'name',
9
36
  'info',