@techie_doubts/tui.notes.2026 1.0.13 → 1.0.16-exp.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +50 -0
  2. package/dist/assets/{arc-DnT4PtPq.js → arc-CTs8vxd2.js} +1 -1
  3. package/dist/assets/{architectureDiagram-VXUJARFQ-BXrpe9bX.js → architectureDiagram-VXUJARFQ-t-K3l8e1.js} +1 -1
  4. package/dist/assets/{blockDiagram-VD42YOAC-DP5p2MqV.js → blockDiagram-VD42YOAC-DIMIytmv.js} +1 -1
  5. package/dist/assets/{c4Diagram-YG6GDRKO-Ct7uTaEZ.js → c4Diagram-YG6GDRKO-CW5YAiXl.js} +1 -1
  6. package/dist/assets/channel-DKXa9vcG.js +1 -0
  7. package/dist/assets/{chunk-4BX2VUAB-C8-wPxxJ.js → chunk-4BX2VUAB-DzXtIyrg.js} +1 -1
  8. package/dist/assets/{chunk-55IACEB6-DGtqAQIB.js → chunk-55IACEB6-BnGPND_M.js} +1 -1
  9. package/dist/assets/{chunk-B4BG7PRW-5xo8czGC.js → chunk-B4BG7PRW-BklBjgAV.js} +1 -1
  10. package/dist/assets/{chunk-DI55MBZ5-CSzvABNB.js → chunk-DI55MBZ5-BNr8lC1p.js} +1 -1
  11. package/dist/assets/{chunk-FMBD7UC4-B_0cCLSi.js → chunk-FMBD7UC4-kabs-F9i.js} +1 -1
  12. package/dist/assets/{chunk-QN33PNHL-CrWDnSsf.js → chunk-QN33PNHL-DNaN1nja.js} +1 -1
  13. package/dist/assets/{chunk-QZHKN3VN-HZLnZ-EP.js → chunk-QZHKN3VN-DMNT_UpY.js} +1 -1
  14. package/dist/assets/{chunk-TZMSLE5B-Bz9O3K8e.js → chunk-TZMSLE5B-BJ9Zykuu.js} +1 -1
  15. package/dist/assets/classDiagram-2ON5EDUG-DvvXKx22.js +1 -0
  16. package/dist/assets/classDiagram-v2-WZHVMYZB-DvvXKx22.js +1 -0
  17. package/dist/assets/{clone-D0V3NIis.js → clone-DgRSp238.js} +1 -1
  18. package/dist/assets/{cose-bilkent-S5V4N54A-Bu2u7GxM.js → cose-bilkent-S5V4N54A-LlpiAUGJ.js} +1 -1
  19. package/dist/assets/{dagre-6UL2VRFP-C2f5GIN3.js → dagre-6UL2VRFP-1CY5QFbC.js} +1 -1
  20. package/dist/assets/{diagram-PSM6KHXK-SP2awr0w.js → diagram-PSM6KHXK-CyWB67TN.js} +1 -1
  21. package/dist/assets/{diagram-QEK2KX5R-Bx9gVmHS.js → diagram-QEK2KX5R-D3s5Rahm.js} +1 -1
  22. package/dist/assets/{diagram-S2PKOQOG-DpM42zIf.js → diagram-S2PKOQOG-afP1wbQy.js} +1 -1
  23. package/dist/assets/{erDiagram-Q2GNP2WA-BCafPHnd.js → erDiagram-Q2GNP2WA-Cu5MC-vn.js} +1 -1
  24. package/dist/assets/{flowDiagram-NV44I4VS-BzDK3rTw.js → flowDiagram-NV44I4VS-Cp52X3t3.js} +1 -1
  25. package/dist/assets/{ganttDiagram-JELNMOA3-CKyPyucm.js → ganttDiagram-JELNMOA3-B-FV5NtV.js} +1 -1
  26. package/dist/assets/{gitGraphDiagram-NY62KEGX-C9dH7T48.js → gitGraphDiagram-NY62KEGX-DXjcfXw-.js} +1 -1
  27. package/dist/assets/{index-BilTouDJ.js → index-DT7P8Yy_.js} +529 -460
  28. package/dist/assets/{index-CNp6F8X7.css → index-RZ7CoTP6.css} +1 -1
  29. package/dist/assets/{infoDiagram-WHAUD3N6-CH3Av-mQ.js → infoDiagram-WHAUD3N6-6gXAcBpT.js} +1 -1
  30. package/dist/assets/{journeyDiagram-XKPGCS4Q-DIoHgl1Z.js → journeyDiagram-XKPGCS4Q-B63GyOcC.js} +1 -1
  31. package/dist/assets/{kanban-definition-3W4ZIXB7-CWLQr3gj.js → kanban-definition-3W4ZIXB7-BGUIjvVd.js} +1 -1
  32. package/dist/assets/{linear-CBhVQMz6.js → linear-CGkv28JQ.js} +1 -1
  33. package/dist/assets/{mindmap-definition-VGOIOE7T-Cxs-zpuQ.js → mindmap-definition-VGOIOE7T-QTeRbvXZ.js} +1 -1
  34. package/dist/assets/{pieDiagram-ADFJNKIX-cwQKtTba.js → pieDiagram-ADFJNKIX-BY8oRvp_.js} +1 -1
  35. package/dist/assets/{quadrantDiagram-AYHSOK5B-Bkz-9rDu.js → quadrantDiagram-AYHSOK5B-BYuVMrlE.js} +1 -1
  36. package/dist/assets/{requirementDiagram-UZGBJVZJ-WlYK0SEk.js → requirementDiagram-UZGBJVZJ-BJGSRZd3.js} +1 -1
  37. package/dist/assets/{sankeyDiagram-TZEHDZUN-C7_ihe8w.js → sankeyDiagram-TZEHDZUN-D4szE45R.js} +1 -1
  38. package/dist/assets/{sequenceDiagram-WL72ISMW-VD7vKL9M.js → sequenceDiagram-WL72ISMW-g-LURDtG.js} +1 -1
  39. package/dist/assets/{stateDiagram-FKZM4ZOC-ClBZturp.js → stateDiagram-FKZM4ZOC-DlfvisVh.js} +1 -1
  40. package/dist/assets/stateDiagram-v2-4FDKWEC3-BjHRrc7G.js +1 -0
  41. package/dist/assets/{timeline-definition-IT6M3QCI-BlnB3vyh.js → timeline-definition-IT6M3QCI-V2SgS8bM.js} +1 -1
  42. package/dist/assets/{treemap-KMMF4GRG-2Tjc4tzM.js → treemap-KMMF4GRG-BmxpkoZ5.js} +1 -1
  43. package/dist/assets/{xychartDiagram-PRI3JC2R-Dna9L0wE.js → xychartDiagram-PRI3JC2R-W9kGz4s7.js} +1 -1
  44. package/dist/index.html +2 -2
  45. package/package.json +8 -3
  46. package/server/acl-service.js +1249 -0
  47. package/server/acl-service.test.js +439 -0
  48. package/server/acl-store.js +421 -0
  49. package/server/auth.js +119 -0
  50. package/server/index.js +719 -23
  51. package/server/store.js +12 -0
  52. package/dist/assets/channel-B-LJJVbj.js +0 -1
  53. package/dist/assets/classDiagram-2ON5EDUG-B8hqCKwM.js +0 -1
  54. package/dist/assets/classDiagram-v2-WZHVMYZB-B8hqCKwM.js +0 -1
  55. package/dist/assets/stateDiagram-v2-4FDKWEC3-D0C_O_lb.js +0 -1
