watch-tail 0.1.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 (110) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +210 -0
  3. package/build/client/_app/immutable/assets/0.B1NsRRrX.css +2 -0
  4. package/build/client/_app/immutable/assets/0.B1NsRRrX.css.br +0 -0
  5. package/build/client/_app/immutable/assets/0.B1NsRRrX.css.gz +0 -0
  6. package/build/client/_app/immutable/chunks/Bjy-W4x2.js +81 -0
  7. package/build/client/_app/immutable/chunks/Bjy-W4x2.js.br +0 -0
  8. package/build/client/_app/immutable/chunks/Bjy-W4x2.js.gz +0 -0
  9. package/build/client/_app/immutable/chunks/DCKWcE8r.js +1 -0
  10. package/build/client/_app/immutable/chunks/DCKWcE8r.js.br +0 -0
  11. package/build/client/_app/immutable/chunks/DCKWcE8r.js.gz +0 -0
  12. package/build/client/_app/immutable/chunks/DDRhiz1-.js +1 -0
  13. package/build/client/_app/immutable/chunks/DDRhiz1-.js.br +0 -0
  14. package/build/client/_app/immutable/chunks/DDRhiz1-.js.gz +0 -0
  15. package/build/client/_app/immutable/chunks/ZAD2y5xJ.js +3 -0
  16. package/build/client/_app/immutable/chunks/ZAD2y5xJ.js.br +0 -0
  17. package/build/client/_app/immutable/chunks/ZAD2y5xJ.js.gz +0 -0
  18. package/build/client/_app/immutable/chunks/xihTtKlq.js +1 -0
  19. package/build/client/_app/immutable/chunks/xihTtKlq.js.br +1 -0
  20. package/build/client/_app/immutable/chunks/xihTtKlq.js.gz +0 -0
  21. package/build/client/_app/immutable/entry/app.DIoggGwf.js +2 -0
  22. package/build/client/_app/immutable/entry/app.DIoggGwf.js.br +0 -0
  23. package/build/client/_app/immutable/entry/app.DIoggGwf.js.gz +0 -0
  24. package/build/client/_app/immutable/entry/start._YXgjuSB.js +1 -0
  25. package/build/client/_app/immutable/entry/start._YXgjuSB.js.br +0 -0
  26. package/build/client/_app/immutable/entry/start._YXgjuSB.js.gz +0 -0
  27. package/build/client/_app/immutable/nodes/0.D5bYt7iX.js +1 -0
  28. package/build/client/_app/immutable/nodes/0.D5bYt7iX.js.br +0 -0
  29. package/build/client/_app/immutable/nodes/0.D5bYt7iX.js.gz +0 -0
  30. package/build/client/_app/immutable/nodes/1.DBX83mYX.js +1 -0
  31. package/build/client/_app/immutable/nodes/1.DBX83mYX.js.br +0 -0
  32. package/build/client/_app/immutable/nodes/1.DBX83mYX.js.gz +0 -0
  33. package/build/client/_app/immutable/nodes/2.DiH-2moC.js +5 -0
  34. package/build/client/_app/immutable/nodes/2.DiH-2moC.js.br +0 -0
  35. package/build/client/_app/immutable/nodes/2.DiH-2moC.js.gz +0 -0
  36. package/build/client/_app/version.json +1 -0
  37. package/build/client/_app/version.json.br +0 -0
  38. package/build/client/_app/version.json.gz +0 -0
  39. package/build/client/robots.txt +3 -0
  40. package/build/client/robots.txt.br +0 -0
  41. package/build/client/robots.txt.gz +0 -0
  42. package/build/env.js +70 -0
  43. package/build/env.js.map +1 -0
  44. package/build/handler.js +24 -0
  45. package/build/handler.js.map +1 -0
  46. package/build/index.js +147 -0
  47. package/build/index.js.map +1 -0
  48. package/build/server/chunks/chunks/env.js-l0sNRNKZ.js +2 -0
  49. package/build/server/chunks/chunks/env.js-l0sNRNKZ.js.map +1 -0
  50. package/build/server/chunks/chunks/env2.js-D7xrfc37.js +316 -0
  51. package/build/server/chunks/chunks/env2.js-D7xrfc37.js.map +1 -0
  52. package/build/server/chunks/chunks/exports.js-CvFPPbaH.js +263 -0
  53. package/build/server/chunks/chunks/exports.js-CvFPPbaH.js.map +1 -0
  54. package/build/server/chunks/chunks/internal.js-DdmUz1r3.js +1191 -0
  55. package/build/server/chunks/chunks/internal.js-DdmUz1r3.js.map +1 -0
  56. package/build/server/chunks/chunks/internal2.js-DZ8ZzzjN.js +22 -0
  57. package/build/server/chunks/chunks/internal2.js-DZ8ZzzjN.js.map +1 -0
  58. package/build/server/chunks/chunks/regions.js-IQPMyP5C.js +52 -0
  59. package/build/server/chunks/chunks/regions.js-IQPMyP5C.js.map +1 -0
  60. package/build/server/chunks/chunks/server.js-ByNB8uti.js +3659 -0
  61. package/build/server/chunks/chunks/server.js-ByNB8uti.js.map +1 -0
  62. package/build/server/chunks/chunks/shared-server.js-Dn5XheXH.js +22 -0
  63. package/build/server/chunks/chunks/shared-server.js-Dn5XheXH.js.map +1 -0
  64. package/build/server/chunks/chunks/shared.js-CgjUIvRK.js +776 -0
  65. package/build/server/chunks/chunks/shared.js-CgjUIvRK.js.map +1 -0
  66. package/build/server/chunks/chunks/state.js-ClLTNPGs.js +86 -0
  67. package/build/server/chunks/chunks/state.js-ClLTNPGs.js.map +1 -0
  68. package/build/server/chunks/chunks/time-range.js-BLMT8aU3.js +102 -0
  69. package/build/server/chunks/chunks/time-range.js-BLMT8aU3.js.map +1 -0
  70. package/build/server/chunks/chunks/uneval.js-DaakSYFQ.js +488 -0
  71. package/build/server/chunks/chunks/uneval.js-DaakSYFQ.js.map +1 -0
  72. package/build/server/chunks/chunks/utils.js-BIlHjgGW.js +933 -0
  73. package/build/server/chunks/chunks/utils.js-BIlHjgGW.js.map +1 -0
  74. package/build/server/chunks/entries/endpoints/api/health/_server.ts.js-aiNZfkco.js +41 -0
  75. package/build/server/chunks/entries/endpoints/api/health/_server.ts.js-aiNZfkco.js.map +1 -0
  76. package/build/server/chunks/entries/endpoints/api/log-groups/_server.ts.js-D143-vRl.js +120 -0
  77. package/build/server/chunks/entries/endpoints/api/log-groups/_server.ts.js-D143-vRl.js.map +1 -0
  78. package/build/server/chunks/entries/endpoints/api/regions/_server.ts.js-CDNL7msU.js +88 -0
  79. package/build/server/chunks/entries/endpoints/api/regions/_server.ts.js-CDNL7msU.js.map +1 -0
  80. package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-D_i-xW6_.js +610 -0
  81. package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-D_i-xW6_.js.map +1 -0
  82. package/build/server/chunks/entries/fallbacks/error.svelte.js-qFLa8EVy.js +17 -0
  83. package/build/server/chunks/entries/fallbacks/error.svelte.js-qFLa8EVy.js.map +1 -0
  84. package/build/server/chunks/entries/pages/_layout.svelte.js-Bx7lXkAi.js +22 -0
  85. package/build/server/chunks/entries/pages/_layout.svelte.js-Bx7lXkAi.js.map +1 -0
  86. package/build/server/chunks/entries/pages/_page.svelte.js-BsvaKqbk.js +1264 -0
  87. package/build/server/chunks/entries/pages/_page.svelte.js-BsvaKqbk.js.map +1 -0
  88. package/build/server/chunks/handler-nVqa-QPz.js +1735 -0
  89. package/build/server/chunks/handler-nVqa-QPz.js.map +1 -0
  90. package/build/server/chunks/index.js-CtbhHm7L.js +3803 -0
  91. package/build/server/chunks/index.js-CtbhHm7L.js.map +1 -0
  92. package/build/server/chunks/manifest.js-BwUys8gK.js +70 -0
  93. package/build/server/chunks/manifest.js-BwUys8gK.js.map +1 -0
  94. package/build/server/chunks/nodes/0.js-Dl0J9d3p.js +9 -0
  95. package/build/server/chunks/nodes/0.js-Dl0J9d3p.js.map +1 -0
  96. package/build/server/chunks/nodes/1.js-dXZVW92o.js +9 -0
  97. package/build/server/chunks/nodes/1.js-dXZVW92o.js.map +1 -0
  98. package/build/server/chunks/nodes/2.js-aMMUenQc.js +9 -0
  99. package/build/server/chunks/nodes/2.js-aMMUenQc.js.map +1 -0
  100. package/build/shims.js +33 -0
  101. package/build/shims.js.map +1 -0
  102. package/dist/cli/bin.js +9 -0
  103. package/dist/cli/completions.js +99 -0
  104. package/dist/cli/index.js +183 -0
  105. package/dist/cli/options.js +171 -0
  106. package/dist/cli/server.js +126 -0
  107. package/dist/cli/ui.js +75 -0
  108. package/dist/lib/cli/aws.js +264 -0
  109. package/dist/lib/time-range.js +106 -0
  110. package/package.json +106 -0