package/README.md CHANGED
@@ -49,6 +49,56 @@ tui-notes-2026 [options]
49
49
  --help
50
50
  ```
51
51
 
52
+ ## Auth and ACL
53
+
54
+ Environment flags:
55
+
56
+ - `TUI_NOTES_AUTH_MODE=off|observe|enforce` (default: `off`)
57
+ - `TUI_NOTES_BOOTSTRAP_OWNER_EMAIL=<email>` (optional owner bootstrap for first login)
58
+ - `TUI_NOTES_BOOTSTRAP_OWNER_USER=<userId>` (optional, overrides bootstrap email)
59
+ - `TUI_NOTES_AUTH_DB_URL=<postgres-connection-string>` (optional; if unset, ACL is stored in `${rootDir}/acl.json`)
60
+
61
+ API endpoints:
62
+
63
+ - `GET /api/me`
64
+ - `GET /api/me/capabilities?type=workspace|folder|note&externalId=<id>`
65
+ - `GET /api/acl/resource/:resourceType/:resourceExternalId`
66
+ - `POST /api/acl/grant`
67
+ - `DELETE /api/acl/grant/:bindingId`
68
+
69
+ UI support:
70
+
71
+ - In auth modes `observe`/`enforce`, right-click folder/note -> `Access...`
72
+ - Supports grants/removals for `user|group|public` with roles `viewer|editor|owner`
73
+ - Access writes are sent through ACL API and applied live through SSE
74
+ - Access management uses a single modal dialog (dropdown-based, no prompt loops)
75
+ - Note context menu includes `Copy Link` (`?note=<id>`); access is still enforced by ACL
76
+
77
+ Local ACL tests:
78
+
79
+ ```bash
80
+ npm test
81
+ ```
82
+
83
+ ### Local Keycloak test stack
84
+
85
+ Ready-to-run local auth stack (Keycloak + OAuth2 Proxy + notes) is in:
86
+
87
+ - `/Users/alexanderacosta/tui.notes.2026/dev/local-auth-stack`
88
+
89
+ Includes two precreated users:
90
+
91
+ - `alice / Alice123!` (owner bootstrap)
92
+ - `bob / Bob123!`
93
+
94
+ Clean reset (recommended before a fresh ACL test run):
95
+
96
+ ```bash
97
+ cd /Users/alexanderacosta/tui.notes.2026/dev/local-auth-stack
98
+ docker-compose down -v
99
+ docker-compose up -d
100
+ ```
101
+
52
102
  ## Future Work
53
103
 
54
104
  - Delta persistence protocol: send and apply only changed entities/operations instead of full snapshots.
@@ -1 +1 @@
1
- import{a0 as ln,a1 as an,a2 as y,a3 as tn,a4 as H,a5 as q,a6 as _,a7 as un,a8 as rn,a9 as L,aa as o,ab as B,ac as sn,ad as on,ae as fn}from"./index-BilTouDJ.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,C,a){var O=I-l,i=D-h,n=C-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function W(l,h,I,D,v,A,C){var a=l-I,O=h-D,i=(C?A:-A)/L(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,F=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*L(fn(0,T*T*R-P*P)),j=(P*g-m*S)/R,z=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=j-F,e=z-t,r=w-F,G=p-t;return x*x+e*e>r*r+G*G&&(j=w,z=p),{cx:j,cy:z,x01:-n,y01:-d,x11:j*(v/T-1),y11:z*(v/T-1)}}function hn(){var l=cn,h=yn,I=B(0),D=null,v=gn,A=dn,C=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-an,c=A.apply(this,arguments)-an,F=un(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(F>tn-y)a.moveTo(s*H(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*H(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=F,S=F,j=C.apply(this,arguments)/2,z=j>y&&(D?+D.apply(this,arguments):L(u*u+s*s)),w=_(un(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if(z>y){var G=sn(z/u*q(j)),M=sn(z/s*q(j));(P-=G*2)>y?(G*=t?1:-1,R+=G,T-=G):(P=0,R=T=(f+c)/2),(S-=M*2)>y?(M*=t?1:-1,m+=M,g-=M):(S=0,m=g=(f+c)/2)}var J=s*H(m),K=s*q(m),N=u*H(T),Q=u*q(T);if(w>y){var U=s*H(g),V=s*q(g),X=u*H(R),Y=u*q(R),E;if(F<rn)if(E=pn(J,K,X,Y,U,V,N,Q)){var Z=J-E[0],$=K-E[1],b=U-E[0],k=V-E[1],nn=1/q(on((Z*b+$*k)/(L(Z*Z+$*$)*L(b*b+k*k)))/2),en=L(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=W(X,Y,J,K,s,x,t),r=W(U,V,N,Q,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(J,K),a.arc(0,0,s,m,g,!t)):a.moveTo(J,K),!(u>y)||!(P>y)?a.lineTo(N,Q):p>y?(e=W(N,Q,U,V,u,-p,t),r=W(J,K,X,Y,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-rn/2;return[H(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:B(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:B(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:B(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:B(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:B(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:B(+n),i):A},i.padAngle=function(n){return arguments.length?(C=typeof n=="function"?n:B(+n),i):C},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
1
+ import{a0 as ln,a1 as an,a2 as y,a3 as tn,a4 as H,a5 as q,a6 as _,a7 as un,a8 as rn,a9 as L,aa as o,ab as B,ac as sn,ad as on,ae as fn}from"./index-DT7P8Yy_.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,C,a){var O=I-l,i=D-h,n=C-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function W(l,h,I,D,v,A,C){var a=l-I,O=h-D,i=(C?A:-A)/L(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,F=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*L(fn(0,T*T*R-P*P)),j=(P*g-m*S)/R,z=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=j-F,e=z-t,r=w-F,G=p-t;return x*x+e*e>r*r+G*G&&(j=w,z=p),{cx:j,cy:z,x01:-n,y01:-d,x11:j*(v/T-1),y11:z*(v/T-1)}}function hn(){var l=cn,h=yn,I=B(0),D=null,v=gn,A=dn,C=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-an,c=A.apply(this,arguments)-an,F=un(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(F>tn-y)a.moveTo(s*H(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*H(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=F,S=F,j=C.apply(this,arguments)/2,z=j>y&&(D?+D.apply(this,arguments):L(u*u+s*s)),w=_(un(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if(z>y){var G=sn(z/u*q(j)),M=sn(z/s*q(j));(P-=G*2)>y?(G*=t?1:-1,R+=G,T-=G):(P=0,R=T=(f+c)/2),(S-=M*2)>y?(M*=t?1:-1,m+=M,g-=M):(S=0,m=g=(f+c)/2)}var J=s*H(m),K=s*q(m),N=u*H(T),Q=u*q(T);if(w>y){var U=s*H(g),V=s*q(g),X=u*H(R),Y=u*q(R),E;if(F<rn)if(E=pn(J,K,X,Y,U,V,N,Q)){var Z=J-E[0],$=K-E[1],b=U-E[0],k=V-E[1],nn=1/q(on((Z*b+$*k)/(L(Z*Z+$*$)*L(b*b+k*k)))/2),en=L(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=W(X,Y,J,K,s,x,t),r=W(U,V,N,Q,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(J,K),a.arc(0,0,s,m,g,!t)):a.moveTo(J,K),!(u>y)||!(P>y)?a.lineTo(N,Q):p>y?(e=W(N,Q,U,V,u,-p,t),r=W(J,K,X,Y,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-rn/2;return[H(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:B(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:B(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:B(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:B(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:B(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:B(+n),i):A},i.padAngle=function(n){return arguments.length?(C=typeof n=="function"?n:B(+n),i):C},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};