@@ -0,0 +1,70 @@
1
+ const manifest = (() => {
2
+ function __memo(fn) {
3
+ let value;
4
+ return () => value ??= (value = fn());
5
+ }
6
+
7
+ return {
8
+ appDir: "_app",
9
+ appPath: "_app",
10
+ assets: new Set(["robots.txt"]),
11
+ mimeTypes: {".txt":"text/plain"},
12
+ _: {
13
+ client: {start:"_app/immutable/entry/start._YXgjuSB.js",app:"_app/immutable/entry/app.DIoggGwf.js",imports:["_app/immutable/entry/start._YXgjuSB.js","_app/immutable/chunks/DDRhiz1-.js","_app/immutable/chunks/ZAD2y5xJ.js","_app/immutable/entry/app.DIoggGwf.js","_app/immutable/chunks/ZAD2y5xJ.js","_app/immutable/chunks/xihTtKlq.js"],stylesheets:[],fonts:[],uses_env_dynamic_public:false},
14
+ nodes: [
15
+ __memo(() => import('./nodes/0.js-Dl0J9d3p.js')),
16
+ __memo(() => import('./nodes/1.js-dXZVW92o.js')),
17
+ __memo(() => import('./nodes/2.js-aMMUenQc.js'))
18
+ ],
19
+ remotes: {
20
+
21
+ },
22
+ routes: [
23
+ {
24
+ id: "/",
25
+ pattern: /^\/$/,
26
+ params: [],
27
+ page: { layouts: [0,], errors: [1,], leaf: 2 },
28
+ endpoint: null
29
+ },
30
+ {
31
+ id: "/api/health",
32
+ pattern: /^\/api\/health\/?$/,
33
+ params: [],
34
+ page: null,
35
+ endpoint: __memo(() => import('./entries/endpoints/api/health/_server.ts.js-aiNZfkco.js'))
36
+ },
37
+ {
38
+ id: "/api/log-groups",
39
+ pattern: /^\/api\/log-groups\/?$/,
40
+ params: [],
41
+ page: null,
42
+ endpoint: __memo(() => import('./entries/endpoints/api/log-groups/_server.ts.js-D143-vRl.js'))
43
+ },
44
+ {
45
+ id: "/api/regions",
46
+ pattern: /^\/api\/regions\/?$/,
47
+ params: [],
48
+ page: null,
49
+ endpoint: __memo(() => import('./entries/endpoints/api/regions/_server.ts.js-CDNL7msU.js'))
50
+ },
51
+ {
52
+ id: "/api/stream",
53
+ pattern: /^\/api\/stream\/?$/,
54
+ params: [],
55
+ page: null,
56
+ endpoint: __memo(() => import('./entries/endpoints/api/stream/_server.ts.js-D_i-xW6_.js'))
57
+ }
58
+ ],
59
+ prerendered_routes: new Set([]),
60
+ matchers: async () => {
61
+
62
+ return { };
63
+ },
64
+ server_assets: {}
65
+ }
66
+ }
67
+ })();
68
+
69
+ export { manifest as m };
70
+ //# sourceMappingURL=manifest.js-BwUys8gK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js-BwUys8gK.js","sources":["../../../.svelte-kit/output/server/manifest.js"],"sourcesContent":["export const manifest = (() => {\nfunction __memo(fn) {\n\tlet value;\n\treturn () => value ??= (value = fn());\n}\n\nreturn {\n\tappDir: \"_app\",\n\tappPath: \"_app\",\n\tassets: new Set([\"robots.txt\"]),\n\tmimeTypes: {\".txt\":\"text/plain\"},\n\t_: {\n\t\tclient: {start:\"_app/immutable/entry/start._YXgjuSB.js\",app:\"_app/immutable/entry/app.DIoggGwf.js\",imports:[\"_app/immutable/entry/start._YXgjuSB.js\",\"_app/immutable/chunks/DDRhiz1-.js\",\"_app/immutable/chunks/ZAD2y5xJ.js\",\"_app/immutable/entry/app.DIoggGwf.js\",\"_app/immutable/chunks/ZAD2y5xJ.js\",\"_app/immutable/chunks/xihTtKlq.js\"],stylesheets:[],fonts:[],uses_env_dynamic_public:false},\n\t\tnodes: [\n\t\t\t__memo(() => import('./nodes/0.js')),\n\t\t\t__memo(() => import('./nodes/1.js')),\n\t\t\t__memo(() => import('./nodes/2.js'))\n\t\t],\n\t\tremotes: {\n\t\t\t\n\t\t},\n\t\troutes: [\n\t\t\t{\n\t\t\t\tid: \"/\",\n\t\t\t\tpattern: /^\\/$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 2 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/health\",\n\t\t\t\tpattern: /^\\/api\\/health\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/health/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/log-groups\",\n\t\t\t\tpattern: /^\\/api\\/log-groups\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/log-groups/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/regions\",\n\t\t\t\tpattern: /^\\/api\\/regions\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/regions/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/stream\",\n\t\t\t\tpattern: /^\\/api\\/stream\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/stream/_server.ts.js'))\n\t\t\t}\n\t\t],\n\t\tprerendered_routes: new Set([]),\n\t\tmatchers: async () => {\n\t\t\t\n\t\t\treturn { };\n\t\t},\n\t\tserver_assets: {}\n\t}\n}\n})();\n"],"names":[],"mappings":"AAAY,MAAC,QAAQ,GAAG,CAAC,MAAM;AAC/B,SAAS,MAAM,CAAC,EAAE,EAAE;AACpB,CAAC,IAAI,KAAK;AACV,CAAC,OAAO,MAAM,KAAK,MAAM,KAAK,GAAG,EAAE,EAAE,CAAC;AACtC;;AAEA,OAAO;AACP,CAAC,MAAM,EAAE,MAAM;AACf,CAAC,OAAO,EAAE,MAAM;AAChB,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;AAChC,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;AACjC,CAAC,CAAC,EAAE;AACJ,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,wCAAwC,CAAC,GAAG,CAAC,sCAAsC,CAAC,OAAO,CAAC,CAAC,wCAAwC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,sCAAsC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC;AACrY,EAAE,KAAK,EAAE;AACT,GAAG,MAAM,CAAC,MAAM,OAAO,0BAAc,CAAC,CAAC;AACvC,GAAG,MAAM,CAAC,MAAM,OAAO,0BAAc,CAAC,CAAC;AACvC,GAAG,MAAM,CAAC,MAAM,OAAO,0BAAc,CAAC;AACtC,GAAG;AACH,EAAE,OAAO,EAAE;AACX;AACA,GAAG;AACH,EAAE,MAAM,EAAE;AACV,GAAG;AACH,IAAI,EAAE,EAAE,GAAG;AACX,IAAI,OAAO,EAAE,MAAM;AACnB,IAAI,MAAM,EAAE,EAAE;AACd,IAAI,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;AAClD,IAAI,QAAQ,EAAE;AACd,IAAI;AACJ,GAAG;AACH,IAAI,EAAE,EAAE,aAAa;AACrB,IAAI,OAAO,EAAE,oBAAoB;AACjC,IAAI,MAAM,EAAE,EAAE;AACd,IAAI,IAAI,EAAE,IAAI;AACd,IAAI,QAAQ,EAAE,MAAM,CAAC,MAAM,OAAO,0DAA8C,CAAC;AACjF,IAAI;AACJ,GAAG;AACH,IAAI,EAAE,EAAE,iBAAiB;AACzB,IAAI,OAAO,EAAE,wBAAwB;AACrC,IAAI,MAAM,EAAE,EAAE;AACd,IAAI,IAAI,EAAE,IAAI;AACd,IAAI,QAAQ,EAAE,MAAM,CAAC,MAAM,OAAO,8DAAkD,CAAC;AACrF,IAAI;AACJ,GAAG;AACH,IAAI,EAAE,EAAE,cAAc;AACtB,IAAI,OAAO,EAAE,qBAAqB;AAClC,IAAI,MAAM,EAAE,EAAE;AACd,IAAI,IAAI,EAAE,IAAI;AACd,IAAI,QAAQ,EAAE,MAAM,CAAC,MAAM,OAAO,2DAA+C,CAAC;AAClF,IAAI;AACJ,GAAG;AACH,IAAI,EAAE,EAAE,aAAa;AACrB,IAAI,OAAO,EAAE,oBAAoB;AACjC,IAAI,MAAM,EAAE,EAAE;AACd,IAAI,IAAI,EAAE,IAAI;AACd,IAAI,QAAQ,EAAE,MAAM,CAAC,MAAM,OAAO,0DAA8C,CAAC;AACjF;AACA,GAAG;AACH,EAAE,kBAAkB,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;AACjC,EAAE,QAAQ,EAAE,YAAY;AACxB;AACA,GAAG,OAAO,IAAI;AACd,EAAE,CAAC;AACH,EAAE,aAAa,EAAE;AACjB;AACA;AACA,CAAC;;"}
@@ -0,0 +1,9 @@
1
+ const index = 0;
2
+ let component_cache;
3
+ const component = async () => component_cache ??= (await import('../entries/pages/_layout.svelte.js-Bx7lXkAi.js')).default;
4
+ const imports = ["_app/immutable/nodes/0.D5bYt7iX.js","_app/immutable/chunks/ZAD2y5xJ.js","_app/immutable/chunks/xihTtKlq.js"];
5
+ const stylesheets = ["_app/immutable/assets/0.B1NsRRrX.css"];
6
+ const fonts = [];
7
+
8
+ export { component, fonts, imports, index, stylesheets };
9
+ //# sourceMappingURL=0.js-Dl0J9d3p.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"0.js-Dl0J9d3p.js","sources":["../../../../.svelte-kit/output/server/nodes/0.js"],"sourcesContent":["\n\nexport const index = 0;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/_layout.svelte.js')).default;\nexport const imports = [\"_app/immutable/nodes/0.D5bYt7iX.js\",\"_app/immutable/chunks/ZAD2y5xJ.js\",\"_app/immutable/chunks/xihTtKlq.js\"];\nexport const stylesheets = [\"_app/immutable/assets/0.B1NsRRrX.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":"AAEY,MAAC,KAAK,GAAG;AACrB,IAAI,eAAe;AACP,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,gDAAoC,CAAC,EAAE;AAClG,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,mCAAmC,CAAC,mCAAmC;AACxH,MAAC,WAAW,GAAG,CAAC,sCAAsC;AACtD,MAAC,KAAK,GAAG;;"}
@@ -0,0 +1,9 @@
1
+ const index = 1;
2
+ let component_cache;
3
+ const component = async () => component_cache ??= (await import('../entries/fallbacks/error.svelte.js-qFLa8EVy.js')).default;
4
+ const imports = ["_app/immutable/nodes/1.DBX83mYX.js","_app/immutable/chunks/ZAD2y5xJ.js","_app/immutable/chunks/xihTtKlq.js","_app/immutable/chunks/DCKWcE8r.js","_app/immutable/chunks/DDRhiz1-.js"];
5
+ const stylesheets = [];
6
+ const fonts = [];
7
+
8
+ export { component, fonts, imports, index, stylesheets };
9
+ //# sourceMappingURL=1.js-dXZVW92o.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"1.js-dXZVW92o.js","sources":["../../../../.svelte-kit/output/server/nodes/1.js"],"sourcesContent":["\n\nexport const index = 1;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/fallbacks/error.svelte.js')).default;\nexport const imports = [\"_app/immutable/nodes/1.DBX83mYX.js\",\"_app/immutable/chunks/ZAD2y5xJ.js\",\"_app/immutable/chunks/xihTtKlq.js\",\"_app/immutable/chunks/DCKWcE8r.js\",\"_app/immutable/chunks/DDRhiz1-.js\"];\nexport const stylesheets = [];\nexport const fonts = [];\n"],"names":[],"mappings":"AAEY,MAAC,KAAK,GAAG;AACrB,IAAI,eAAe;AACP,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,kDAAsC,CAAC,EAAE;AACpG,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC;AAChM,MAAC,WAAW,GAAG;AACf,MAAC,KAAK,GAAG;;"}
@@ -0,0 +1,9 @@
1
+ const index = 2;
2
+ let component_cache;
3
+ const component = async () => component_cache ??= (await import('../entries/pages/_page.svelte.js-BsvaKqbk.js')).default;
4
+ const imports = ["_app/immutable/nodes/2.DiH-2moC.js","_app/immutable/chunks/ZAD2y5xJ.js","_app/immutable/chunks/DDRhiz1-.js","_app/immutable/chunks/xihTtKlq.js","_app/immutable/chunks/DCKWcE8r.js"];
5
+ const stylesheets = [];
6
+ const fonts = [];
7
+
8
+ export { component, fonts, imports, index, stylesheets };
9
+ //# sourceMappingURL=2.js-aMMUenQc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"2.js-aMMUenQc.js","sources":["../../../../.svelte-kit/output/server/nodes/2.js"],"sourcesContent":["\n\nexport const index = 2;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/_page.svelte.js')).default;\nexport const imports = [\"_app/immutable/nodes/2.DiH-2moC.js\",\"_app/immutable/chunks/ZAD2y5xJ.js\",\"_app/immutable/chunks/DDRhiz1-.js\",\"_app/immutable/chunks/xihTtKlq.js\",\"_app/immutable/chunks/DCKWcE8r.js\"];\nexport const stylesheets = [];\nexport const fonts = [];\n"],"names":[],"mappings":"AAEY,MAAC,KAAK,GAAG;AACrB,IAAI,eAAe;AACP,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,8CAAkC,CAAC,EAAE;AAChG,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC;AAChM,MAAC,WAAW,GAAG;AACf,MAAC,KAAK,GAAG;;"}
package/build/shims.js ADDED
@@ -0,0 +1,33 @@
1
+ import buffer from 'node:buffer';
2
+ import { webcrypto } from 'node:crypto';
3
+
4
+ // `buffer.File` was added in Node 18.13.0 while the `File` global was added in Node 20.0.0
5
+ const File = /** @type {import('node:buffer') & { File?: File}} */ (buffer).File;
6
+
7
+ /** @type {Record<string, any>} */
8
+ const globals = {
9
+ crypto: webcrypto,
10
+ File
11
+ };
12
+
13
+ // exported for dev/preview and node environments
14
+ /**
15
+ * Make various web APIs available as globals:
16
+ * - `crypto`
17
+ * - `File`
18
+ */
19
+ function installPolyfills() {
20
+ for (const name in globals) {
21
+ if (name in globalThis) continue;
22
+
23
+ Object.defineProperty(globalThis, name, {
24
+ enumerable: true,
25
+ configurable: true,
26
+ writable: true,
27
+ value: globals[name]
28
+ });
29
+ }
30
+ }
31
+
32
+ installPolyfills();
33
+ //# sourceMappingURL=shims.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shims.js","sources":["../node_modules/.pnpm/@sveltejs+kit@2.70.3_@sveltejs+vite-plugin-svelte@7.3.0_svelte@5.57.0_vite@8.2.2_@types_ab6e39593f61aae0ad0b9a1bac6935c7/node_modules/@sveltejs/kit/src/exports/node/polyfills.js","../.svelte-kit/adapter-node/entries/shims.js"],"sourcesContent":["import buffer from 'node:buffer';\nimport { webcrypto as crypto } from 'node:crypto';\n\n// `buffer.File` was added in Node 18.13.0 while the `File` global was added in Node 20.0.0\nconst File = /** @type {import('node:buffer') & { File?: File}} */ (buffer).File;\n\n/** @type {Record<string, any>} */\nconst globals = {\n\tcrypto,\n\tFile\n};\n\n// exported for dev/preview and node environments\n/**\n * Make various web APIs available as globals:\n * - `crypto`\n * - `File`\n */\nexport function installPolyfills() {\n\tfor (const name in globals) {\n\t\tif (name in globalThis) continue;\n\n\t\tObject.defineProperty(globalThis, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true,\n\t\t\tvalue: globals[name]\n\t\t});\n\t}\n}\n","import { installPolyfills } from '@sveltejs/kit/node/polyfills';\n\ninstallPolyfills();\n"],"names":["crypto"],"mappings":";;;AAGA;AACA,MAAM,IAAI,yDAAyD,CAAC,MAAM,EAAE,IAAI;;AAEhF;AACA,MAAM,OAAO,GAAG;AAChB,SAACA,SAAM;AACP,CAAC;AACD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,gBAAgB,GAAG;AACnC,CAAC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE;AAC7B,EAAE,IAAI,IAAI,IAAI,UAAU,EAAE;;AAE1B,EAAE,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE;AAC1C,GAAG,UAAU,EAAE,IAAI;AACnB,GAAG,YAAY,EAAE,IAAI;AACrB,GAAG,QAAQ,EAAE,IAAI;AACjB,GAAG,KAAK,EAAE,OAAO,CAAC,IAAI;AACtB,GAAG,CAAC;AACJ,CAAC;AACD;;AC3BA,gBAAgB,EAAE","x_google_ignoreList":[0]}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Executable entry point for `watch-tail`.
4
+ *
5
+ * Kept separate from {@link ./index.ts} so the module can be imported (by tests)
6
+ * without running anything.
7
+ */
8
+ import { main } from "./index.js";
9
+ void main();
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Shell completions, powered by `@bomb.sh/tab`.
3
+ *
4
+ * `watch-tail complete <shell>` prints the script to source, and
5
+ * `watch-tail complete -- <words>` answers the protocol that script drives. Both
6
+ * paths are dispatched before normal flag parsing.
7
+ */
8
+ import t from '@bomb.sh/tab';
9
+ import { HISTORIC_PRESETS } from "../lib/time-range.js";
10
+ import { DEFAULT_HOST, DEFAULT_PORT, FLOCI_ENDPOINT } from "./options.js";
11
+ /** Shells `tab` can generate scripts for. */
12
+ export const SHELLS = ['zsh', 'bash', 'fish', 'powershell'];
13
+ /** Program name used in generated completion scripts. */
14
+ export const PROGRAM = 'watch-tail';
15
+ /** Regions offered for `--region`; the long tail lives in `$lib/regions.ts`. */
16
+ const COMMON_REGIONS = [
17
+ 'us-east-1',
18
+ 'us-east-2',
19
+ 'us-west-1',
20
+ 'us-west-2',
21
+ 'eu-west-1',
22
+ 'eu-west-2',
23
+ 'eu-central-1',
24
+ 'ap-south-1',
25
+ 'ap-southeast-1',
26
+ 'ap-southeast-2',
27
+ 'ap-northeast-1',
28
+ 'af-south-1',
29
+ 'sa-east-1',
30
+ ];
31
+ /**
32
+ * Declares the CLI structure for `tab`.
33
+ *
34
+ * Safe to call repeatedly: `tab` merges commands and options into one root.
35
+ */
36
+ function registerCompletionSpec(profiles = []) {
37
+ t.option('profile', 'AWS profile to use', function (complete) {
38
+ if (profiles.length === 0)
39
+ complete('default', 'default profile');
40
+ for (const name of profiles)
41
+ complete(name, 'AWS profile');
42
+ }, 'p');
43
+ t.option('region', 'Region to open on', function (complete) {
44
+ for (const region of COMMON_REGIONS)
45
+ complete(region, 'AWS region');
46
+ }, 'r');
47
+ t.option('endpoint', 'Emulator endpoint instead of AWS', function (complete) {
48
+ complete(FLOCI_ENDPOINT, 'floci');
49
+ complete('http://localhost:4566', 'LocalStack');
50
+ });
51
+ t.option('floci', 'Shorthand for --endpoint ' + FLOCI_ENDPOINT);
52
+ t.option('port', 'Port for the local UI', function (complete) {
53
+ complete(String(DEFAULT_PORT), 'default');
54
+ complete('5173', 'Vite default');
55
+ });
56
+ t.option('host', 'Interface to bind', function (complete) {
57
+ complete(DEFAULT_HOST, 'loopback only');
58
+ complete('0.0.0.0', 'all interfaces (exposes your AWS access)');
59
+ });
60
+ t.option('no-open', 'Do not open a browser window');
61
+ t.option('print', 'Print the environment and exit');
62
+ t.option('list', 'List AWS profiles and exit');
63
+ t.option('verbose', 'Log the server output');
64
+ t.option('help', 'Show help', undefined, 'h');
65
+ t.option('version', 'Show the version', undefined, 'v');
66
+ const complete = t.command('complete', 'Print a shell completion script');
67
+ complete.argument('shell', function (emit) {
68
+ for (const shell of SHELLS)
69
+ emit(shell, `${shell} completion script`);
70
+ });
71
+ // Historic window presets are useful for any future flag that takes a range.
72
+ t.command('presets', `Historic ranges: ${HISTORIC_PRESETS.join(', ')}`);
73
+ }
74
+ /**
75
+ * Handles `complete ...`.
76
+ *
77
+ * Returns the exit code for the CLI, or `null` when the words are not a
78
+ * completion request at all.
79
+ */
80
+ export function handleCompletion(words, executable = PROGRAM) {
81
+ if (words.length === 0)
82
+ return null;
83
+ const [first, ...rest] = words;
84
+ registerCompletionSpec();
85
+ if (first === '--') {
86
+ t.parse(rest);
87
+ return 0;
88
+ }
89
+ if (SHELLS.includes(first)) {
90
+ // `tab` prints the script; `executable` is how the shell re-invokes us.
91
+ t.setup(PROGRAM, executable, first);
92
+ return 0;
93
+ }
94
+ return null;
95
+ }
96
+ /** The completion script for a shell, for tests and docs. */
97
+ export function completionScript(shell, executable = PROGRAM) {
98
+ t.setup(PROGRAM, executable, shell);
99
+ }
@@ -0,0 +1,183 @@
1
+ /**
2
+ * `watch-tail` entry point.
3
+ *
4
+ * Responsibilities are deliberately thin: parse, resolve the AWS context, start
5
+ * the packaged server, wait for it to answer, open a browser and translate
6
+ * signals into an exit code. Everything with behaviour worth testing lives in
7
+ * {@link ./options.ts}, {@link ./server.ts}, {@link ./ui.ts} or
8
+ * `$lib/cli/aws.ts`, and the side effects are injectable through {@link CliIo}.
9
+ */
10
+ import { spawn } from 'node:child_process';
11
+ import { readFileSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ import { buildChildEnv, describeChildEnv, isEmulatorEndpoint, isLocalEnvPresent, readConfigText, readProfiles, resolveRunRegion, signalExitCode, } from "../lib/cli/aws.js";
14
+ import { handleCompletion } from "./completions.js";
15
+ import { isLoopbackHost, parseCliArgs, usageText } from "./options.js";
16
+ import { appRootFromHere, healthUrl, openBrowser as openBrowserDefault, startServer, stopServer, uiUrl, waitForHealth, } from "./server.js";
17
+ import { createUi, isInteractive } from "./ui.js";
18
+ /** Reads the version from the package manifest next to the app root. */
19
+ export function readVersion(appRoot) {
20
+ const fallback = '0.0.0';
21
+ if (appRoot === null)
22
+ return fallback;
23
+ try {
24
+ const manifest = JSON.parse(readFileSync(join(appRoot, 'package.json'), 'utf8'));
25
+ if (typeof manifest === 'object' && manifest !== null && 'version' in manifest) {
26
+ const version = manifest.version;
27
+ if (typeof version === 'string' && version.length > 0)
28
+ return version;
29
+ }
30
+ }
31
+ catch {
32
+ // A missing or unreadable manifest is not worth failing over.
33
+ }
34
+ return fallback;
35
+ }
36
+ /** Waits for SIGINT/SIGTERM, or for the server to exit on its own. */
37
+ function waitForStop(child) {
38
+ return new Promise((resolveExit) => {
39
+ let stopping = false;
40
+ const stop = () => {
41
+ if (stopping) {
42
+ // A second signal means the server is stuck: stop it hard.
43
+ child.kill('SIGKILL');
44
+ return;
45
+ }
46
+ stopping = true;
47
+ void stopServer(child).then(resolveExit);
48
+ };
49
+ process.on('SIGINT', stop);
50
+ process.on('SIGTERM', stop);
51
+ process.on('exit', () => {
52
+ if (child.exitCode === null && child.signalCode === null)
53
+ child.kill('SIGKILL');
54
+ });
55
+ child.on('close', (code, signal) => resolveExit(code ?? signalExitCode(signal)));
56
+ });
57
+ }
58
+ /** Real process environment for the CLI. */
59
+ function defaultIo() {
60
+ const appRoot = appRootFromHere();
61
+ return {
62
+ stdout: (line) => console.log(line),
63
+ stderr: (line) => console.error(line),
64
+ env: process.env,
65
+ interactive: isInteractive(),
66
+ readProfiles: () => readProfiles(),
67
+ readConfigText: () => readConfigText(),
68
+ appRoot,
69
+ version: readVersion(appRoot),
70
+ openBrowser: (url) => openBrowserDefault(url),
71
+ waitForHealth,
72
+ startServerImpl: startServer,
73
+ spawnImpl: spawn,
74
+ waitForStop,
75
+ };
76
+ }
77
+ /** Region for this run: explicit flag, then the shell, then the profile. */
78
+ export function resolveCliRegion(options, io) {
79
+ const resolved = resolveRunRegion({
80
+ region: options.region,
81
+ profile: options.profile,
82
+ base: io.env,
83
+ configText: io.readConfigText(),
84
+ });
85
+ if (resolved !== null)
86
+ return resolved;
87
+ // Emulator data is written per region and the demo fixtures live in us-east-1,
88
+ // so a local run that resolves nothing opens on the seeded region.
89
+ if (options.endpoint !== null && isEmulatorEndpoint(options.endpoint))
90
+ return 'us-east-1';
91
+ return null;
92
+ }
93
+ /** Runs the CLI and returns its exit code. */
94
+ export async function run(argv, overrides = {}) {
95
+ const io = { ...defaultIo(), ...overrides };
96
+ const parsed = parseCliArgs(argv);
97
+ if (!parsed.ok) {
98
+ io.stderr(parsed.error);
99
+ io.stderr(usageText());
100
+ return 2;
101
+ }
102
+ const options = parsed.options;
103
+ if (options.complete !== null) {
104
+ const code = handleCompletion(options.complete);
105
+ if (code !== null)
106
+ return code;
107
+ }
108
+ if (options.help) {
109
+ io.stdout(usageText());
110
+ return 0;
111
+ }
112
+ if (options.version) {
113
+ io.stdout(io.version);
114
+ return 0;
115
+ }
116
+ if (options.list) {
117
+ const profiles = io.readProfiles();
118
+ for (const name of profiles)
119
+ io.stdout(name);
120
+ if (profiles.length === 0) {
121
+ io.stderr('No profiles found in ~/.aws/config or ~/.aws/credentials.');
122
+ }
123
+ return 0;
124
+ }
125
+ const region = resolveCliRegion(options, io);
126
+ const childEnv = buildChildEnv({
127
+ base: io.env,
128
+ profile: options.profile,
129
+ region,
130
+ endpoint: options.endpoint,
131
+ });
132
+ if (options.print) {
133
+ for (const line of describeChildEnv(childEnv))
134
+ io.stdout(line);
135
+ return 0;
136
+ }
137
+ if (io.appRoot === null) {
138
+ io.stderr('Could not find the built app (build/index.js). Run `pnpm build` first.');
139
+ return 1;
140
+ }
141
+ const ui = io.ui ?? createUi({ interactive: io.interactive });
142
+ const url = uiUrl(options.host, options.port);
143
+ ui.intro('watch-tail - CloudWatch Logs in your browser');
144
+ if (options.endpoint !== null) {
145
+ ui.info(`endpoint ${options.endpoint} (local emulator)`);
146
+ }
147
+ else if (options.profile !== null) {
148
+ ui.info(`profile ${options.profile}`);
149
+ }
150
+ if (region !== null)
151
+ ui.info(`region ${region}`);
152
+ if (!isLoopbackHost(options.host)) {
153
+ ui.warn(`binding ${options.host}: the app has no authentication and uses your AWS access, so anyone who can reach it can read your logs`);
154
+ }
155
+ if (isLocalEnvPresent(io.appRoot) && options.profile !== null) {
156
+ ui.warn('a .env.local with local emulator settings was found; it is ignored for this run');
157
+ }
158
+ ui.startSpinner('starting the local UI...');
159
+ const child = io.startServerImpl({
160
+ appRoot: io.appRoot,
161
+ env: childEnv,
162
+ port: options.port,
163
+ host: options.host,
164
+ verbose: options.verbose,
165
+ });
166
+ const ready = await io.waitForHealth(healthUrl(url), { fetchImpl: fetch });
167
+ if (!ready) {
168
+ ui.failSpinner(`the server did not answer on ${url}`);
169
+ await stopServer(child);
170
+ return 1;
171
+ }
172
+ ui.stopSpinner(`listening on ${url}`);
173
+ if (options.open)
174
+ io.openBrowser(url);
175
+ ui.outro(`${url} (Ctrl+C to stop)`);
176
+ const code = await io.waitForStop(child);
177
+ ui.outro('stopped');
178
+ return code;
179
+ }
180
+ /** Entry point used by `bin.ts`: runs the CLI and sets the exit code. */
181
+ export async function main(argv = process.argv.slice(2)) {
182
+ process.exitCode = await run(argv);
183
+ }
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Command-line surface of the `watch-tail` CLI.
3
+ *
4
+ * Parsing is pure so it can be unit tested: nothing here spawns a process or
5
+ * touches the network. {@link parseCliArgs} never throws - it returns a
6
+ * discriminated result the entry point turns into an exit code.
7
+ */
8
+ import { parse } from '@bomb.sh/args';
9
+ /** Port the local UI listens on unless `--port` is given. */
10
+ export const DEFAULT_PORT = 4517;
11
+ /** Loopback default: the app proxies your AWS permissions, so keep it local. */
12
+ export const DEFAULT_HOST = '127.0.0.1';
13
+ /** Local emulator the `--floci` shorthand points at. */
14
+ export const FLOCI_ENDPOINT = 'http://localhost:4566';
15
+ /** Flags accepted by the parser; anything else is reported as unknown. */
16
+ const KNOWN_FLAGS = new Set([
17
+ '_',
18
+ 'profile',
19
+ 'p',
20
+ 'region',
21
+ 'r',
22
+ 'port',
23
+ 'host',
24
+ 'endpoint',
25
+ 'floci',
26
+ 'open',
27
+ 'no-open',
28
+ 'print',
29
+ 'list',
30
+ 'help',
31
+ 'h',
32
+ 'version',
33
+ 'v',
34
+ 'verbose',
35
+ ]);
36
+ function asString(value) {
37
+ if (typeof value === 'string') {
38
+ const trimmed = value.trim();
39
+ return trimmed.length > 0 ? trimmed : null;
40
+ }
41
+ if (typeof value === 'number' && Number.isFinite(value))
42
+ return String(value);
43
+ return null;
44
+ }
45
+ function asFlag(value) {
46
+ return value === true || value === 'true';
47
+ }
48
+ /**
49
+ * Parses `watch-tail` arguments.
50
+ *
51
+ * Accepts `--flag value` and `--flag=value`, short aliases (`-p`, `-r`, `-h`,
52
+ * `-v`), and the boolean negations `--open` / `--no-open`.
53
+ */
54
+ export function parseCliArgs(argv) {
55
+ // `complete` is the shell-completion protocol, not a normal invocation. It is
56
+ // matched against the raw words so the literal `--` separating the two
57
+ // completion modes survives.
58
+ if (argv[0] === 'complete') {
59
+ return { ok: true, options: { ...defaults(), complete: argv.slice(1) } };
60
+ }
61
+ const words = argv.filter((word) => word !== '--');
62
+ let parsed;
63
+ try {
64
+ parsed = parse(words, {
65
+ alias: { p: 'profile', r: 'region', h: 'help', v: 'version' },
66
+ boolean: ['floci', 'open', 'no-open', 'print', 'list', 'help', 'version', 'verbose'],
67
+ string: ['profile', 'region', 'port', 'host', 'endpoint'],
68
+ default: { open: true },
69
+ });
70
+ }
71
+ catch (error) {
72
+ return { ok: false, error: error instanceof Error ? error.message : String(error) };
73
+ }
74
+ const unknown = Object.keys(parsed).filter((key) => !KNOWN_FLAGS.has(key));
75
+ if (unknown.length > 0) {
76
+ return { ok: false, error: `Unknown option "${unknown[0]}"` };
77
+ }
78
+ const positionals = Array.isArray(parsed._) ? parsed._ : [];
79
+ if (positionals.length > 0) {
80
+ return {
81
+ ok: false,
82
+ error: `Unexpected argument "${String(positionals[0])}". Run watch-tail --help for usage.`,
83
+ };
84
+ }
85
+ const portRaw = asString(parsed.port);
86
+ const port = portRaw === null ? DEFAULT_PORT : parsePortValue(portRaw);
87
+ if (port === null) {
88
+ return { ok: false, error: `Invalid --port "${portRaw}": expected 1-65535` };
89
+ }
90
+ const endpoint = asFlag(parsed.floci) ? FLOCI_ENDPOINT : asString(parsed.endpoint);
91
+ return {
92
+ ok: true,
93
+ options: {
94
+ profile: asString(parsed.profile),
95
+ region: asString(parsed.region),
96
+ port,
97
+ host: asString(parsed.host) ?? DEFAULT_HOST,
98
+ endpoint,
99
+ open: !asFlag(parsed['no-open']) && parsed.open !== false,
100
+ print: asFlag(parsed.print),
101
+ list: asFlag(parsed.list),
102
+ help: asFlag(parsed.help),
103
+ version: asFlag(parsed.version),
104
+ verbose: asFlag(parsed.verbose),
105
+ complete: null,
106
+ },
107
+ };
108
+ }
109
+ /** Defaults used by tests and by the `complete` short-circuit. */
110
+ export function defaults() {
111
+ return {
112
+ profile: null,
113
+ region: null,
114
+ port: DEFAULT_PORT,
115
+ host: DEFAULT_HOST,
116
+ endpoint: null,
117
+ open: true,
118
+ print: false,
119
+ list: false,
120
+ help: false,
121
+ version: false,
122
+ verbose: false,
123
+ complete: null,
124
+ };
125
+ }
126
+ /** Parses a port, returning `null` when it is not a usable TCP port. */
127
+ export function parsePortValue(value) {
128
+ const trimmed = value.trim();
129
+ if (!/^\d{1,5}$/.test(trimmed))
130
+ return null;
131
+ const port = Number(trimmed);
132
+ return port >= 1 && port <= 65535 ? port : null;
133
+ }
134
+ /** True when the host is loopback only. */
135
+ export function isLoopbackHost(host) {
136
+ return host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '[::1]';
137
+ }
138
+ /** Usage text shown by `--help` and after an argument error. */
139
+ export function usageText() {
140
+ return `watch-tail - tail CloudWatch Logs in your browser
141
+
142
+ Usage
143
+ watch-tail [options]
144
+
145
+ Options
146
+ -p, --profile <name> AWS profile to use (default: ambient credentials)
147
+ -r, --region <code> Region to open on (default: profile region, else AWS_REGION)
148
+ --endpoint <url> Point the app at a local emulator instead of AWS
149
+ --floci Shorthand for --endpoint ${FLOCI_ENDPOINT}
150
+ --port <number> Port for the local UI (default ${DEFAULT_PORT})
151
+ --host <address> Interface to bind (default ${DEFAULT_HOST}, loopback only)
152
+ --no-open Do not open a browser window
153
+ --print Print the environment that would be used, then exit
154
+ --list List the AWS profiles found on disk, then exit
155
+ --verbose Log the server's own output
156
+ -h, --help Show this help
157
+ -v, --version Show the version
158
+
159
+ Shell completions
160
+ watch-tail complete <shell> Print a completion script (zsh, bash, fish, powershell)
161
+ watch-tail complete -- <words> Completion protocol used by the generated script
162
+
163
+ Examples
164
+ npx watch-tail
165
+ npx watch-tail --profile my-profile --region eu-west-1
166
+ npx watch-tail --floci --port 4600 --no-open
167
+
168
+ The app streams whatever your ambient AWS credentials can read. Credentials are
169
+ resolved by the AWS SDK (SSO, shared config, environment, instance role); the CLI
170
+ never stores them.`;
171
+ }